同一主机上的tcp可变性

时间:2013-01-07 03:56:14

标签: linux tcp

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

  • 数据包丢弃,导致拥塞窗口缩小(在本地主机上的情况下不太可能)
  • 应用程序瓶颈,会导致接收器窗口缩小(比第一次更不可能)
  • 由于某种原因适用于localhost的流量整形。试试tc qdisc,看看是否有什么东西在上面。另外看看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中的其他统计信息。