Linux 6.8 网络优化, 大量并发连接的TCP性能提高40%左右

除了通常的新有线/无线网络硬件支持和大型 Linux 网络子系统中的其他例行变动之外,Linux 6.8 内核还对核心网络代码进行了一些关键改进,当遇到许多并发网络连接时,TCP 性能可以提高 ~40%。

首先,对核心网络结构进行了分析和重组。这项工作一直围绕着优化缓存行的使用和添加保护措施,以确保未来的更改不会倒退。反过来,这种对核心网络结构的优化导致许多并发连接的 TCP 性能提高了 40% 或更多!

Google 的 Coco Li 解释了他们对网络代码的 cachline 优化工作:

当前,网络栈中的变量密集结构按时间顺序、逻辑顺序组织,有时按缓存行访问组织。这个补丁系列试图重新组织核心网络栈变量,以在数据传输阶段最小化缓存行消耗。具体来说,我们研究了TCP/IP栈和TCP中的快速路径定义。
出于文档目的,我们还为我们考虑的每个核心数据结构添加了新的文件,尽管由于现有缓存行跨度的数量,并非所有在快速路径上都已被修改。在文档中,我们记录了我们在快速路径上识别的所有变量及原因。我们还希望在未来添加/修改变量时,可以参考并相应地更新文档,以反映最新变量组织。

测试:我们的测试使用neper tcp_rr测试tcp流量。测试具有$cpu数量的线程和可变数量的流量(见下文)。测试在6.5-rc1上运行 效率计算为cpu秒数/吞吐量(一个tcp_rr往返行程)。下面的结果显示在应用补丁系列之前和之后的效率delta。

  • 在AMD平台上, 100Gb/s 的网卡和 256Mb 三级缓存:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IPv4
Flows with patches clean kernel Percent reduction
30k 0.0001736538065 0.0002741191042 -36.65%
20k 0.0001583661752 0.0002712559158 -41.62%
10k 0.0001639148817 0.0002951800751 -44.47%
5k 0.0001859683866 0.0003320642536 -44.00%
1k 0.0002035190546 0.0003152056382 -35.43%
IPv6
Flows with patches clean kernel Percent reduction
30k 0.000202535503 0.0003275329163 -38.16%
20k 0.0002020654777 0.0003411304786 -40.77%
10k 0.0002122427035 0.0003803674705 -44.20%
5k 0.0002348776729 0.0004030403953 -41.72%
1k 0.0002237384583 0.0002813646157 -20.48%
  • 在Intel平台上, 200Gb/s 的网卡和 205Mb 三级缓存:
1
2
3
4
5
6
7
IPv6
Flows with patches clean kernel Percent reduction
30k 0.0006296537873 0.0006370427753 -1.16%
20k 0.0003451029365 0.0003628016076 -4.88%
10k 0.0003187646958 0.0003346835645 -4.76%
5k 0.0002954676348 0.000311807592 -5.24%
1k 0.0001909169342 0.0001848069709 3.31%

对于Intel的服务器,优化不是那么明显,但是对于对于AMD EPYC服务器而言,这是一个天使般的改进,它们的网络性能提高了 40% 左右,这是一个巨大的提升。

相关的优化补丁可以查看Analyze and Reorganize core Networking Structs to optimize cacheline consumption, 主要由谷歌的Coco Li提交。

tcp的优化已经实现了,udp的优化还会远吗?