mysql 使用异步io_InnoDB引擎之-异步IO(Async IO)
InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性:
插入缓冲(Insert Buffer)
两次写(Double Write)
自适应哈希索引(Adaptive Hash Index)
异步IO(Async IO)
刷新邻接页(Flush Neighbor Page)
关于AIO与SIO
为了提高磁盘操作性能,当前的数据库系统都采用异步IO的方式来处理磁盘操作。
同步IO:我们常用的read/write函数(Linux上)就是这类IO,特点是,在函数执行的时候,调用者会等待函数执行完成,而且没有消息通知机制,因为函数返回了,就表示操作完成了,后续直接检查返回值就可知道操作是否成功。这类IO操作,编程比较简单,在同一个线程中就能完成所有操作,但是需要调用者等待,在数据库系统中,比较适合急需某些数据的时候调用,例如WAL中日志必须在返回客户端前落盘,则进行一次同步IO操作。
异步IO:在数据库中,后台刷数据块的IO线程,基本都使用了异步IO。数据库前台线程只需要把刷块请求提交到异步IO的队列中即可返回做其他事情,而后台线程IO线程,则定期检查这些提交的请求是否已经完成,如果完成再做一些后续处理工作。同时异步IO由于常常是一批一批的请求提交,如果不同请求访问同一个文件且偏移量连续,则可以合并成一个IO请求。例如,第一个请求读取文件1,偏移量100开始的200字节数据,第二个请求读取文件1,偏移量300开始的100字节数据,则这两个请求可以合并为读取文件1,偏移量100开始的300字节数据。数据预读中的逻辑预读也常常使用异步IO技术。
Innodb 使用异步IO的场景
总的来说innodb 只会对数据文件采用异步IO,为了保存日志是真正被写入到磁盘,innodb不会对日志文件启用异步IO;innodb只会对数据文件的read-ahead ,write 这两个操作启用异步IO
异步IO在mysql中解决了什么问题
在没有IO这个功能之前,innodb对数据的读写请求先放入任务队列,后台read-thread ,write-thread从任务队列中拿出任务并执行读写操作;后台读写线程的个数可以通过show engine innodb status 语句来查看
show engine innodb status;
--------
FILE I/O
--------
I/O thread 0 state: waiting for i/o request (insert buffer thread)
I/O thread 1 state: waiting for i/o request (log thread)
I/O thread 2 state: waiting for i/o request (read thread)
I/O thread 3 state: waiting for i/o request (read thread)
I/O thread 4 state: waiting for i/o request (read thread)
I/O thread 5 state: waiting for i/o request (read thread)
I/O thread 6 state: waiting for i/o request (write thread)
I/O thread 7 state: waiting for i/o request (write thread)
I/O thread 8 state: waiting for i/o request (write thread)
I/O thread 9 state: waiting for i/o request (write thread)
Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
ibuf aio reads:, log i/o's:, sync i/o's:
Pending flushes (fsync) log: 0; buffer pool: 0
376 OS file reads, 54 OS file writes, 7 OS fsyncs
41.77 reads/s, 21886 avg bytes/read, 6.00 writes/s, 0.78 fsyncs/s
由上面的内容可以看出默认情况下innodb会有4个read-thread 和4个write-thread ,问题就出现在这里,如果业务繁重,读写任务会非常的多,而innodb只有八个读写线程,这样的话队列中的其它读写请求就没能得到及时的响应。
引入异步IO之后,读写请求不再像之前那样先放入队列,等着后台的读写线程去执行任务;而是查询线程直接发起异步请求,这样一来冲破了读写线程个数的硬性限制,二来由于异步IO是否阻塞的这也进一步提高了性能。
怎么启用mysql异步IO
首先OS要有异步io,且开启,然后mysqld要链接,要不然OS异步io没有开启,数据库的异步io也起不来。(this variable applies to Linux systems only, and cannot be changed while the server is running.)
文件系统层面需要打开这个功能:
一般都是默认开启的。
ldconfig -v|grep libaio
libaio.so.1.0.0 -> libaio.so.1.0.0
libaio.so.1 -> libaio.so.1.0.1
AIO是数据库层面的一个特性需要打开:
默认是开启,但是阿里云默认是关闭的,开启的native aio性能提升,可以提高到75%。
mysql>show variables like 'innodb_use_native_aio';
+-------------------------+-----------------+
| Variable_name | Value |
+-------------------------+-----------------+
| innodb_use_native_aio | OFF |
+-------------------------+-----------------+
异步IO的优缺点
优点
不用等待直接响应上一个用户的请求;
多次的请求在一起排序,请求的数据页是在一起的,一次读出来,减少多次读。(数据库的读写请求队列放在文件系统中单独分配的一块小内存结构里,非文件系统的缓存)
缺点
异步IO对于我们来说是不可控的,所以说在启用异步IO的情况下相当于是我们把IO的控制权交出去了。
mysql 使用异步io_InnoDB引擎之-异步IO(Async IO)相关推荐
- python 异步io_Python中的异步IO:完整的演练
python 异步io Async IO is a concurrent programming design that has received dedicated support in Pytho ...
- Node的异步与java的异步_node中异步IO的理解
解释性语言和编译型语言的区别: 计算器不能直接的理解高级语言,只能理解机器语言,所以必须把高级语言翻译为机器语言,翻译的方式有两种,一个是编译,一个是解释. 解释性语言的程序不需要编译,它是在运行程序 ...
- python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO
Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...
- 浅谈python异步IO,同步IO,线程与进程~
主线程下的线程之间是可以通信的,但是父进程下的子进程之间不能主动通信,但是子进程想要实现通信也是可以的,可以选择折中的方法来实现,比如multiprocessing.Queue,用法与线程中的queu ...
- adg类似于mysql半同步机制_MySQL基准测试异步复制和半同步复制延迟对比
测试环境 :MySQL 5.7.26 主从异步复制(GTID) 测试数据 :测试数据:10张表,每张表500万行数据,共12G的数据. 每次测试,主实例服务器测试脚本不变,线程为10,复制方式分别为异 ...
- 高级IO--1 ---(五种典型IO,阻塞IO,非阻塞IO,信号驱动IO,异步IO, IO多路转接)
高级IO: 五种典型IO: 阻塞IO/非阻塞IO/信号驱动IO/异步IO/IO多路转接 IO多路转接模型:select/poll/epoll 五种典型IO 阻塞IO IO操作的流程:等待IO操作条件具 ...
- 阻塞IO, 非阻塞IO, 同步IO,异步IO
阻塞IO, 非阻塞IO, 同步IO,异步IO 介绍 先说明几个概念 用户空间与内核空间 为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操心系统将虚拟空间(内存)划分为两部分,一部分 ...
- MySQL性能半同步复制VS异步复制
性能测试报告 •从当前性能测试来看其实半同步复制与异步复制差距并不大,只是略微有点差距 •都说半同步复制比异步复制性能慢了好多,为什么当前测试却差距这么小呢? 原因一:半同步复制时只有一个slave库 ...
- 五种网络IO模型:阻塞式IO 非阻塞式IO IO复用(IO multiplexing) 信号驱动式IO 异步IO
文章目录 五种网络IO模型 举例说明 阻塞式I/O模型 非阻塞式I/O I/O多路复用 信号驱动式I/O 异步I/O 比较结果 总结 同步 异步 阻塞 非阻塞 阻塞/非阻塞: 同步/异步: 举例子:小 ...
- 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?
通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...
最新文章
- pandas 设置多重索引_Pandas多重索引使用详解
- 微软研究院和清华大学联合发布 “开放学术图谱(OAG)2.0版本”
- HDU - 3974 Assign the task (DFS建树+区间覆盖+单点查询)
- O/R Mapping 研究报告(转)
- threshold函数
- windows 下安装 rabbitmq报init terminating in do_boot错误
- MQ(Message Queue)简介
- php70w-mbstring,php安装
- 俯首甘为孺子牛上一句是什么
- GradView使用举例
- linux查看所有目录
- android horizontalscrollview属性,Android 实例讲解HorizontalScrollView实现左右滑动
- HDU 2154:跳舞毯(递推)
- 微软时间服务器同步错误,Windows Server 设置时间同步出错问题
- 2020华为春招面试:一面二面三面(一下午4h左右完成)已挂
- 脑科学研究中基于图论的复杂脑网络分析方法
- Warning: mysqli::mysqli(): (HY000/2002): No connection could be made because the target machine acti
- 电脑网易我的世界进服务器未响应,我的世界网易版进不去解决方法 MC网易电脑端进不去原因...
- 图像质量评价的方法和意义
- 防火墙Deny记录实时检测