Linux NFS 並行

本頁面說明如何調整 NetApp Volumes 的 Linux NFS 用戶端並行。

並行是指用戶端與磁碟區之間一次可進行的未完成 NFS 作業數量。調整並行作業有助於配合伺服器限制,避免佇列深度過大而導致效能下降。

在 Linux 上,並行作業是由時段表項目 (NFSv3) 或 NFSv4.1 工作階段時段控制,而非掛接選項。請先設定這些項目,再掛接 NFS 檔案系統,或在變更後重新掛接。

如要瞭解掛接選項 (例如 nconnect),請參閱「Linux NFS 掛接選項」。如要進一步瞭解設定順序,請參閱「最佳化 Linux NFS 用戶端」。

術語

以下重要詞彙與 Linux NFS 並行相關:

  • RPC 時段表:用戶端 (NFSv3) 待處理 NFS RPC 作業的每個 TCP 連線限制。

  • 工作階段時段:用戶端與伺服器之間工作階段的待處理指令 NFSv4.1 限制。

  • 儲存空間端點:用戶端掛接的單一磁碟區 IP 位址。

  • nconnect:掛接選項,可開啟多個連線至相同端點的 TCP 連線,並將每個連線的並行數相乘。

Linux 參數

下表列出用於設定各通訊協定版本 NFS 並行作業的參數和設定檔:

通訊協定 參數 設定
NFSv3 sunrpc.tcp_max_slot_table_entries /etc/sysctl.confsysctl -p
NFSv3 sunrpc.tcp_slot_table_entries 部分發行版本;請參閱發行版本說明文件
NFSv4.1 max_session_slots /etc/modprobe.d/ (例如 nfsclient.conf),然後重新啟動

NFSv3

以下各節說明 NFSv3 用戶端和伺服器限制、nconnect對並行作業的影響、如何估算並行作業需求,以及如何設定時段限制。

用戶端和伺服器限制

NFSv3 不會協商用戶端與伺服器之間的並行作業,雙方都會套用自己的限制。

  • NetApp Volumes NFSv3 伺服器:每個 TCP 連線最多 128 個執行環境。

  • 新版 Linux 用戶端 (預設)sunrpc.tcp_max_slot_table_entries = 65536

預設用戶端時段數超出伺服器限制是不必要的。 如果用戶端傳送的待處理作業數量超出伺服器能有效處理的範圍,伺服器可能會縮減 TCP 視窗,進而影響效能。

建議:每個連線將 sunrpc.tcp_max_slot_table_entries 設為 128 以下。對於有許多用戶端和連線的環境,請將每個儲存端點的未完成運算單元總用量維持在 10,000 以下。

nconnect 對 NFSv3 並行的影響

單一用戶端的約略並行上限計算方式如下:

(sunrpc.tcp_max_slot_table_entries per connection) x (nconnect value)

並行值上限為每個連線的伺服器數 (128),以及您的工作負載需求。

範例 1:預設時段,沒有 nconnect

  • 一個 TCP 連線。

  • 用戶端最多可嘗試 65,536 項未完成的作業,但伺服器每個連線最多接受 128 項作業。

  • 受限於伺服器 128 個並行作業的上限,實際並行作業數會受到限制。

範例 2:128 個時段,沒有 nconnect

  • sunrpc.tcp_max_slot_table_entries=128

  • 單一連線。

  • 用戶端和伺服器會對齊 128 項待處理作業。

範例 3:100 個時段,nconnect=8

  • 八個 TCP 連線。

  • 每個連線最多可有 100 項待處理作業。

  • 每個用戶端最多可有 800 項待處理作業 (8 x 100),但每個連線的伺服器上限為 128。

範例 4:多個用戶端 (EDA 樣式)

  • 250 個用戶端,每個用戶端都有 sunrpc.tcp_max_slot_table_entries=8 和沒有 nconnect

  • 每個用戶端在每個連線中最多可有八項待處理作業。

  • 用戶端總計:一個大量 IP 最多可有 2,000 項待處理作業 (250 x 8),符合 10,000 個運算單元的端點指南。

水平擴展用戶端時,請使用較低的每個用戶端運算單元值。請在個別高輸送量用戶端上使用 nconnect,而非做為農場範圍內時段規劃的替代方案。

使用 Little 定律估算所需並行數

請使用下列公式估算工作負載所需的並行數:

並行 = (作業率) x (延遲時間,以秒為單位)

範例:多個用戶端,一個端點

以 256 KiB 的平均 I/O 和 10 毫秒的延遲時間為目標,達到 4,000 MiBps:

  • 作業率:約 16,000 IOPS。

  • 並行:大約 16,000 x 0.010 = 160。

  • 1,250 個用戶端:如果平均分配,每個用戶端約有 0.13 個時段 (160 / 1,250)。每個用戶端使用小型整數 (例如 2、4 或 8),以維持 10,000 個時段上限以下的空間。

