Azure NetApp Files 的 Linux 檔案系統快取最佳做法
本文可協助您了解 Azure NetApp Files 的檔案系統快取最佳做法。
檔案系統快取 tunables
您必須了解檔案系統快取 tunables 的下列因素:
- 清除 dirty 緩衝區會讓資料處於全新狀態,可供未來讀取使用,直到記憶體壓力導致收回為止。
- 非同步排清作業有三個觸發:
- 以時間為基礎:當緩衝區達到此 tunable 所定義的存留期時,其必須標示進行清除 (也就是排清或寫入儲存體)。
- 記憶體壓力:如需詳細資料,請參閱
vm.dirty_ratio | vm.dirty_bytes
。 - 關閉:當控制代碼關閉時,所有 dirty 緩衝區都會非同步排清至儲存體。
這些因素是由四個 tunables 控制。 每個 tunable 可以在 /etc/sysctl.conf
檔案中使用 tuned
或 sysctl
動態和持續地調整。 調整這些變數可改善應用程式的效能。
注意
本文中討論的資訊是在 SAS GRID 和 SAS Viya 驗證練習期間發現。 因此,tunables 會根據驗證實務中學到的經驗。 許多應用程式同樣會從微調這些參數受益。
vm.dirty_ratio | vm.dirty_bytes
這兩個 tunables 會定義可供修改的資料使用但尚未寫入穩定儲存體的 RAM 數量。 無論設定哪一個 tunable,都會自動將另一個 tunable 設定為零;RedHat 不建議手動將兩個 tunable 的其中一個設定為零。 選項 vm.dirty_ratio
(這兩項的預設值) 是由 Redhat 設定為 20% 或 30% 的實體記憶體,視作業系統而定,考量新式系統的記憶體使用量,這是顯著的數量。 不論記憶體大小為何,都應該考量設定 vm.dirty_bytes
,而不是 vm.dirty_ratio
,以獲得更一致的體驗。 例如,持續使用 SAS GRID 判斷的 30 MiB,這是最佳整體混合工作負載效能的適當設定。
vm.dirty_background_ratio | vm.dirty_background_bytes
這些 tunables 會定義 Linux 回寫機制開始排清對穩定儲存體的 dirty 區塊的起點。 Redhat 預設為 10% 的實體記憶體,這在大型記憶體系統上,是開始排清的顯著資料量。 以 SAS GRID 為例,以往的建議是將 vm.dirty_background
設定為 vm.dirty_ratio
或 vm.dirty_bytes
的 1/5 大小。 考量針對 SAS GRID 設定的 vm.dirty_bytes
設定的積極程度,此處不會設定任何特定值。
vm.dirty_expire_centisecs
此 tunable 會定義 dirty 緩衝區在必須標記進行非同步寫出之前,可以保留多久時間。以 SAS Viya 的 CAS 工作負載為例。 暫時性寫入支配工作負載發現,將此值設定為 300 釐秒 (3 秒) 最佳,預設值為 3000 釐秒 (30 秒)。
SAS Viya 會將 CAS 資料分成各為數 MB 的多個小型區塊來共用。 不在將資料寫入每個分區之後關閉這些檔案控制碼,而是保持開啟,而且其中的緩衝區會由應用程式進行記憶體對應。 如果沒有關閉,在記憶體壓力或超過 30 秒之前,將不會排清。 等候記憶體壓力證明比等候計時器到期更長時間來得次佳。 與尋求最佳整體輸送量的 SAS GRID 不同,SAS Viya 會尋求將寫入頻寬最佳化。
vm.dirty_writeback_centisecs
核心排清器執行緒負責在每個排清執行緒休眠之間非同步排清 dirty 緩衝區。 此 tunable 會定義排清之間休眠耗費的數量。 考量 SAS Viya 所使用的 3 秒 vm.dirty_expire_centisecs
值,SAS 將此 tunable 設定為 100 釐秒 (1 秒),而不是 500 釐秒 (5 秒),以預設為尋找最佳整體效能。
未調整檔案系統快取的影響
當您在考量預設的虛擬儲存體 tunables 和現代化系統中的 RAM 數量時,從驅動此混合工作負載的特定用戶端的觀點來看,回寫可能會降低其他儲存體界限作業的速度。 未調整、大量寫入、快取滿載的 Linux 電腦可以預期會有下列徵兆。
- 目錄清單
ls
需要很長的時間,以致於顯得沒有回應。 - 相較於寫入輸送量,對檔案系統的讀取輸送量會大幅減少。
nfsiostat
會以秒或更高為單位來報告寫入延遲。
只有執行混合大量寫入工作負載的 Linux 電腦才會遇到這種行為。 此外,對單一儲存體端點掛接的所有 NFS 磁碟區的體驗會降低。 如果掛接來自兩個或多個端點,則只有共用端點的磁碟區會呈現此行為。
如本節所述設定檔案系統快取參數,已示範可解決該問題。
監視虛擬記憶體
若要了解虛擬記憶體和回寫的內容,請考量下列程式碼片段和輸出。 Dirty 代表系統中的 dirty 記憶體數量,回 寫代表主動寫入儲存體的記憶體數量。
# while true; do echo "###" ;date ; egrep "^Cached:|^Dirty:|^Writeback:|file" /proc/meminfo; sleep 5; done`
下列輸出來自實驗,其中 vm.dirty_ratio
和 vm.dirty_background
的比例分別設定為 2% 和 1% 的實體記憶體。 在此情況下,排清從 3.8 GiB 開始,384 GiB 記憶體系統的 1%。 回寫非常類似對 NFS 的寫入輸送量。
Cons
Dirty: 1174836 kB
Writeback: 4 kB
###
Dirty: 3319540 kB
Writeback: 4 kB
###
Dirty: 3902916 kB <-- Writes to stable storage begins here
Writeback: 72232 kB
###
Dirty: 3131480 kB
Writeback: 1298772 kB