
Nos enfrentamos a un problema extraño con un servidor que tenemos en nuestro laboratorio. Específicamente, el servidor muestra una alta utilización de la CPU de procesos de baja prioridad (color azul en htop
) y el 50 % de los núcleos parecen tener una utilización del 100 % como se muestra en la captura de pantalla a continuación.
Sin embargo, en la lista de procesos en ejecución no hay ningún proceso que consuma esta 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]
Causa del problema:
Después de rastrear un poco, descubrimos que al deshabilitar la interfaz puente que hemos configurado en el servidor ( ifdown br0
), la utilización de la CPU cae a estados normales después de 5 a 10 segundos. Si volvemos a habilitar el puente, la utilización vuelve a aumentar, similar a la imagen de arriba.
Lo que hemos probado:
Hemos intentado deshabilitar libvirtd
el servicio en caso de que se trate de un problema con las máquinas virtuales en el servidor, pero no hay esperanzas al respecto. También hemos desactivado docker
y containerd
, pero tampoco cambió nada. También eliminamos y reinstalamos bridge-utils
en el servidor y también cambiamos el nombre de la interfaz a br1, pero el problema persiste. Por último, también arrancamos con una versión de kernel diferente, pero todavía nada.
¿Alguien ha enfrentado algún problema similar antes?
Especificaciones del servidor:
$ 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
---- Editar Nuestro servidor tiene dos interfaces de red p4p1
y p4p2
. Hemos asignado una IP estática a cada interfaz a través del servidor DHCP (por comodidad digamos que son 137.100.1.11
y 137.100.1.12
). Nuestro /etc/network/interfaces
archivo tiene el siguiente aspecto:
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
donde ib0
y ib1
son interfaces infiniband no relacionadas con redes externas.
Además la ruta es la siguiente:
$ 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
Respuesta1
Para velocidades más altas (en mi caso, 10 Gbps), la función de descarga de NIC no funciona correctamente. Por lo tanto, la CPU se encarga de todo el trabajo pesado. Los paquetes son manejados por la pila de red del kernel.
Habilitar tramas Jumbo (tamaño MTU MÁX) y aumentar el tamaño del búfer en anillo ha reducido la carga en la CPU.
ip link set dev <interface> mtu <value>
ethtool -G <interface> rx <value> tx <value>
Si la función de descarga de NIC está disponible, debe estar habilitada.
ethtool --offload <interface> tx on rx on
También puede utilizar otros métodos de ajuste del rendimiento que se enumeran aquí. Fuente:https://sysadmin.miniconf.org/2016/lca2016-jamie_bainbridge-network_performance_tuning.html