為什麼我會看到如此低的 SMB 傳輸吞吐量?

為什麼我會看到如此低的 SMB 傳輸吞吐量?

好吧,故事的內容比標題所暗示的要多一些。

背景與環境:我正在透過 SMB 將幾個 TB 從較舊的 Ubuntu 伺服器複製到較新的 Windows 2012 伺服器。 (從技術上講,它是商品硬件,但它們是這裡的伺服器。)每個人都在千兆位元 LAN 上,而舊的 Ubuntu 盒子有一個綁定介面。我相信 Ubuntu 伺服器有兩個 Rosewill PCI-e 1x 乙太網路卡,Windows 伺服器有一個相當不錯的 PCI Intel 乙太網路卡。

目標電腦(Windows 伺服器)正在執行具有 4 個 2TB 磁碟機奇偶校驗的儲存池。它正在運行微軟的新ReFS。來源電腦(Ubuntu 伺服器)正在執行軟體 RAID 鏡像。 EXT4 運作良好。

兩台伺服器透過單一千兆位元交換器運作。我嘗試過打破源(Ubuntu)計算機上的綁定,但沒有任何改進。

問題:我以合理的速度從其他電腦傳輸到 Windows 伺服器時沒有遇到任何問題。其他電腦可以毫無困難地容納 50-80MB/s,但從該 Ubuntu 伺服器傳輸的最高速度不會超過 20MB/s。 20MB/s 的 4+TB 需要很長時間(大約 2.3 天),我想知道我能做些什麼來找出瓶頸在哪裡。

症狀:兩台電腦上的 CPU 都非常小,當然也不會太忙。兩台電腦上的硬碟都處於活動狀態,但並未陷入困境,至少在 Ubuntu 伺服器上,CPU IOwait 幾乎為 0%。

我進行了 35 秒的 Wireshark 追蹤(大概足夠長以確保所有 ACK 都是針對新資料包的),並注意到有很多事情是我沒有預料到的。 (1) 從 Windows 到 Ubuntu 的 ACK(以及一些 SMB 封包)沒有任何校驗和。然而,Wireshark 聲稱這可能是由於「IP 校驗和卸載」造成的。好吧,我裡面有一張非常漂亮的卡片。我想網卡可能可以進行校驗和計算。美好的。繼續... (2) “TCP 已確認未見的段落。”這個我有個問題。據我所知,ACK 數量在可接受的範圍內,而這些訊息通常有巨大的塊。也許 Wireshark 太慢了?

概括:傳輸速度很糟糕(透過千兆乙太網路為 20MB/s),我不知道為什麼。 Wireshark 聲稱 Windows 正在確認 Ubuntu 從未發送的內容。

猜測:我最初的猜測是,更便宜的 Rosewill 卡正在被淹沒。我的第二個猜測是,一端或另一端的軟體 RAID 之類的東西正在被要做的事情淹沒。

答案1

當 Samba(不確定這是否仍然是預設值;很長一​​段時間以來都是預設值)配置為 1024 位元組的預設讀寫套接字緩衝區大小時,您的效能差距與常見體驗相符。

我以前經常在 Linux 和 Mac 機器上看到這種情況。希望情況不再是這樣。

samba 的設定檔中有一個套接字選項參數,您可以在其中設定讀寫套接字緩衝區大小。建議您將兩者都設定為 8192 位元組 (8 KiB)。 4 或 8 KB 通常是相似的,但我還沒有在千兆位元鏈路上進行測試。

另外,不要指望單一 TCP 連線能夠從綁定連結中受益,流量幾乎總是會經過其中一個連結;否則你最終會得到很多無序的資料包需要處理;因此,僅在為多個客戶端提供服務時期望獲得負載平衡優勢。即使如此,您也應該查找不同的綁定模式,並知道至少對於「模式 4」(IEEE 802.3ad) 綁定,基本上有兩種傳輸哈希模式,它們決定在哪個從屬介面上發送。有第 2 層哈希(預設)和第 3 層哈希。如果透過網關傳送大量數據,第 2 層雜湊將無法很好地分佈,因為網關的 MAC 位址將相同。考慮改用第 3 層。

答案2

我曾經在一台Ubuntu 計算機上有兩個以太網卡,由於某種原因,它無法正常工作- 它們似乎都在爭奪相同的數據包,所以有時我會得到回复,有時卻不會,具體取決於另一個網卡是否抓取包裝好的。這很奇怪。我一定是它配置錯誤了,但我以為它會正常工作。當然,這些卡有唯一的 IP 位址。

無論如何,您可以很簡單地在連接到網路的機器上僅使用一張乙太網路卡進行嘗試,以排除這種情況。

相關內容