我有一个简单的场景,其中两台服务器通过千兆链路连接。我在两侧都运行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如何在用户、内核、设备驱动程序和网络堆栈之间分配内存分配?
令我惊讶的是,每当我双向运行流量时,它总是偏向于一侧(例如,约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如何在用户、内核、设备驱动程序和网络堆栈之间分配内存分配?