接收许多UDP数据包和ksoftirqd负载

我希望我的服务器能够处理10g卡以上的1Mpps。 可能吗? 我有Ubuntu 14.04内核3.11和一个16核心Xeon机器。 ksoftirqd似乎成为300kpps的瓶颈。

有没有任何指导如何调整服务器处理这个负载?

你在这里需要的是一个内核绕过引擎(这是我认为最简单的select)。 目前有两种stream行的引擎可以实现这一点,并且可以以线速发送数据包:

  • DPDK – 它支持您的卡 (英特尔82599),并应在您的操作系统上工作
  • PF_RING ZC – 也支持你的卡,应该在你的操作系统

我已经使用了他们两个,经过一段时间的学习,我必须说他们非常方便,易于使用

这里有一个方便的文章,即使这是9个月前问:

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

基本上答案是肯定的,很容易。 现在我有一个UDP服务器接收1.08Mpps,在一个20.6GHz的核心Xeon机器与英特尔82599 10G网卡。

我的configuration基本上是:具有3.13.0-57-lowlatency的Ubuntu 14.04(LL有区别)isolcpus内核标志排除核心10-19(一个NUMA节点)UDP服务器进程任务设置到核心10 RX队列硬件中断服务的核心11 RPS为RX队列映射到核心12

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

我已经尝试过使用全部20个核心的100%,并达到了7Mpps左右,但我相信它可以进一步优化。

当然,你可以使用DPDK,并停止所有这些中断。