完整的MTU不能与启用巨型帧一起使用

我一直在testing,看看是否可以从启用巨型帧获得任何好处。 我已经build立了两台完全相同的戴尔R210服务器,包括至强四核E3122 CPU,8G内存和Broadcom NetXtreme II BCM5716千兆以太网卡。 我在两个系统上运行Debian Squeeze和bnx2networking驱动程序。 服务器在私有子网上各自连接一个网卡,并使用另一个网卡进行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( sudo /sbin/ifconfig eth1 mtu 9000 )为9000个字节的巨型帧configuration,并且通过ping确认两个系统上的MTU( ping -s 8972 -M do <other IP> )。 当我使用netperftesting批量传输时,tcpdump证实大多数数据包使用9000字节的完整MTU,帧大小为9014。

然而,当我testing一个“真正的”应用程序 – 我在一台服务器上设置Postgres,并使用另一台作为客户端,由tcpdump和tshark报告的最大MTU是2160,即使是非常大的select结果集运行到兆字节。 尽pipe在使用iproute2的路由上设置了advmss之类的诡计,但我还是无法让它走得更高。

思考?

TIA。

Postgres可能不是最好的“真正”的应用程序来充分包装巨型框架。 基于旧的列表线程 ,看起来开发人员尝试使用TCP_NODELAY和/或TCP_CORK(禁用Naglealgorithm)来提高性能。

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

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