0

0

Innodb Read IO 相关参数源代码解析_MySQL

php中文网

php中文网

发布时间:2016-06-01 13:28:58

|

1421人浏览过

|

来源于php中文网

原创

bitsCN.com

前言:最近在阅读Innodb IO相关部分的源代码。在阅读之前一直有个疑问,show global status 中有两个指标innodb_data_reads 和 innodb_data_read。两个计数器仅差一个字母,他们之间的含义到底有何差别呢?本文将通过解析这两个参数的含义,分析Innodb对于磁盘IO相关的一些知识

 首先我们来看下mysql官方文档里对于这两个参数的解释:

    •  Innodb_data_read

      The amount of data read since the server was started.

    •  Innodb_data_reads

      The total number of data reads.

 文档对于这两个参数的解释非常暧昧。这里的读是指什么?是从哪里读?磁盘还是内存?甚至连计数器的单位也不知道。

 

详细解析:

接下来我们从源代码来解析这两个参数。在src/Srv0srv.c中存在对这两个参数和代码变量的映射关系的定义代码,如下:

     export_vars.innodb_data_read = srv_data_read;
     export_vars.innodb_data_reads = os_n_file_reads; 

接着让我们来看下这两个代码变量在哪里进行了累加操作。

srv_data_read 尽有一处代码进行累加操作,buf0file.c 的 _fil_io 函数中,操作如下:  srv_data_read+= len;从这行可以看出,innodb_data_read中实际存的是从磁盘上进行物理IO的字节数。 os_n_file_reads 也几乎只有一处代码进行累加(其他是windows的sync读这里忽略),在buf0file.c 的 中,操作如下:os_file_pread

  os_n_file_reads++;

随后,代码即调用os_aio_array_reserve_slot将IO请求推入 simulated array,再根据wake_later标志位决定是否调用

os_aio_simulated_wake_handler_thread来立即唤醒IO工作队列。从这里也可以看到,innodb_data_reads记录的是innodb对于磁盘发起的读IO请求次数。看到这里我们就很容易产生一个疑问:既然两个变量都是对磁盘发起的IO的计数器,为什么不直接放在一个函数的相邻行里呢?

回答这个问题,我们就需要对于innodb的simulated-aio和read-ahead算法有一定理解了。

进入到simulated的aio slot array的请求会有两种,一种是通过buf_read_page 过来的普通页的读请求,一种是通过buf_read_ahead_random/linear 过来的预读请求。从innodb的实现来说普通数据页的请求是需要立即返回响应的,所以是同步(sync)IO。而对于预读这样数据并非SQL所需要,仅是用于提升性能的页读取,这样的IO完全是可以异步的。这两个差异也是导致simulated aio出现的原因。把IO请求推入slot array后,数据页同步请求立即通知worker thread去os做同步IO。而预读IO请求会不断的推入slot array直到一次预读所需要的page全部推入slot中,然后再会通知worker thread。此外在worker thread中,也会判断一个segment的io请求是否相邻连续,如果连续则把这些请求合并后,作为一次OS IO发到下层存储中。

明白了这些也就不难理解为什么计数器要分开在不同的函数中计数了。如果累加都放在 _fil_io中进行,那么 innodb_data_read = 16K * innodb_data_reads (这里假设page没有做压缩)。然而在有了异步IO合并这个操作后,实际的innodb_data_reads会少于_fil_io中获得的计数次数。所以,通过 innodb_data_read / innodb_data_reads得到的比值也可以推断出一个MySQL实例中顺序IO或者可顺序预读的IO比例。

我们在production环境的服务器上做一个验证:

Cutout老照片上色
Cutout老照片上色

Cutout.Pro推出的黑白图片上色

下载

服务器A:在线用户访问的数据库,猜测随机IO较多

SHOW GLOBAL STATUS LIKE '%innodb_data_read%';

Innodb_data_read 46384854470656
Innodb_data_reads 2812101578

每次IO平均读取字节数=16494

服务器B:历史数据统计的数据库,数据内容和服务器A完全一样,猜测顺序IO较多

SHOW GLOBAL STATUS LIKE '%innodb_data_read%';

Innodb_data_read 54835669766144
Innodb_data_reads 2604758776

每次IO平均读取字节数=21052

可见顺序IO较多的MySQL的单次IO读取字节数确实要多于一个page的大小,说明IO合并效果明显。

而随机IO较多的MySQL的单词IO读取字节数几乎和一个page大小一致,即16K

 

最后我们再总结下一些结论:

  • Innodb_data_read   表示Innodb启动后,从物理磁盘上读取的字节数总和。
  • Innodb_data_reads 表示Innodb启动后,队伍物理磁盘发起的IO请求次数总和。
  • Innodb_data_read / Innodb_data_reads 得到的比值,越接近16K说明IO压力越倾向于随机IO,越远离16K说明IO从顺序预读中获得性能提升越多

 

 

 

 参考资料:

1. InnoDB异步IO(AIO)实现详解 http://hedengcheng.com/?p=98

 

 

bitsCN.com

相关专题

更多
苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

115

2025.12.24

拼豆图纸在线生成器
拼豆图纸在线生成器

拼豆图纸生成器有PixelBeads在线版、BeadGen和“豆图快转”;推荐通过pixelbeads.online或搜索“beadgen free online”直达官网,避开需注册的诱导页面。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

82

2025.12.24

俄罗斯搜索引擎yandex官方入口地址(最新版)
俄罗斯搜索引擎yandex官方入口地址(最新版)

Yandex官方入口网址是https://yandex.com。用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

546

2025.12.24

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

150

2025.12.24

php框架基础知识汇总
php框架基础知识汇总

php框架是构建web应用程序的架构,提供工具和功能,以简化开发过程。选择合适的框架取决于项目需求和技能水平。实战案例展示了使用laravel构建博客的步骤,包括安装、创建模型、定义路由、编写控制器和呈现视图。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

20

2025.12.24

Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

47

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

7

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

12

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

371

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.2万人学习

SciPy 教程
SciPy 教程

共10课时 | 0.9万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号