Linux

奇怪的 nfs 性能:1 執行緒優於 8,8 優於 2!

  • January 4, 2011

我正在嘗試確定在同一主機上執行的兩個 Xen 虛擬機(客戶端和伺服器)之間 nfs 性能不佳的原因。具體來說,我可以在客戶端順序讀取 1GB 文件的速度遠低於基於測量的兩個 VM 之間的網路連接速度和測量的直接在伺服器上讀取文件的速度所預期的速度。VM 執行的是 Ubuntu 9.04,伺服器使用的是 nfs-kernel-server 包。

根據各種 NFS 調整資源,更改 nfsd 執行緒的數量(在我的例子中是核心執行緒)會影響性能。通常,此建議的框架是在頻繁使用的伺服器上增加預設值 8 的數量。我在目前配置中找到的內容:

RPCNFSDCOUNT=8:(預設):13.5-30 秒在客戶端上 cat 一個 1GB 文件,因此 35-80MB/秒

RPCNFSDCOUNT=16: 18s 到 cat 文件 60MB/s

RPCNFSDCOUNT=1: 8-9 秒cat 文件 (!!?!) 125MB/s

RPCNFSDCOUNT=2: 87s 到 cat 文件 12MB/s

我應該提到我正在導出的文件位於使用 Xen 的 PCI 直通安裝在伺服器上的 RevoDrive SSD 上;在伺服器上,我可以在幾秒鐘內(> 250MB/s)對文件進行分類。在每次測試之前,我都會在客戶端上刪除記憶體。

我真的不想讓伺服器只配置一個執行緒,因為我猜當有多個客戶端時它不會工作得那麼好,但我可能會誤解它是如何工作的。我已經重複了幾次測試(中間更改了伺服器配置),結果相當一致。所以我的問題是:為什麼 1 個執行緒的性能最好?

我嘗試過改變的其他一些事情,效果很小或沒有:

  • 將 /proc/sys/net/ipv4/ipfrag_low_thresh 和 /proc/sys/net/ipv4/ipfrag_high_thresh 的值從預設的 192K、256K 增加到 512K、1M
  • 將 /proc/sys/net/core/rmem_default 和 /proc/sys/net/core/rmem_max 的值從預設的 128K 增加到 1M
  • 使用客戶端選項安裝 rsize=32768, wsize=32768

從 sar -d 的輸出中,我了解到到底層設備的實際讀取大小相當小(<100 字節),但這在客戶端本地讀取文件時不會導致問題。

RevoDrive 實際上暴露了兩個“SATA”設備 /dev/sda 和 /dev/sdb,然後 dmraid 拾取了一個 fakeRAID-0 條帶,我已將其掛載到 /mnt/ssd,然後綁定掛載到 /export/ssd。我已經使用這兩個位置對我的文件進行了本地測試,並看到了上面提到的良好性能。如果答案/評論要求更多詳細資訊,我將添加它們。

當客戶端請求進入時,它會被移交給其中一個執行緒,並要求其餘執行緒執行預讀操作。讀取文件的最快方法是讓一個執行緒按順序執行……因此,對於一個文件來說,這太過分了,執行緒本質上是在為自己做更多的工作。但是,當您在現實世界中部署時,1 個客戶端讀取 1 個文件的情況不一定是正確的,因此請堅持使用基於頻寬/cpu 規格的執行緒數和預讀數的公式。

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