【发布时间】: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”。
问题:
- 为什么不平衡?
- 我应该查看哪个区域以查看一侧的套接字缓冲区是否被大量使用,以及如何使用?
- 除了 iperf,还有哪些优秀的软件(不是硬件/测试仪)来衡量性能?
- 了解 Linux 如何从以太网环形缓冲区、TCP 缓冲区、套接字缓冲区和其他缓冲区分配缓冲区的最佳方法是什么?
- 还有什么其他实体可能会影响我上面没有提到的吞吐量?
- 是否有任何文档说明 Linux 如何在用户、内核、设备驱动程序和网络堆栈之间分配内存?
非常感谢任何建议。
【问题讨论】:
-
只是一个与答案无关的注释。如果您使用 PAE 支持重新编译内核,则 32 位 linux 在 x86 上支持高达 64GB 的 RAM。 (我认为该选项实际上命名为 64GB 内存)。但是 64 位 Linux 也不错:-D。
-
谢谢埃文。我认为是移到 64 位的原因,因为 PAE 只增加了物理地址位,而不是虚拟地址。不知何故,我们的数据库东西使用巨大的内存进行缓存,以及其他一切。并且 64 位操作系统允许可扩展性。
标签: linux performance tcp