要優化Linux性能,IT團隊應該檢查當前正在使用的I/O調度程序,并評估諸如deadline和完全公平隊列(Completely Fair Queuing)這樣的替代方案選項。
如果某臺Linux服務器性能不佳,通常與存儲信道有關。幾十年前,還相對容易進行分析,服務器擁有RAID陣列,RAID陣列的頂層存在分區并且Ext2文件系統在分區頂層運行。然而在今天的數據中心,分析存儲信道就不那么容易了。
許多現代數據中心的Linux服務器運行在VMware虛擬機管理程序的頂端,與不同類型的存儲區域網絡(Storage Area Network,SAN)系統相連接。這意味著在進行Linux存儲優化過程中要考慮許多因素。
常識上認為,當你在虛擬機管理程序上使用Linux,你不需要做關于存儲優化的任何操作,但在很多的情況下并非事實。存儲性能取決于許多因素,其中的一個因素便是Linux I/O調度程序,如果它調試正確能給性能帶來決定性的影響。
了解不同的Linux I/O調度程序類型
I/O調度程序是決定I/O請求是如何被排序的內核進程。有很多種不同類型的調度程序,如deadline類型、Completely Fair Queuing類型以及noop(無操作)類型。在較早的內核版本中,也存在著預期(anticipatory)調度程序。
大多數系統默認的Linux I/O調度程序是完全公平的隊列(Completely Fair Queuing)。有了這個調度器,Linux內核嘗試在讀寫請求之前將它們均勻地分配到存儲通道中。大多數的虛擬機管理程序和協同SAN產品也在做同樣的事情,所以這一類型的調度程序相對于改進,更可能給特定的負載小的降底。盡管如此,這是最安全的選擇,這也是為什么所有的版本都使用它作為默認設置。
許多IT專業人士認為當使用智能存儲時,noop調度程序提供最佳的性能。有了這一調度程序,Linux內核直接傳輸讀寫請求到存儲信道,并將他們重新排序。在大多使用虛擬機管理程序、固態硬盤或SAN的情況下,noop調度程序提供了最好的性能。然而,這可能并不總是這樣的,特別是在面向大量寫入負載時,使用deadline調度程序可能更有助于底層存儲信道。
Deadline I/O調度程序以最高效的方式重新排序來優化寫入請求,從而在底層虛擬機管理程序層簡化了性能負載。如果您的服務器寫入操作很多,deadline I/O調度程序值得一試。
最后,還可能會遇到預期調度程序。這一調度程序在舊的Linux內核中使用,現在已并不常見。在這些較舊的內核上,此調度程序在執行文件存儲塊時通過執行預讀來優化讀取請求。
1Set Linux I/O調度程序
管理員可以為指定的磁盤或整個服務器設置I/O調度程序。要為整個服務器進行設置,修改grub配置 file/etc/default/grub。在這一文件中,找到從Linux開始的那行。在某些版本中,Linux后面可能跟著數字。這行內容中包含著所有的內核啟動參數。在這一行添加elevator=setting,“setting”的更改需要借助所使用的I/O調度程序進行。改變GRUB的配置文件完成后,運行grub2-mkconfig -o /boot/grub2/grub.cfg將新的設置寫入系統,然后重新啟動系統。
雖然更改整個系統的Linux I/O調度程序可以在某些特定的工作負載上生效,考慮更改每塊磁盤I/O調度程序設置作為一種備選方案。如果服務器有不同的存儲負載,不同的負載類型又正在寫入不同的設備,則考慮帶著這些設置運行測試。
每塊磁盤設備的接口文件都有一個帶有名字/sys/block/device/queue/scheduler。你可以重復所請求的調度設置推送到這個文件以使其立即生效,例如重復請求:deadline >/sys/block/sda/queue/scheduler。當設置能夠被持續更改時,Linux并不提供標準配置文件,因此你需要在系統啟動腳本中集成它并使其自動運行。