您的位置:首页 > 其它

理解show engine innodb status之LOG

2016-11-23 14:30 495 查看
mysql版本:Ver 5.6.34-debug for Linux on x86_64 (Source distribution)

---

LOG

---

Log sequence number 1626037

Log flushed up to   1626037

Pages flushed up to 1626037

Last checkpoint at  1626037

0 pending log writes, 0 pending chkp writes

8 log i/o's done, 0.18 log i/o's/second

这里涉及到4个lsn的概念,先查看下该信息打印的函数

fprintf(file,

                "Log sequence number " LSN_PF "\n"

                "Log flushed up to   " LSN_PF "\n"

                "Pages flushed up to " LSN_PF "\n"

                "Last checkpoint at  " LSN_PF "\n",

                log_sys->lsn,

                log_sys->flushed_to_disk_lsn,

                log_buf_pool_get_oldest_modification(),

                log_sys->last_checkpoint_lsn);

由上述代码结合log_sys的数据结构注释可大概猜测到

Log sequence number表示的是redo log buffer中的lsn,表示事务写到redo log buffer中的字节总量,我为假设为A;

Log flushed up to表示的是redo log file中的lsn,表示事务写入到redo log file中字节总量,假设为B;

Pages flushed up to表示的缓冲池最旧脏页的lsn,由函数log_buf_pool_get_oldest_modification获取,假设为C;

lsn信息还会记录到每个redo的物理页中,在每个页的头部有个fil_page_lsn的变量存放当前页的lsn,表示该页最后刷新时的lsn号;下图中的Last checkpoint at 指的就是最近一个物理页刷新到磁盘时,它的fil_page_lsn的变量值,假设为D

0 pending log writes, 0 pending chkp writes

8 log i/o's done, 0.18 log i/o's/second

这里的时间间隔计算方式:上一次执行show engine innodb status到本次执行时所花的时间。

current_time = time(NULL);

        

        time_elapsed = difftime(current_time,

                                log_sys->last_printout_time);

数值的显示方法:

fprintf(file,

                "%lu pending log writes, %lu pending chkp writes\n"

                "%lu log i/o's done, %.2f log i/o's/second\n",

                (ulong) log_sys->n_pending_writes,

                (ulong) log_sys->n_pending_checkpoint_writes,

                (ulong) log_sys->n_log_ios,

                ((double)(log_sys->n_log_ios - log_sys->n_log_ios_old)

                 / time_elapsed));

                 

        log_sys->n_log_ios_old = log_sys->n_log_ios;

        log_sys->last_printout_time = current_time;

这里的log_sys是个全局变量,它的数据类型就是redo log buffer,涉及到这里显示部分,它的部分成员变量如下

n_pending_writes:当前正在异步写入当前redo log file组的数量

n_pending_checkpoint_writes:当前正在异步写入检查点值的数量

n_log_ios:db启动以来,redo log产生的IO次数

n_log_ios_old:db启动以来,直到上次执行show engine时的redo log产生的IO次数

大部分数值显示都是取自于log_sys全局变量的成员值(太复杂了,不会)

log_buf_pool_get_oldest_modification()实际调用了buf_pool_get_oldest_modification(void),大概的计算方式应该是轮询一次每个缓冲池的innodb_buffer_pool_instances所有instances,找出每个instance中最旧的脏页的lsn,返回所有中最小的lsn值,这个值也就是缓冲池中最旧的lsn

for (i = 0; i < srv_buf_pool_instances; i++) {

                buf_pool_t*     buf_pool;

                

                buf_pool = buf_pool_from_array(i);

                

                buf_flush_list_mutex_enter(buf_pool);

                

                bpage = UT_LIST_GET_LAST(buf_pool->flush_list);

                

                if (bpage != NULL) {

                        ut_ad(bpage->in_flush_list);

                        lsn = bpage->oldest_modification;

                }       

                

                buf_flush_list_mutex_exit(buf_pool);

                

                if (!oldest_lsn || oldest_lsn > lsn) {

                        oldest_lsn = lsn;

                }       

        }  

return(oldest_lsn);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: