我正在运行一组负载测试以确定以下设置的性能:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
简而言之,node.js测试套件每隔x秒就会向另一台服务器上的StatsD实例发送一定数量的指标。然后,StatsD每秒将指标刷新到位于同一服务器上的Graphite实例。然后,我查看测试套件实际发送了多少度量,以及Graphite收到了多少度量,以确定测试套件与Graphite之间的数据包丢失。
但是我注意到有时我会有非常大的丢包率(注意它是通过UDP协议发送的),范围从20%到50%。因此,当我开始查看这些数据包的丢弃位置时,发现StatsD可能是一些性能问题。因此,我开始记录系统各个部分的指标,以跟踪发生此下降的位置。这就是事情变得奇怪的地方。
我正在使用tcpdump创建一个捕获文件,在测试运行完成后检查该文件。但是每当我在运行tcpdump的情况下运行测试时,几乎都不存在数据包丢失的情况!看起来tcpdump某种程度上提高了我的测试性能,但我不知道为什么以及如何做到这一点。我正在运行以下命令来在服务器和客户端上记录tcpdump消息:
tcpdump -i any -n port 8125 -w test.cap
在一个特定的测试案例中,我正在发送40000个指标/秒。运行tcpdump时的测试的数据包丢失率约为4%,而没有进行测试的数据包丢失率约为20%
这两个系统均通过以下设置作为Xen VM运行:
- 英特尔至强E5-2630 v2 @ 2.60GHz
- 2GB RAM
- Ubuntu 14.04 x86_64
我已经检查过的潜在原因:
- 增加UDP缓冲区的接收/发送大小。
- 影响测试的CPU负载。(客户端和服务器端的最大负载为40-50%)
- 在特定接口而不是“ any”上运行tcpdump。
- 使用'-p'运行tcpdump以禁用混杂模式。
- 仅在服务器上运行tcpdump。这导致发生20%的数据包丢失,并且似乎不影响测试。
- 仅在客户端上运行tcpdump。这样可以提高性能。
- 将netdev_max_backlog和netdev_budget增加到2 ^ 32-1。这没什么区别。
- 在每个nic上尝试了混杂模式的所有可能设置(服务器打开和客户端关闭,服务器关闭和客户端打开,都打开,都关闭)。这没什么区别。
ifconfig eth0 promisc
启用和ifconfig eth0 -promisc
禁用混杂模式。如果有所不同,请尝试比较两台机器上Promisc开/关的4种可能组合。这可能有助于查明问题的根源。
-p
选项以跳过此操作,以查看是否有所不同。