Flush neighbor page
1、工作原理
2、參數控制
AIO
1、開啟異步IO
當刷新一個臟頁時,innodb存儲引擎會檢測該頁所在區(extent)的所有頁,如果是臟頁,那么一起進行刷新。這樣做的好處顯而易見,通過AIO可以將多個IO寫入操作合並為一個IO操作,增大寫入量,減少了物理寫IO,故該工作機制在傳統機械磁盤下有着顯著的優勢。
1、在寫入次數基本不增加的情況下,增加了寫入的量;
2、加速了臟頁的回收;
3、充分利用double write每次1M寫入的特征;
4、這個功能打開以后會發現iostat里面的wrqm(合並寫)這個值會比較高;
2、問題考慮
1、是不是可能將不怎么臟的頁進行了寫入,而該頁之后又會很快變成臟頁?
2、固態硬盤有着較高的 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 區的臟頁。
4、Flush neighbor page的影響
1、對於insert頻繁的系統,這個功能比較適合
2、對於update頻繁的系統,這個功能可能會帶來一些副作用
1、update順帶着刷新其他頁;
2、對於update頻繁的表,這些頁馬上就臟了,白白浪費寫負載。
二、異步IO功能
1、關於AIO與SIO
為了提高磁盤操作性能,當前的數據庫系統都采用異步IO的方式來處理磁盤操作。
1、異步IO:用戶可以在發出一個IO請求后立即再發出另外一個IO請求,當全部IO請求發送完畢后,等待所有IO操作完成,這就是AIO。
2、與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.)
1、文件系統層面需要打開這個功能:一般都是默認開啟的。
[root@localhost /]# ldconfig -v|grep libaio libaio.so.1.0.0 -> libaio.so.1.0.0 libaio.so.1 -> libaio.so.1.0.1
2、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)
3、異步IO的好處
1、不用等待直接響應上一個用戶的請求;
2、多次的請求在一起排序,請求的數據頁是在一起的,一次讀出來,減少多次讀。(數據庫的讀寫請求隊列放在文件系統中單獨分配的一塊小內存結構里,非文件系統的緩存)

4、wio:wait io
1、同步IO一定會產生wait IO
2、異步IO會降低wait IO,但是也可能會有wait IO
3、盡量采用異步IO(性能高於同步IO)
4、數據庫層面啟用異步IO
5、文件系統層面啟用異步IO,Linux具備異步IO的能力
6、操作系統層面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完成。