設定 sunrpc.tcp_max_slot_table_entries (NFSv3)

在許多 Linux 發行版中,systemd-sysctl 會在載入 sunrpc 核心模組前執行。開機時,系統會忽略 /etc/sysctl.conf/etc/sysctl.d/ 中的 sunrpc.* 項目。如果沒有使用下列其中一種持續性方法,開機後執行 sysctl -p 只會生效到下次重新啟動為止。

方法 1:如果測試結果顯示低於 128 的值就足夠,請使用該值。除非發布說明文件另有規定,否則請將 tcp_slot_table_entriestcp_max_slot_table_entries 設為相同的值。

變更這些設定後,請掛接或重新掛接 NFS 檔案系統。設定生效後建立的 RPC 傳輸作業,都會套用時段設定。

方法 2 (建議)/etc/modprobe.d/ 中的模組選項

首次使用 NFS 時,系統會在開機後載入 sunrpc,並套用模組參數。這些設定會在重新啟動後保留,因此不需要在開機時設定 sysctl

  1. 建立 /etc/modprobe.d/sunrpc.conf

    options sunrpc tcp_slot_table_entries=128 tcp_max_slot_table_entries=128
    
  2. 如果發行版本在 modprobe 變更後需要重建 initramfs,請重建 initramfs。當模組位於 initramfs 中時,RHEL 通常會需要重建。詳情請參閱 Linux 供應商說明文件。

  3. 只有在沒有作用中的 NFS 掛接,且執行手冊允許的情況下,才能重新啟動或卸載並重新載入 sunrpc

  4. 確認已載入 sunrpc,並已設定預期值:

    cat /proc/sys/sunrpc/tcp_slot_table_entries
    cat /proc/sys/sunrpc/tcp_max_slot_table_entries
    
  5. 掛接或重新掛接 NetApp Volumes 匯出內容。

NFSv4.1

以下各節說明 NFSv4.1 工作階段的協商方式、提供效能最佳化範例,並說明如何設定工作階段運算單元限制。

工作階段協議

NFSv4.1 會在用戶端和伺服器之間建立工作階段。用戶端和伺服器會選取兩個支援值中較低者,藉此交涉未完成指令的數量上限 (max_reqs)。

  • NetApp Volumes NFSv4.1 伺服器:每個工作階段 180 個指令。

  • Linux 用戶端預設值:64 (max_session_slots)。

  • 協商的工作階段:用戶端和伺服器值的最小值,通常為 64 (預設用戶端)。

每個伺服器的 TCP 連線最多可支援 128 個未完成的 NFS 指令。預設有 64 個工作階段時段和單一連線,因此並行作業最多只能有 64 個。如要透過連線使用更多工作階段時段,請僅針對非 Kerberos 掛接使用 nconnect=2 以上版本。如要進一步瞭解掛接選項,請參閱「Linux NFS 掛接選項」。

範例 1預設 64 個工作階段時段,沒有 nconnect

  • 單一連線。

  • 每個工作階段最多可有 64 個待處理指令。

範例 264 個工作階段時段,nconnect=2

  • 工作階段的總時段數仍為 64 個,會分成兩個連線,每個連線約 32 個時段。

  • 這項設定可降低每個連線的佇列深度,進而縮短延遲時間,同時不會增加總並行數。

範例 3max_session_slots=180,沒有 nconnect

  • 每個工作階段最多可執行 180 個指令,且每個連線最多只能有 128 個待處理作業。

  • 有效限制為 128。

示例 4max_session_slots=180, nconnect=2

  • 工作階段最多可透過兩個連線使用 180 個指令,或每個連線約 90 個指令。

  • 如要在工作階段層級超過單一連線 128 的上限,就必須進行這項設定。

如要在 NetApp Volumes 上達到最大 NFSv4.1 並行,且不使用 Kerberos,請設定 max_session_slots=180 並使用 nconnect=2 以上版本。請使用工作負載測試這項設定。

設定 NFSv4.1 的工作階段時段上限

  1. 建立 /etc/modprobe.d/nfsclient.conf

    options nfs max_session_slots=180
    
  2. 重新啟動用戶端。

  3. 至少有一個 NFSv4.1 掛接點後,請驗證設定:

    systool -v -m nfs
    
  4. 確認輸出內容中顯示 max_session_slots

這些變更需要重新啟動標準 Linux NFS 用戶端封裝。請據此規劃維護作業。

多重用戶端和大容量磁碟區

  • 多個 VM,一個磁碟區 IP:減少每個用戶端的 sunrpc.tcp_max_slot_table_entries

  • 大容量,且有多個 IP 位址:每個用戶端到 IP 的連線都有配額限制。盡可能將用戶端分散至各端點。詳情請參閱「連線至多個儲存空間端點的大容量磁碟區」。

後續步驟