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

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

我試圖確定在同一台主機上運行的兩個 Xen 虛擬機器(客戶端和伺服器)之間 nfs 效能不佳的原因。具體來說,我在客戶端上順序讀取 1GB 檔案的速度遠低於根據測量的兩個虛擬機器之間的網路連接速度以及測量的直接在伺服器上讀取檔案的速度所預期的速度。 VM 運行 Ubuntu 9.04,伺服器使用 nfs-kernel-server 軟體套件。

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

RPCNFSDCOUNT=8:(預設):在用戶端上傳輸 1GB 檔案需要 13.5-30 秒,因此速度為 35-80MB/秒

RPCNFSDCOUNT=16: 18s 抓取檔案 60MB/s

RPCNFSDCOUNT=1:8-9秒捕獲檔案 (!!?!) 125MB/s

RPCNFSDCOUNT=2: 87s 傳輸檔案 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 個用戶端讀取 1 個檔案的情況不一定成立,因此請堅持使用基於頻寬/CPU 規格的執行緒數和預讀取的公式。

相關內容