Linux套接字缓冲区不平衡

4
我有一个简单的场景,其中两台服务器通过千兆链路连接。我在两侧都运行iperf来测量吞吐量。
令我惊讶的是,每当我双向运行流量时,它总是偏向于一侧(例如,约900Mbps vs.约100Mbps)。如果我单向运行流量,则每侧均可获得约900Mbps。
如果我将其中一台服务器(低内存)连接到另一台服务器,则双向流量会平衡。因此绝对不是iperf的问题。
其他事实:
- 一台服务器具有相当大的内存(约12GB),而另一台仅有约4GB。 - 两台服务器具有相同的TCP内存配置,在这种情况下,具有相同的TCP读/写内存、核心读/写内存和TX队列长度。 - 两者使用相同的以太网卡(E1000驱动程序)。 - 相同的Linux版本,RedHat 2.6.9。由于12GB内存,大型服务器运行64位版本。 - 除小型SSH和每秒钟偶尔的ping之外,两者均没有其他流量。 - 两者都启用了“tcp_moderate_rcvbuf”。
问题:
1.为什么不平衡? 2.应该查看哪个区域以查看套接字缓冲区在一侧被大量利用,并如何查看? 3.除了iperf之外,还有哪些好的软件(非硬件/测试)可用于测量性能? 4.从以太网环形缓冲区、TCP缓冲区、套接字缓冲区和其他缓冲区中分配内存的方式,最好的方法是什么? 5.可能影响吞吐量的其他实体是什么,我没有涵盖上述内容? 6.是否有任何文档解释Linux如何在用户、内核、设备驱动程序和网络堆栈之间分配内存分配?

只是一条与答案无关的注释。如果您重新编译内核以支持PAE,32位Linux在x86上最多支持64GB的RAM。(我认为选项实际上被命名为64GB Memory)。但64位Linux也很好 :-D。 - Evan Teran
谢谢Evan。我认为我们转向64位的原因是,PAE只增加了物理地址位,而没有增加虚拟地址。不知何故,我们的数据库缓存使用了大量内存,以及其他一些东西。而64位操作系统可以实现可扩展性。 - KOkon
1个回答

1
建议:
  • 查看您的以太网接口的实际设置。 "ethtool" 是一种获取全面信息的方法。 "ifconfig" 也可以告诉您一些信息,但较少。 (两者可能都在 /usr/sbin/ 中。)使用 "dmesg" 查找内核消息可能会告诉您一些信息。查看链路错误率也可能会揭示一些问题。
  • 查询交换机以了解其端口状态的想法也可能揭示实际情况。(如果您只是在接口之间使用 CAT5 电缆而没有交换机,则不相关。)
  • 由于一对机器按预期工作,而另一对机器则不工作,因此我正在考虑双工自协商的某些异常情况。 半双工对于 GigE 来说很不寻常,但也许是您的交换机或 NIC 导致了它。 在任何地方发现半双工设置,特别是主机和其交换机之间关于端口状态的不一致,都可能是可能的原因。

谢谢。我已经查看了ethtool,基本上差异在于流控配置。驱动程序环形缓冲区在两侧都是相同的。我会再进一步尝试一下。谢谢! - KOkon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接