Linux NFS 預先讀取

本頁面說明如何在掛接 NetApp Volumes 的 Linux 用戶端上調整 NFS 預先讀取設定。預先讀取功能可讓核心在應用程式要求檔案區塊前預先擷取,進而提升循序讀取輸送量。預先讀取功能不會取代掛接選項或並行調整作業,請先設定這些項目。詳情請參閱「最佳化 Linux NFS 用戶端」。

事前準備

調整 NFS 預先讀取設定前,請先完成下列先決條件:

  • 如要調整時段表或工作階段時段,請先完成「Linux NFS 並行」。

  • 使用適當的 Linux NFS 掛接選項 (包括 rsize) 掛接磁碟區。如需更多資訊,請參閱「Linux NFS 掛接選項」。

  • 掛接磁碟區後,請調整預先讀取設定。

預先讀取總覽

當應用程式循序讀取檔案時,Linux NFS 用戶端可以要求目前讀取作業以外的額外資料。這會隱藏網路延遲,並提高循序工作負載的處理量,例如記錄重播、媒體串流、大量複製和部分分析掃描。

預先讀取是針對每個掛接點設定,對於隨機讀取工作負載的效果,不如循序讀取工作負載。

預設值和 rsize

許多 Linux 發行版會將預先讀取設為 rsize 的約 15 倍。部分發行版會使用固定的 128 KiB 預先讀取,不論 rsize 為何,這可能會在升級後降低循序讀取效能。變更前,請先檢查已掛接檔案系統的目前值。

查看掛接點的預先讀取

每個 NFS 掛接點在 /sys/class/bdi/ 下都有對應的備份區塊裝置。如要找出支援區塊裝置 ID (BDI) 並查看目前的 read_ahead_kb 值,請完成下列步驟:

  1. /proc/self/mountinfo 中找出掛接點,並記下第三個欄位中的 BDI ID。

  2. 以 KB 為單位讀取值:

    cat /sys/class/bdi/BDEV/read_ahead_kb
    

選擇預先讀取值

請按照下列規範,為工作負載選取適當的預先讀取值:

  • 如果不需要最高效能,請保留預設的分配方式,並不要調整預先讀取。

  • 如果發行平台不再自動設定,請先從 15 倍 rsize (以 KiB 為單位) 開始。

  • 對於 rsize=1048576 (1 MiB),15 倍的 rsize 大約是 15,360 KiB (15 MiB)。

  • 逐步增加或減少值,並使用應用程式和 nfsiostat 評估效能。請先測試大於 15,360 KiB 的值,再用於實際工作環境。

預先讀取會與頁面快取互動。略過快取的工作負載 (O_DIRECT) 無法像循序快取讀取作業一樣,從預先讀取功能獲益。

在重新啟動後保留預先讀取功能

動態變更會套用至卸載或重新啟動為止。如要保留 NFS 掛接的這些變更,請建立 udev 規則。

  1. 建立 /etc/udev/rules.d/99-nfs-readahead.rules,並視需要調整 read_ahead_kb 值:

    SUBSYSTEM=="bdi", ACTION=="add", PROGRAM="/usr/bin/awk -v bdi=$kernel 'BEGIN{ret=1} {if ($4 == bdi) {ret=0}} END{exit ret}' /proc/fs/nfsfs/volumes", ATTR{read_ahead_kb}="15360"
    
  2. PROGRAM= 屬性中,使用系統上 awk 的絕對路徑。

  3. 重新載入 udev

    sudo udevadm control --reload
    
  4. 重新掛接 NFS 磁碟區或重新啟動,以觸發新 BDI 裝置的規則。

請先在非正式版主機上測試 udev 規則。如果比對運算式有誤,錯誤的規則可能會影響非 NFS 區塊裝置。

工作負載指引

調整預先讀取時,請根據工作負載類型考量下列指引:

  • 隨機讀取 (OLTP,少量隨機 I/O):保留預設的預先讀取設定。

  • 循序讀取 (媒體、大量複製和部分高效能運算): 增加至 15 倍 rsize 並測量。

  • 混合:只有在剖析顯示循序讀取瓶頸時,才進行調整。

  • rsize (64 KiB),預設讀取預先載入大小為 128 KiB:請考慮將讀取預先載入大小增加至 960 KiB 以上。

將預先讀取微調功能與適當的 rsizenconnect 和並行設定結合。

後續步驟