Linux

Linux 虛擬記憶體調整以解決磁碟 I/O 問題

  • October 11, 2016

我在使用 Linux 伺服器時遇到問題,它正在向磁碟寫入大量內容,因此由於 IO 等待時間過長,我的響應時間很慢。我已經檢查了磁碟的智能值並且沒問題。這是 RAID1 softwareRaid,ext4 文件系統中的兩個磁碟設置。

由於我暫時無法升級硬體,也無法擺脫密集的 I/O 應用程序,因此我計劃配置 Linux vm 設置以嘗試減少 I/O 等待時間。

我正在考慮調整交換,但主要是dirty_background_ratio和dirty_ratio。

問題:

如何根據我目前的系統負載和記憶體使用情況估計此值的調整?

你想要的東西很少。首先你要減少swappiness

sysctl -w vm.swappiness=10

這將節省一些磁碟 IO;因為你需要做的最後一件事是當核心試圖從 mem 中分頁一些東西時對磁碟進行額外的寫入。目標是調整事物,以便需要很少的交換。但是,不要通過將其設置為 0 或禁用來關閉 swappiness。我建議採取極端措施,將 swappiness 設置為 1。如果您觀察 dstat 輸出一段時間,您會很快注意到實際從交換中寫入和讀取的數據量。

現在在較新的核心(3.2+)中有一種稱為writeback throttling的機制。為了能夠按照您所說的那樣使用它,您需要調整臟比率。檢查 此連結的更多詳細資訊。從那裡引用你感興趣的是

Once dirty_ratio (resp. dirty_bytes) limit is hit then the process which 
writes gets throttled.

因此,預設情況下,臟值相當高,特別是如果您有大量記憶體和慢速磁碟子系統。所以你需要調低它們;盡可能低以不影響正常使用*,但值將決定在核心生成程序以將其寫入磁碟之前記憶體中存在的數據量,當您的磁碟 IO 瓶頸情況開始發生時。此時,您希望該程序受到限制,核心通過在其中註入睡眠來執行此操作。

*弄清楚什麼是正常使用;我建議安裝在上面並觀察那裡發生了什麼;您想檢查dirty那裡的數字並查看跟踪磁碟讀/寫的 D 概述。有 WCANCL 列;這些實際上是在記憶體中處理的寫入,不需要寫入磁碟(臟頁),而是用於一些臨時數據。Mysql 在執行複雜查詢時具有這些功能,在製作大量不需要長時間的小 obj 文件時具有編譯器等…

除此之外,它可能有助於切換到截止日期磁碟調度程序並調整讀取與寫入的親和力以更好地適應您的環境。例如,如果您的讀取次數比寫入次數多 10 倍,您可能需要設置

/sys/block/<device>/queue/iosched/writes_starved

到 5 而不是預設值 2. 設置更高

/sys/block/<device>/queue/iosched/write_expire

也會有所幫助。此外,如果您減少批量完成的請求數量,您可能會獲得一些128延遲32

/sys/block/<device>/queue/nr_requests

引用自:https://serverfault.com/questions/641192