Linux - 真實世界的硬體 RAID 控制器調整(scsi 和 cciss)
我管理的大多數 Linux 系統都具有硬體 RAID 控制器(主要是HP Smart Array)。他們都在執行 RHEL 或 CentOS。
我正在尋找現實世界中的可調參數,以幫助優化將硬體 RAID 控制器與 SAS 磁碟(智能陣列、Perc、LSI 等)和電池備份或快閃記憶體備份記憶體相結合的設置的性能。假設 RAID 1+0 和多個心軸(4+ 磁碟)。
我花費大量時間為低延遲和金融交易應用程序調整 Linux 網路設置。但其中許多選項都有詳細記錄(更改發送/接收緩衝區、修改 TCP 視窗設置等)。工程師在儲存方面做什麼?
從歷史上看,我對I/O 調度電梯進行了更改,最近選擇了
deadline
和noop
調度程序來提高我的應用程序的性能。隨著 RHEL 版本的發展,我還注意到 SCSI 和 CCISS 塊設備的編譯預設值也發生了變化。隨著時間的推移,這對推薦的儲存子系統設置產生了影響。但是,我已經有一段時間沒有看到任何明確的建議了。而且我知道作業系統預設值不是最佳的。例如,對於伺服器級硬體上的部署來說,128kb 的預設預讀緩衝區似乎非常小。以下文章探討了更改預讀記憶體和nr_requests值對塊隊列的性能影響。
http://zackreed.me/articles/54-hp-smart-array-p410-controller-tuning
http://www.overclock.net/t/515068/tuning-a-hp-smart-array-p400-with-linux-why-tuning-really-matters
http://yoshinorimatsunobu.blogspot.com/2009/04/linux-io-scheduler-queue-size-and.html
例如,以下是 HP Smart Array RAID 控制器的建議更改:
echo "noop" > /sys/block/cciss\!c0d0/queue/scheduler blockdev --setra 65536 /dev/cciss/c0d0 echo 512 > /sys/block/cciss\!c0d0/queue/nr_requests echo 2048 > /sys/block/cciss\!c0d0/queue/read_ahead_kb
還有什麼可以可靠地調整以提高儲存性能?
我專門在生產場景中尋找 sysctl 和 sysfs 選項。
我發現當我不得不調整較低的延遲和吞吐量時,我已經將 nr_requests 從它的預設值調低(低至 32)。更小批量的想法等於更低的延遲。
同樣對於 read_ahead_kb,我發現對於順序讀取/寫入,增加此值可提供更好的吞吐量,但我發現此選項實際上取決於您的工作負載和 IO 模式。例如,在我最近調整的數據庫系統上,我更改了此值以匹配單個 db 頁面大小,這有助於減少讀取延遲。在我的情況下,增加或減少超過這個值被證明會損害性能。
至於塊設備隊列的其他選項或設置:
max_sectors_kb = 我已將此值設置為與硬體允許單次傳輸匹配的值(檢查 sysfs 中的 max_hw_sectors_kb (RO) 文件的值以查看允許的值)
nomerges = 這使您可以禁用或調整用於合併 io 請求的查找邏輯。(關閉它可以為您節省一些 cpu 週期,但是在為我的系統更改它時我沒有看到任何好處,所以我將其保留為預設值)
rq_affinity = 我還沒有嘗試過,但這是核心文件背後的解釋
如果此選項為“1”,則塊層會將請求完成遷移到最初送出請求的 cpu“組”。對於某些工作負載,由於記憶體效應,這會顯著減少 CPU 週期。
對於需要最大化完成處理分佈的儲存配置,將此選項設置為“2”會強製完成在請求的 cpu 上執行(繞過“組”聚合邏輯)”
scheduler = 你說你試過deadline和noop。我已經測試了 noop 和截止日期,但發現截止日期勝出我最近為數據庫伺服器所做的測試。
NOOP 表現不錯,但對於我們的數據庫伺服器,我仍然能夠通過調整截止日期調度程序獲得更好的性能。
位於 /sys/block/{sd,cciss,dm-}*/queue/iosched/ 下的期限調度程序選項:
fifo_batch = 有點像 nr_requests,但特定於調度程序。經驗法則是將其調低以降低延遲或提高吞吐量。控制讀寫請求的批量大小。
write_expire = 設置寫入批次的過期時間預設為 5000 毫秒。再次減小該值會降低您的寫入延遲,而增加該值會增加吞吐量。
read_expire = 設置讀取批次的過期時間預設為 500 毫秒。同樣的規則在這裡適用。
front_merges = 我傾向於關閉它,預設情況下它是打開的。我認為調度程序不需要浪費 cpu 週期來嘗試合併 IO 請求。
writes_starved = 因為截止日期是針對讀取的,所以這裡的預設設置是在處理寫入批處理之前處理 2 個讀取批處理。我發現預設值 2 對我的工作量有好處。