我正在运行一组负载测试以确定以下设置的性能:
Node.js test suite (client) --> StatsD (server) --> Graphite (server)
Run Code Online (Sandbox Code Playgroud)
简而言之,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
Run Code Online (Sandbox Code Playgroud)
在一个特定的测试案例中,我发送 40000 个指标/秒。运行tcpdump的测试有4%左右的丢包,没有的时候有20%左右的丢包
两个系统都作为 Xen VM 运行,具有以下设置:
我已经检查过潜在原因的事情: