接收大量 UDP 数据包 & ksoftirqd 负载

接收大量 UDP 数据包 & ksoftirqd 负载

我希望我的服务器能够从 10g 卡处理超过 1Mpps 的速度。这可能吗?我有 Ubuntu 14.04,内核为 3.11,还有一台 16 核 Xeon 机器。看来 ksoftirqd 在 300kpps 时成为瓶颈。

是否有关于如何调整服务器处理此负载的指南?

答案1

这里你需要一个内核旁路引擎(我认为这是最简单的选择)。目前有 2 个流行的引擎可以做到这一点,并且可以达到线速发送数据包:

  • DPDK- 它支持你的卡(Intel 82599)并且应该可以在你的操作系统上运行
  • PF_RING ZC- 还支持您的卡并可以在您的操作系统上运行

我已经使用过它们,经过一段时间的学习后,我必须说它们真的很方便,而且很容易使用

答案2

这是一篇很实用的文章,尽管这是 9 个月前提出的:

https://blog.cloudflare.com/how-to-receive-a-million-packets/

基本上答案是肯定的,非常容易。现在我有一个 UDP 服务器,接收速度为 1.08Mpps,[电子邮件保护]核心Xeon机器,配备Intel 82599 10G NIC。

我的配置基本上是:Ubuntu 14.04,带有 3.13.0-57-lowlatency(LL 有所不同)isolcpus 内核标志,不包括核心 10-19(一个 NUMA 节点)UDP 服务器进程任务集到核心 10 RX 队列硬件中断由核心 11 提供服务RX 队列的 RPS 映射到核心 12

核心 10 的 CPU 使用率为 100%,核心 11 的硬件中断服务率为 ~45%,核心 12 的 ksoftirqd 率为 100%。所有其他核心的使用率都可以忽略不计。

我已经尝试使用全部 20 个核心,并实现了大约 7Mpps,但我确信它可以进一步优化。

当然,您可以只使用 DPDK,而不再处理所有这些中断。

相关内容