注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

MYSQL IO统计实现  

来自江羽   2012-07-03 10:51:37|  分类: MySQL |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

  • Mysql slow log介绍

    熟悉mysql的朋友都知道,mysql有个slow log可以输出所有执行时间大于某个值(long_query_time)的事务信息到指定的文件或者表,通过分析slow log的信息可以很方便的查看哪个事务执行时间过长,从而对事务作出性能上分析,优化事务。与slow log相关的参数如下:

Variable name

Value

Comment

slow_query_log

ON/OFF

是否开启slow log统计

log_slow_queries

ON/OFF

早期版本,同slow_query_log

log_output

Table/file

Slow log 输出位置

slow_query_log_file

字符串路径

Slow log输出文件

long_query_time

浮点型值

Slow log的阈值,超过该值则记录

  • MYSQL IO 统计

       Mysql在执行事务的时候,最主要的资源消耗就在循环获取数据页上面,要在内存中不断的查找相应的数据页,如果数据页不在内存中,还需要从磁盘上读取,我们把从内存中直接读取数据页称为逻辑读,需要从磁盘上读取数据页的称为物理读,由于数据从磁盘读入到内存后才能被读取,所以逻辑读包含物理读,也就是说,每发生一次物理读,伴随着必有一次逻辑读。

MYSQL IO统计在输出的slow logmysql自带的profile信息中,都增加了逻辑读和物理读的统计,通过slow logprofile信息,可以很直观的发现事务的逻辑读和物理读的次数。

  • MYSQL IO 统计设

    事务是由客户端发起执行的,每个客户端都对应MYSQL的一个连接,MYSQL内部用THD表示一个连接,所以对应的逻辑读和物理读的统计量都放入THD中即可。

Class THD

{

……

 Public:

         ulong logical_reads;

         ulong physical_reads;

……

}

    事务执行时读取页面主要发生在buf0buf.c: buf_page_get_gen函数中,所以对于逻辑读的统计,只要在每次用buf_page_get_gen时,完成一次逻辑读变量的自增,而物理读主要发生在buf0rea.c:buf_read_page_low函数中,所以在每次调用该函数时,对物理读统计变量自增即可实现对物理读的统计。

IO统计函数伪代码:

void thd_io_incr(uint stat_type)

{

         THD *thd = current_thd;

         if(thd == NULL

          || ((is_io_stat_used == NULL || !(*is_io_stat_used))) return;

         switch(stat_type)

         {

                   case LOG_READ:thd->logical_reads++;break;

                   case PHY_READ:thd->physical_reads++;break;

                   default:break;

         }

}

    上述函数定义在mysql上层,由于引擎内部不能直接调用上层的代码,而对于实现逻辑读和物理读的函数都在引擎的内部,所以我们通过对handler增加一个函数指针的方式,利用函数指针,在初始化的时候,把IO统计函数thd_io_incr传入到引擎内部。

handler.h

         …..

         int (*table_exists_in_engine)(handlerton *hton, THD* thd, const char *db,

                                  const char *name);

void (*io_stat_ptr)(uint stat_type); //定义函数指针为handler的成员变量

…….

Handler.cc

         ……

         hton->slot= HA_SLOT_UNDEF;

 hton->io_stat_ptr = thd_io_incr; //IO统计函数传给引擎的handler

       plugin->data= hton;

……

经过上述函数指针的传递,引擎内部可以获取到IO统计的函数指针,所以不只是innodb,所有引擎只要在读取数据页的时候能调用该函数指针,都可以进行IO统计。

  • MYSQL IO 统计配置

    IO的统计计入到slow log,我们为IO统计新设置两个mysql变量:

Variable name

Values

Comment

slow_query_type

0/1/2/3

0:不开启原来的slow logIO STAT

1:只开启MYSQL原有的slow log

2:只开启IO STAT

3:同时开启MYSQL slow logIO STAT

long_query_io

整型变量

逻辑读阈值,逻辑读数量超过该值则被记录

Slow_query_typeMYSQL原有的slow_query_log相关联,在设置slow_query_log时可以改变slow_query_type的值,反之亦然。

MYSQL IO统计实现 - 江羽 - 江羽的博客

                                图1

  • MYSQL IO统计运用示例
设置只启用IO统计

MYSQL IO统计实现 - 江羽 - 江羽的博客
                                                       2
图2中原本slow_query_type=3,在禁用了MYSQL本来的slow log后,slow_query_type=2,只启用IO统计

对表执行操作,查看相应的slow logIO统计的信息
MYSQL IO统计实现 - 江羽 - 江羽的博客
                                                      3
图3中为记录到相应文件的slow log(log_output=’file’),可以看到执行的sqlselect * from t产生的Logical_reads3

MYSQL IO统计实现 - 江羽 - 江羽的博客
                                                     4
图4中为记录到mysql.slow_log表的slow log(log_output=’table’),同样执行select * from tlogical_reads3

记录IO STATmysql profiles
有时候我们不希望开启slow log,毕竟开启slow log在很大程度上会影响系统的性能,在不开启slow log的情况下,我们可以通过打开profile选项来查看相应的IO统计

MYSQL IO统计实现 - 江羽 - 江羽的博客
                                                          图5
在mysql的profiles信息中,我们也看到了对应SQL语句的IO统计情况。
 


  评论这张
 
阅读(4006)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017