理解show engine innodb status之LOG

来源:互联网 发布:上海旋转餐厅知乎 编辑:程序博客网 时间:2024/06/06 01:08
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);
0 0