在多队列 NIC 上最大化 Linux 网络性能

在多队列 NIC 上最大化 Linux 网络性能

根据https://lwn.net/Articles/629155/Linux 内核“只能转发 1M 到 2M 之间的数据包每个核心每秒” - 但是 Linux 在跨数十个核心的扩展能力如何呢?

假设我在多核 CPU 上有一个多队列(128 个 rx+tx 对)100gbps NIC - Linux 是否能够饱和 100gbps NIC,即在几十个核心上扩展“每秒每个核心 1M 到 2M 个数据包”,而无需太多回归来实现 10..20M 数据包/秒的总吞吐量?

我还在某处读到过,Linux 很难将网络性能扩展到 4 核以上——对于最新的内核版本来说也是如此吗?

答案1

意识到主机上的 10 Mpps 正在推动可扩展性,并且需要进行调整才能表现良好。RHEL 网络性能调优指南深入探讨其中的一些内容,从 NIC 卸载到 NUMA 效果。

即使是 1000 字节的小数据包也意味着需要 100 Gb NIC。

10 Mpps 可能每数据包需要 90 纳秒。不是很多,只有几百个 CPU 周期。


简单地降低 10 Mpps,Cloudflare 尝试完全绕过 netfilter,并使用 XDP。如果您的标准主机安全模型假设 netfilter 带有 conntrack,那么这有点奇怪。此外,还会在带宽上作弊,10 Gb NIC 假设通过小数据包拒绝服务。

ESnet已实现78Gbps单流使用大家最喜欢的无用基准 iperf 和 nuttcp。值得注意的是,它们使用了 9000 字节数据包,因此这“仅”是 100 万 PPS。仍然需要进行一些调整,就像您对高端数据库所做的那样:

  • 使用正确的 PCI-E 插槽,至少为 3 x16 版本。
  • 将 CPU 设置为性能而不是省电。
  • CPU 与 NIC 绑定到同一个 NUMA 节点。插槽互连速度很重要
  • 最大 Linux TCP 缓冲区。
  • 更新 NIC 驱动程序和固件。

考虑到旧内核需要进一步调整,这还不算太糟糕。

Cloudflare 和 ESnet 都没有在这些数据包流基准中进行大量计算。做有用的工作将是可扩展性的另一个变量。也许可以扩展:haproxy 到十几个后端主机,每个主机都更容易实现 1 Mpps。也许这仍然会达到 LWN 提到的一些转发可扩展性限制,很难说。


关于最新的内核,那篇 LWN 文章是 5 年前的,不会是最新的。在最新的 NIC 上获取较新的内核以调整您自己的基准。特别是如果您想编写自己的“如何降低 20 Mpps”文章。

相关内容