0

我有一个在同一主机上运行的 tcp 客户端和服务器。客户端发送消息,服务器确认它,客户端发送下一条消息。在任何时候,只有一个未确认的未确认消息。消息大小为 1KB。家用电脑运行 CentOs 6.3,办公服务器运行 RHEL 6.3

当我在家用计算机上运行上述客户端服务器时,我获得了非常一致的吞吐量,大约每秒 41k 条消息。办公服务器只有 1% 的 CPU 负载。但是,如果我在我的办公室服务器上运行相同的客户端/服务器,我的吞吐量会在 18k-50K 之间......吞吐量波动很大。任何人都可以提供建议

  1. 同一主机上 tcp 波动的可能原因是什么?

  2. 关于如何调试 tcp 性能的任何想法?

更新:- 我没有使用环回地址,而是分配给 eth1 的 IP。尽管 eth1 的 IP 不在 /etc/hosts 中并不重要,因为第一个请求会导致查找被缓存。

更新 1:- 在环回地址上运行,产生相同的波动输出。此外,当我查看时cat /proc/interrupts,我看到每个 NIC 有 5 个 rx 队列和 1 个 tx 队列。是 5rx 队列导致可变性吗?

4

1 回答 1

0

以下是我能立即想到的一些可能性:

  • 丢包,这会导致拥塞窗口缩小(在您的本地主机上不太可能)
  • 应用程序瓶颈,这将导致接收器窗口缩小(比第一个不太可能)
  • 出于某种原因适用于 localhost 的流量整形。试试看tc qdisc有没有什么东西在 lo 上。也看看iptables。
  • CPU 调度限制您的客户端或服务器。您是否有通过 cgroup 强加的 CPU 份额,可能会不时抢占您的进程?
  • 间歇性开销,例如在测试期间开始记录并延迟数据包到达。或者一个 IDS 突然决定开始监视你的活动。
  • 测量不准确,例如运行测试的时间太短
  • 由于过多的队列颠簸导致实时锁降级。本文对此类案例提供了很好的见解:https ://cs.uwaterloo.ca/~brecht/papers/getpaper.php?file=usenix-2004.pdf
  • 您的客户端或服务器中的错误。例如,您应该检查 send() 是否返回 1024,如果没有,则采取适当的措施,而不是假设如果没有错误,一切都已通过。

我调试的方法是:

  • 首先使用标准测量工具,例如 iperf (yum install iperf)。然后iperf -s在一个终端上,iperf -c localhost在另一个终端上。您是否获得稳定的结果,如果是,那么问题是您的客户端和服务器中的错误。
  • 如果是 TCP,那么 iperf 会提供一些诊断,例如定期打印窗口大小。您还可以检查lo接口是否有丢包,以及 /proc/sys/ipv4 中的其他统计信息。
于 2013-01-07T05:01:19.613 回答