Flush neighbor pagemysql
一、工做原理ios
二、参数控制sql
AIO数据库
一、开启异步IO缓存
当刷新一个脏页时,innodb存储引擎会检测该页所在区(extent)的全部页,若是是脏页,那么一块儿进行刷新。这样作的好处显而易见,经过AIO能够将多个IO写入操做合并为一个IO操做,增大写入量,减小了物理写IO,故该工做机制在传统机械磁盘下有着显著的优点。性能
一、在写入次数基本不增长的状况下,增长了写入的量;this
二、加速了脏页的回收;spa
三、充分利用double write每次1M写入的特征;
四、这个功能打开之后会发现iostat里面的wrqm(合并写)这个值会比较高;
二、问题考虑
一、是否是可能将不怎么脏的页进行了写入,而该页以后又会很快变成脏页?
二、固态硬盘有着较高的 IOPS,是否还须要这个特性?
为此,InnoDB 存储引擎从 1.2.x 版本开始提供了参数 innodb_flush_neighbors,用来控制是否启用该特性。对于传统机械硬盘建议启用该特性,而对于固态硬盘有着超高 IOPS 性能的磁盘,则建议将该参数设置为 0、即关闭此特性。
mysql> show variables like '%neigh%'; +------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| innodb_flush_neighbors | 1 | #默认刷新邻接页功能开启
+------------------------+-------+
1 row in set (0.00 sec)
1,表示打开了刷新邻接页的功能,顺带着刷新在 buffer pool 中位于磁盘上相同的 extend 区的相邻的脏页。
0,表示关闭刷新邻接页
2 ,表示刷新在 buffer pool 中位于磁盘上相同的 extend 区的脏页。
四、Flush neighbor page的影响
一、对于insert频繁的系统,这个功能比较适合
二、对于update频繁的系统,这个功能可能会带来一些反作用
一、update顺带着刷新其余页;
二、对于update频繁的表,这些页立刻就脏了,白白浪费写负载。
2、异步IO功能
一、关于AIO与SIO
为了提升磁盘操做性能,当前的数据库系统都采用异步IO的方式来处理磁盘操做。
一、异步IO:用户能够在发出一个IO请求后当即再发出另一个IO请求,当所有IO请求发送完毕后,等待全部IO操做完成,这就是AIO。
二、与AIO对应的是Sync IO,即每进行一次IO操做,须要等待这次操做结束才能继续接下来的操做。
首先OS要有异步io,且开启,而后mysqld要连接,要否则OS异步io没有开启,数据库的异步io也起不来。(this variable applies to Linux systems only, and cannot be changed while the server is running.)
一、文件系统层面须要打开这个功能:通常都是默认开启的。
[root@localhost /]# 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 | ON |
+-----------------------+-------+
1 row in set (0.00 sec)
三、异步IO的好处
一、不用等待直接响应上一个用户的请求;
二、屡次的请求在一块儿排序,请求的数据页是在一块儿的,一次读出来,减小屡次读。(数据库的读写请求队列放在文件系统中单独分配的一块小内存结构里,非文件系统的缓存)
四、wio:wait io
一、同步IO必定会产生wait IO
二、异步IO会下降wait IO,可是也可能会有wait IO
三、尽可能采用异步IO(性能高于同步IO)
四、数据库层面启用异步IO
五、文件系统层面启用异步IO,Linux具有异步IO的能力
六、操做系统层面wio的含义理解
[root@localhost /]# sar 1 Linux 2.6.32-431.el6.x86_64 (one) 07/14/2017 _x86_64_ (6 CPU) 04:23:25 AM CPU %user %nice %system %iowait %steal %idle 04:23:26 AM all 0.17 0.00 0.33 0.00 0.00 99.50
04:23:27 AM all 0.00 0.00 1.00 0.00 0.00 99.00
^C [root@localhost /]# iostat 1 Linux 2.6.32-431.el6.x86_64 (one) 07/14/2017 _x86_64_ (6 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.02 0.02 0.00 99.96 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.26 6.70 4.07 619320 376232 scd0 0.00 0.00 0.00 352 0
说明进程或是线程等待io的时间,值最好是小于5,大于25必定是io有问题。
在InnoDB存储引擎中,read ahead方式的读取都是经过AIO完成,脏页的刷新,也是经过AIO完成。