![桥接接口导致 CPU 使用率过高](https://linux22.com/image/782644/%E6%A1%A5%E6%8E%A5%E6%8E%A5%E5%8F%A3%E5%AF%BC%E8%87%B4%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E8%BF%87%E9%AB%98.png)
我们实验室的一台服务器遇到了一个奇怪的问题。具体来说,服务器显示低优先级进程(图中蓝色部分htop
)的 CPU 利用率很高,50% 的核心似乎具有 100% 的利用率,如下面的屏幕截图所示。
然而,在正在运行的进程列表中却没有占用该CPU的进程:
$ ps aux --sort pcpu | head -n 20
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 10:42 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:42 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 10:42 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 10:42 0:00 [kworker/u96:0]
root 8 0.0 0.0 0 0 ? S 10:42 0:00 [rcu_sched]
root 9 0.0 0.0 0 0 ? S 10:42 0:00 [rcu_bh]
root 10 0.0 0.0 0 0 ? S 10:42 0:00 [migration/0]
root 11 0.0 0.0 0 0 ? S 10:42 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 10:42 0:00 [watchdog/1]
root 13 0.0 0.0 0 0 ? S 10:42 0:00 [migration/1]
root 14 0.0 0.0 0 0 ? S 10:42 0:00 [ksoftirqd/1]
root 16 0.0 0.0 0 0 ? S< 10:42 0:00 [kworker/1:0H]
root 17 0.0 0.0 0 0 ? S 10:42 0:00 [watchdog/2]
root 18 0.0 0.0 0 0 ? S 10:42 0:00 [migration/2]
root 19 0.0 0.0 0 0 ? S 10:42 0:00 [ksoftirqd/2]
root 21 0.0 0.0 0 0 ? S< 10:42 0:00 [kworker/2:0H]
root 22 0.0 0.0 0 0 ? S 10:42 0:00 [watchdog/3]
root 23 0.0 0.0 0 0 ? S 10:42 0:00 [migration/3]
root 24 0.0 0.0 0 0 ? S 10:42 0:00 [ksoftirqd/3]
问题原因:
经过一番探索,我们发现,当禁用我们在服务器上设置的桥接接口(ifdown br0
)时,CPU 利用率会在 5-10 秒后降至正常状态。如果我们重新启用桥接,则利用率会再次飙升,类似于上图。
我们已经尝试过:
我们尝试禁用libvirtd
服务,以防这是服务器上虚拟机的问题,但毫无希望。我们还禁用了docker
和containerd
,但没有任何变化。我们还在服务器上删除并重新安装,bridge-utils
并将接口重命名为 br1,但问题仍然存在。最后,我们还使用不同的内核版本启动,但仍然没有结果。
以前有人遇到过类似的问题吗?
服务器规格:
$ uname -a
Linux cheetara 4.4.0-174-generic #204-Ubuntu SMP Wed Jan 29 06:41:01 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.7 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.7 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
---- 编辑 我们的服务器有两个网络接口p4p1
和p4p2
。我们通过 DHCP 服务器为每个接口分配了一个静态 IP(为方便起见,我们假设它们是137.100.1.11
和137.100.1.12
)。我们的/etc/network/interfaces
文件如下所示:
auto lo
iface lo inet loopback
auto p4p1
iface p4p1 inet manual
auto br0
iface br0 inet static
address 137.100.1.11
broadcast 137.100.1.255
netmask 255.255.255.0
gateway 137.100.1.200
dns-nameservers 137.100.1.210 137.100.1.220 8.8.8.8 8.8.4.4
bridge_ports p4p1
auto ib0
iface ib0 inet static
address 10.1.0.2
netmask 255.255.255.0
auto ib1
iface ib1 inet static
address 10.0.0.2
netmask 255.255.255.0
其中ib0
和ib1
是与外部网络无关的 Infiniband 接口。
路由如下:
$ ip route show
default via 137.100.1.200 dev br0 onlink
10.0.0.0/24 dev ib1 proto kernel scope link src 10.0.0.2 linkdown
10.1.0.0/24 dev ib0 proto kernel scope link src 10.1.0.2 linkdown
147.102.37.0/24 dev br0 proto kernel scope link src 147.102.37.24
答案1
对于更高的速度(在我的情况下是 10 Gbps),NIC 卸载功能无法正常工作。因此,CPU 正在处理所有繁重的工作。数据包由内核的网络堆栈处理。
启用巨型帧(最大 MTU 大小)并增加环形缓冲区大小已减少 CPU 的负载。
ip link set dev <interface> mtu <value>
ethtool -G <interface> rx <value> tx <value>
如果 NIC 卸载功能可用,则应启用该功能。
ethtool --offload <interface> tx on rx on
您还可以使用此处列出的其他性能调整方法。来源:https://sysadmin.miniconf.org/2016/lca2016-jamie_bainbridge-network_performance_tuning.html