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