tcpdump 提高 udp 性能

Rub*_*oms 13 performance udp tcpdump graphite statsd

我正在运行一组负载测试以确定以下设置的性能:

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 运行,具有以下设置:

  • 英特尔至强 E5-2630 v2 @ 2.60GHz
  • 2GB 内存
  • Ubuntu 14.04 x86_64

我已经检查过潜在原因的事情:

  • 增加 UDP 缓冲区接收/发送大小。
  • CPU 负载影响测试。(最大负载 40-50%,客户端和服务器端)
  • 在特定接口而不是“任何”上运行 tcpdump。
  • 使用“-p”运行 tcpdump 以禁用混杂模式。
  • 仅在服务器上运行 tcpdump。这导致发生 20% 的数据包丢失并且似乎不会影响测试。
  • 仅在客户端上运行 tcpdump。这导致了性能的提高。
  • 将 netdev_max_backlog 和 netdev_budget 增加到 2^32-1。这没有任何区别。
  • 在每个网卡上尝试了所有可能的混杂模式设置(服务器打开和客户端关闭,服务器关闭和客户端打开,都打开,都关闭)。这没有任何区别。

Cam*_*err 10

当 tcpdump 运行时,它会非常迅速地读取传入的帧。我的假设是 NIC 的数据包环形缓冲区设置可能有点小;当 tcpdump 运行时,它会以更及时的方式清空。

如果您是 Red Hat 订阅者,那么这篇支持文章是非常有用的数据包接收概述。它有一些我认为你还没有考虑过的东西。

考虑您的系统如何处理 IRQ;考虑增加网络接口的“dev_weight”(意味着更多的数据包从 NIC 读取到用户空间);查看应用程序读取套接字的频率(是否可以使用专用线程,是否存在有关可扩展性的已知问题/解决方法)。

增加 NIC 帧缓冲区(使用ethtool命令 -- 查看--set-ring等参数)。

查看“接收端缩放”并至少使用那么多接收线程来读取流量。

我想知道 tcpdump 是否正在做一些很酷的事情,例如使用内核对数据包环形缓冲区的支持。这将有助于解释您所看到的行为。


sho*_*hok 2

你用什么电源调速器?我见过“按需”或“保守”州长的类似行为。

尝试使用“性能”调节器并禁用服务器 BIOS 中的任何节能功能。

它会改变什么吗?