【问题标题】:Linux Socket Buffer ImbalanceLinux 套接字缓冲区不平衡
【发布时间】:2010-10-03 19:46:45
【问题描述】:

我有一个简单的场景,其中两台服务器通过千兆链路连接。 我在两边都运行 iperf 来测量吞吐量。

令我惊讶的是,每当我双向运行流量时,它总是只支持一侧(例如,~900Mbps 与~100Mbps)。如果我单向运行流量,每一方都有 ~900Mbps。

如果我将其中一台服务器(较低的内存)连接到另一台服务器,双向流量就会被平衡。所以绝对不是 iperf 的问题。

其他事实:

  • 一个服务器有相当大的内存(~12GB),而另一个只有~4GB。
  • 两台服务器具有相同的 TCP 内存配置,在这种情况下,相同的 TCP w/r mem、core w/r mem、TX 队列长度。
  • 两者都使用相同的以太网卡(E1000 驱动程序)。
  • 相同的 Linux 版本,RedHat 2.6.9。由于 12GB 内存,大型服务器运行 64 位版本。
  • 两者都没有其他流量,除了小 SSH 和偶尔的每秒 ping。
  • 两者都开启了“tcp_moderate_rcvbuf”。

问题:

  1. 为什么不平衡?
  2. 我应该查看哪个区域以查看一侧的套接字缓冲区是否被大量使用,以及如何使用?
  3. 除了 iperf,还有哪些优秀的软件(不是硬件/测试仪)来衡量性能?
  4. 了解 Linux 如何从以太网环形缓冲区、TCP 缓冲区、套接字缓冲区和其他缓冲区分配缓冲区的最佳方法是什么?
  5. 还有什么其他实体可能会影响我上面没有提到的吞吐量?
  6. 是否有任何文档说明 Linux 如何在用户、内核、设备驱动程序和网络堆栈之间分配内存?

非常感谢任何建议。

【问题讨论】:

  • 只是一个与答案无关的注释。如果您使用 PAE 支持重新编译内核,则 32 位 linux 在 x86 上支持高达 64GB 的 RAM。 (我认为该选项实际上命名为 64GB 内存)。但是 64 位 Linux 也不错:-D。
  • 谢谢埃文。我认为是移到 64 位的原因,因为 PAE 只增加了物理地址位,而不是虚拟地址。不知何故,我们的数据库东西使用巨大的内存进行缓存,以及其他一切。并且 64 位操作系统允许可扩展性。

标签: linux performance tcp


【解决方案1】:

建议:

  • 查看以太网接口的实际设置。 “ethtool”是一种彻底了解的方法。 “ifconfig”告诉你一些东西,虽然更少。 (可能都在 /usr/sbin/ 中。)用“dmesg”查找内核消息可能会告诉你一些事情。查看链接错误率也可能会发现一些问题。
  • 查询您的交换机以了解其端口状态的概念也可能揭示实际发生的情况。 (如果您只是在接口之间使用 CAT5 电缆,没有开关,则不相关。)
  • 由于一对机器按预期工作,而另一对机器没有,我正在考虑双工自动协商的一些异常情况。半双工对于 GigE 来说是不常见的,但可能是您的交换机或 NIC 导致了它。在任何地方发现半双工设置,或者特别是主机与其交换机之间关于端口状态的分歧,都可能是原因。

【讨论】:

  • 谢谢。我查看了 ethtool,基本上区别在于流控制配置。两侧的驱动程序环形缓冲区相同。我要再玩一下。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多