我正在使用 Ubuntu 18.04,我注意到 TCP 性能下降,这阻止我升级当前运行的服务器,因为它们对延迟非常敏感。
对于我的特定用例,我实现了一个简单的 TCP 测试程序,将其作为服务器运行,等待一定数量的客户端连接,然后再向所有客户端发送一批消息。然后我测量发送消息()为 N 个客户端提供固定大小的缓冲区。
代码示例
我在位于同一数据中心的两台不同的机器上运行服务器和客户端。
结果
Ubuntu 16.04
版本
srv01:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial
srv01:~$ uname -ra
Linux srv01 4.4.0-97-generic #120-Ubuntu SMP Tue Sep 19 17:28:18 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
系统控制
net.core.netdev_max_backlog = 3000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_moderate_rcvbuf = 0
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_rmem = 131072 1048576 16777216
net.ipv4.tcp_wmem = 131072 1048576 16777216
跑步
srv01:~$ taskset -c 15,17,19 ./iouring --port 4040 --clients-count 3 --buffer-size 128 --batch-size 100 --sleep-ms 1 --total-messages 500000 --sockopt n
Send latency report
Min: 679ns
Mean: 1048ns
Max: 13949ns
p(0.100000) = 726ns
p(0.200000) = 734ns
p(0.500000) = 750ns
p(0.800000) = 859ns
p(0.900000) = 1338ns
p(0.990000) = 5024ns
Ubuntu 18.04
版本
srv02:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.3 LTS
Release: 18.04
Codename: bionic
srv02:~$ uname -ra
Linux srv02 4.20.17-042017-generic #201903190933 SMP Tue Mar 19 13:36:11 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
系统控制
net.core.netdev_max_backlog = 3000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_moderate_rcvbuf = 0
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_rmem = 131072 1048576 16777216
net.ipv4.tcp_wmem = 131072 1048576 16777216
跑步
srv02:~$ taskset -c 15,17,19 ./iouring --port 4040 --clients-count 3 --buffer-size 128 --batch-size 100 --sleep-ms 1 --total-messages 500000 --sockopt n
Send latency report
Min: 819ns
Mean: 4660ns
Max: 25061ns
p(0.100000) = 1379ns
p(0.200000) = 2660ns
p(0.500000) = 4871ns
p(0.800000) = 6559ns
p(0.900000) = 7416ns
p(0.990000) = 9444ns
如你所见,Ubuntu 18.04使用内核 4.20(我在内核 4.15 和 4.18 上观察到了完全相同的情况)。我使用的是完全相同的机器(相同的硬件)。
不知何故,它看起来与TCP节点延迟是否启用。禁用时TCP节点延迟(不--sockopt),我第 50 次1005纳秒(Ubuntu 18.04)。
srv02:~$ taskset -c 15,17,19 ./iouring --port 4040 --clients-count 3 --buffer-size 128 --batch-size 100 --sleep-ms 1 --total-messages 500000
Send latency report
Min: 817ns
Mean: 1790ns
Max: 15374ns
p(0.100000) = 955ns
p(0.200000) = 964ns
p(0.500000) = 1006ns
p(0.800000) = 1601ns
p(0.900000) = 4475ns
p(0.990000) = 9516ns
同样的测试RHEL8, 核心4.18有或没有表现出任何性能差异TCP节点延迟(第 50 位为 950ns)。
知道是什么原因造成的吗?如果需要,我可以提供更多详细信息。
谢谢
答案1
看来你的 16.04 内核没有针对 spectre/meltdown 进行修补。
据我了解,内核 4.4.0-109 包含部分补丁,而您正在运行的 4.4.0-97 没有采取任何针对侧信道攻击的措施,因此无法提供更好的性能。
在 SMP 生产系统上运行这些是否明智 - 完全不同的问题......