Linux

在啟用巨型幀的情況下未使用完整 MTU

  • September 3, 2014

我一直在測試是否可以從啟用巨型幀中獲得任何好處。我設置了兩台相同的 Dell R210 伺服器,配備 Xeon 四核 E3122 CPU、8G RAM 和 Broadcom NetXtreme II BCM5716 千兆乙太網卡。我在兩個系統上都使用 bnx2 網路驅動程序執行 Debian Squeeze。這些伺服器在一個私有子網上的一個 NIC 上背靠背連接,我將另一個 NIC 用於 SSH 和監視。我添加了我知道的作業系統調整參數:

sysctl -w net.core.rmem_max=134217728             
sysctl -w net.core.wmem_max=134217728             
sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"  
sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"  
sysctl -w net.core.netdev_max_backlog=300000  
sysctl -w net.ipv4.tcp_sack=0  
sysctl -w net.ipv4.tcp_fin_timeout=15  
sysctl -w net.ipv4.tcp_timestamps=0    
ifconfig ethX txqueuelen 300000  
ethtool -K eth1 gso on

Ethtool -k輸出顯示

rx-checksumming: on  
tx-checksumming: on
scatter-gather: on   
tcp-segmentation-offload: on  
udp-fragmentation-offload: off  
generic-segmentation-offload: on  
generic-receive-offload: on  
large-receive-offload: off  
ntuple-filters: off  
receive-hashing: off

兩台伺服器都通過 ifconfig () 配置為 9000 字節巨型幀sudo /sbin/ifconfig eth1 mtu 9000,我通過 ping () 確認了兩個系統上的 MTU ping -s 8972 -M do <other IP>。當我使用 netperf 測試批量傳輸時,tcpdump 確認大多數數據包使用 9000 字節的完整 MTU,幀大小為 9014。

但是,當我使用“真實”應用程序進行測試時——我在一台伺服器上設置 Postgres,並將另一台伺服器用作客戶端,tcpdump 和 tshark 報告的最大 MTU 為 2160,即使對於結果集執行到兆字節的非常大的選擇也是如此。儘管嘗試了像使用 iproute2 在路由上設置 advmss 這樣的騙術,但我無法讓它變得更高。

想法?

TIA。

Postgres 可能不是完全打包巨型幀的最佳“真實”應用程序。基於舊的列表執行緒,開發人員似乎已嘗試使用 TCP_NODELAY 和/或 TCP_CORK(禁用 Nagle 算法)來提高性能。

嘗試使用不同的應用程序,例如…

  • HTTP(一台主機上的網路伺服器,在另一台伺服器上拉取大文件)
  • NFS(使用“rsize=8192,wsize=8192”掛載)
  • 使用 SOAP 公開您的 postgres 數據
  • 嘗試 MySQL、DB2 Express、Oracle XE、Sybase Anywhere(4k 數據包或更大)。如果其他一些數據庫使用相同的表、數據和查詢更好地填充巨型數據包,請向 Postgres 開發人員送出一份錯誤報告。

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