启用巨型帧时未使用完整 MTU

启用巨型帧时未使用完整 MTU

我一直在测试启用巨型帧是否能带来好处。我设置了两台相同的 Dell R210 服务器,分别配备 Xeon 四核 E3122 CPU、8G RAM 和 Broadcom NetXtreme II BCM5716 千兆以太网卡。我在两个系统上运行 Debian Squeeze 和 bnx2 网络驱动程序。服务器在私有子网上背对背连接,分别使用一个 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 确认大多数数据包使用完整的 MTU 9000 字节,帧大小为 9014。

但是,当我使用“真实”应用程序进行测试时 - 我在一台服务器上设置 Postgres,并使用另一台服务器作为客户端,tcpdump 和 tshark 报告的最大 MTU 为 2160,即使对于结果集达到兆字节的非常大的选择也是如此。尽管尝试过使用 iproute2 在路由上设置 advmss 等花招,但我无法让它变得更高。

有什么想法吗?

短暂性脑缺血。

答案1

Postgres 可能不是完全打包巨型帧的最佳“真正”应用程序。基于旧列表线程,看起来开发人员已经尝试使用 TCP_NODELAY 和/或 TCP_CORK(禁用 Nagle 算法)来提高性能。

尝试使用不同的应用程序,例如......

  • HTTP(一台主机上的 Web 服务器,另一台服务器上拉取大文件)
  • NFS(使用“rsize=8192,wsize=8192”挂载)
  • 使用 SOAP 公开你的 postgres 数据
  • 尝试 MySQL、DB2 Express、Oracle XE、Sybase Anywhere(使用 4k 或更大的数据包)。如果其他数据库使用相同的表、数据和查询更好地填充巨型数据包,请向 Postgres 开发人员提交错误报告。

相关内容