MySQL資料庫環境如何調整磁碟IO排程演算法

chenfeng發表於2018-05-28
檢視當前系統支援的磁碟IO排程演算法
[root@alpha-mongo-140-52 ~]# dmesg | grep -i scheduler
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)

default代表當前裝置使用的預設的IO排程演算法

也可以用以下命令檢視:
[root@test ~]# more /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq] 
備註:括號裡括起來的即為當前排程演算法值

修改當前塊裝置使用的io排程演算法為deadline:
[root@test ~]# echo "deadline" > /sys/block/sda/queue/scheduler
備註:修改立即生效

[root@test ~]# more /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq


排程演算法介紹:
Linux有四種IO排程演算法,分別為完全公平佇列演算法(Complete Fair Queuing/CFQ), NOOP演算法(No Operation),最後期限演算法(Deadline)和預期演算法(anticipatory).
  • 完全佇列公平演算法把磁碟I/O請求按照程式分別放入程式對應的佇列中。CFQ的公平是針對程式而言的,每一個提交I/O請求的程式都會有自己的I/O佇列,CFQ以時間片演算法為前提,輪流調動佇列,預設當前佇列中取出4個請求來處理,然後接著處理下一個佇列裡的4個請求,確保每個程式享有的IO資源是均衡的。CFQ是Linux預設的I/O排程演算法。
  • NOOP演算法是不對I/O請求排序,除了合併請求也不會進行其他任何最佳化,用最簡單的先進先出佇列順序提交I/O請求,NOOP演算法面向的主要是隨機IO訪問裝置SSD等。
  • 最後期限演算法(Deadline)除了維護了一個擁有合併和排序功能的請求佇列外,額外維護了兩個佇列,分別是讀請求佇列和寫請求佇列,他們都是帶有超時的請求佇列,當新來一個IO請求時,會被同時插入普通佇列和讀寫佇列,然後I/O排程器正常處理普通佇列中的請求。當排程器發現讀寫請求佇列中的請求超時的時候,會優先處理這些請求,保證儘可能不產生飢餓請求。對於MYSQL來說,建議設定為Deadline,對MYSQL來說是很好的排程演算法。
  • 預期演算法(anticipatory)是基於預測的I/O演算法,它和Deadline類似,也維護了三個請求佇列,區別在於,預期演算法處理完一個IO請求後並不會直接返回處理下一個請求,而是等待預設6秒,等待期間如果有新進來的相鄰扇區的請求,會直接處理新來的請求,當等待6秒結束後,排程才返回處理下一個佇列請求。anticipatory適合寫多讀少的環境,不適合MySQL等隨機讀取較多的資料庫環境。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2155220/,如需轉載,請註明出處,否則將追究法律責任。

相關文章