Linux
在啟用巨型幀的情況下未使用完整 MTU
我一直在測試是否可以從啟用巨型幀中獲得任何好處。我設置了兩台相同的 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 () 確認了兩個系統上的 MTUping -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 開發人員送出一份錯誤報告。