[MySQL]浅谈InnoDB存储引擎(七)异步IO

2020-11-02  本文已影响0人  AbstractCulture

回顾

上一个章节我们说到了自适应哈希索引AHI,这是MySQL用哈希来加快热点数据查找的一个特性。那么这个章节我们继续来看MySQL的另一个关键特性-异步IO.

从IO说起

由于内存与磁盘之间的IO性能存在很大的差异。InnoDB在访问磁盘的时候,采用的是AIO的方式,也就是异步IO。
与AIO对应的是Sync IO,即同步IO,它是阻塞式的-也就是必须等待这个IO操作结束后才能继续往下操作。如果此时用户发来一个需要扫描多个索引页的查询请求,这个请求所对应的就是多次IO操作,如果采用同步IO的模型进行页的访问,那是效率极低的。
AIO的方式是发送完一个IO请求后,立即发送下一个IO请求,当所有的IO请求发送完毕,再等待所有IO操作的完成。它为密集型IO的系统带来了可伸缩性。

IO合并

AIO可以将多个IO进行合并,这里假设用户需要访问的page_no为1、2、3,那么AIO会判断这三个是否为连续的页,如果是,那么对当前IO请求进行合并,发出从(space,1)开始,读取48KB的页(一页为16KB)


image.png

在Linux上通过iostat来查看IO合并的情况

想了解iostat可以从以下链接进行进一步的了解: iostat

shell> iostat

这里体现AIO的参数如下:
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数

InnoDB版本不同所带来的AIO版本差异

在InnoDB1.1.x之前,AIO是通过InnoDB存储引擎中的代码来模拟实现的,而从InnoDB1.1.x开始,提供了内核级别的AIO支持(也就是说AIO这个机制交由操作系统内核来实现了),称为Native AIO,因此在编译或者允许该版本MySQL的时候,需要libaio库的支持。
以下是官方文档的地址:AIO

如何启用AIO

可以通过参数innodb_use_native_aio来控制是否启用AIO,在Linux操作系统下,这个参数默认为ON(即默认开启).注意,在数据库运行期间修改这个值并不会生效。

shell> SHOW VARIABLES LIKE 'innodb_use_native_aio'\G;

性能上带来的提升

使用AIO可以加快磁盘的IO操作,其中官方测试报告显示,启用AIO,恢复速度可以提高75%。
InnoDB存储引擎中,read ahead方式的读取都是AIO完成,脏页的刷新也是由AIO来完成的。

下面贴一个学习AIO的帖子,想深入的朋友可以点击链接进行跳转->AIO那些事

上一篇 下一篇

猜你喜欢

热点阅读