以下是我们的设置:一台配备两个 10G LAN 端口的 DELL 服务器,旧内核 4.13.4,使用 nginx(约 8000 个活动连接)提供静态视频内容,峰值带宽约为 15.5G(1.2Mpps)。我们使用由以下代码构建的 Ubuntu 低延迟内核:http://kernel.ubuntu.com/~kernel-ppa/mainline/无需对 debian/ubuntu 补丁附带的默认配置进行任何更改(为了简化这个问题)。
所以我们采用了当时的新内核 4.18.8,并以去年对 4.13.x 所做的相同方式构建它,但它是一个极大的失败。绑定的性能确实很差,网络峰值没有超过 10.5G,负载也没有比旧内核 4.13.4 更高 - 我们每 10 秒收集一次系统和网络统计数据,负载和 IO 几乎相同 - 磁盘 IO 没有问题,它们是几个 SSD。我们试图追踪问题 - 我们尝试了 4.14.x(在 spectre 和 meltdown 激活之前为 4.14.10)、4.17.x 和 4.18.x,激活和未激活 spectre 和 meltdown(我们可以关闭它们)。基本上,我们在 4.17.x 和 4.18.x 上获得了更好的性能,几乎是没有 spectre 和 meltdown 的 10%(我们可以关闭它们),并且与 4.14.10 的速度几乎相同(与 4.13 仍然不一样)。我们使用以下行关闭了所有我们可以关闭的 spectre 和 meltdown:
nospectre_v1 nospectre_v2 nospec_store_bypass_disable ssbd=force-off kvm-intel.vmentry_l1d_flush=never l1tf=off nopti no_rfi_flush kpti=off noibrs noibpb nospec no_stf_barrier
但specre_v1 和 l1tf 无法禁用,即使有选项也是如此。使用上述行,内核 4.14.70 的网络性能提高了 20%(比没有它时好,但仍然比它应该的差很多),但使用内核 4.18.12(和 4.18.8)时,性能几乎同样糟糕。
在所有内核的测试过程中,我们没有更改服务器中的任何其他选项,并且我们有一个自动化系统来检查差异,因此我们确保在启动期间应用我们更改的所有自定义选项(在系统中)。我们的绑定配置是:
bond-mode 4
bond-miimon 100
bond-lacp-rate slow
bond-slaves eth4 eth5
bond-xmit_hash_policy layer3+4
bond-downdelay 200
bond-updelay 200
有没有人遇到过这种情况,我们如何进行进一步的调试?这是否是 spectre 和 meltdown 性能下降(真的 -50%??)?可能是由于 4.13 之后内核中默认选项的更改(尽管我们检查了默认配置与 4.14 和 4.13 之间的差异,那里没有太多变化,我们尝试了它们)。我们还尝试了内核 4.14.10 - 就在 spectre 和 meltdown 代码激活之前(实际上,代码可能在内核中),尽管我们设法存档了近 90%,但我们仍然无法达到 4.13.x 内核的性能。我们用 FlameGraph 制作了一个性能记录的 svg:
perf record -F 99 -ag -- sleep 60
4.13.4 和 4.18.12 内核在网络堆栈相关功能上所花的时间确实存在差异。在服务器流量和负载相同的情况下,4.13.4 内核在网络堆栈相关功能上所花的时间明显低于 4.18.12 内核,这就像从旧版本到新版本内核的逐渐退化。