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完成。