kswapd0 se ejecuta al 99.9% de una CPU pero en realidad no se intercambia en absoluto
Para mí sucede a veces en Ubuntu 14.04 con el kernel 3.19.0-50-generic (y anterior) ejecutándose en un VMware vm. No tengo idea de qué lo hizo aparecer, pero viene durante el tiempo de inactividad.
top
muestra:
# top
top - 09:49:35 up 5 days, 18:35, 1 user, load average: 1.00, 1.00, 0.99
Tasks: 219 total, 2 running, 217 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 25.0 sy, 0.0 ni, 74.7 id, 0.2 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem: 3028784 total, 1874468 used, 1154316 free, 1010276 buffers
KiB Swap: 15624188 total, 3032 used, 15621156 free. 234928 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
52 root 20 0 0 0 0 R 99.7 0.0 122:15.21 kswapd0
3 root 20 0 0 0 0 S 0.3 0.0 0:29.86 ksoftirqd/0
7 root 20 0 0 0 0 S 0.3 0.0 9:49.47 rcu_sched
Solución temporal
un reinicio resolvió el problema temporalmente.
siguiendo la respuesta en serverfault (kswapd a menudo usa el 100% de la CPU cuando el intercambio está en uso) donde la misma configuración en mi sistema:
# cat /proc/sys/vm/swappiness
60
# cat /proc/sys/vm/vfs_cache_pressure
100
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
la solución fue en realidad # echo 1 > /proc/sys/vm/drop_caches
:
# cat /proc/sys/vm/drop_caches
0
# echo 1 > /proc/sys/vm/drop_caches
# cat /proc/sys/vm/drop_caches
1
ahora está bien:
# top
top - 10:08:58 up 5 days, 18:55, 1 user, load average: 0.72, 0.95, 0.98
Tasks: 220 total, 1 running, 219 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 3028784 total, 681704 used, 2347080 free, 2916 buffers
KiB Swap: 15624188 total, 3032 used, 15621156 free. 81924 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9 root 20 0 0 0 0 S 0.3 0.0 14:10.40 rcuos/0
1 root 20 0 45652 8124 2888 S 0.0 0.3 1:54.98 init
¿Solución permanente (por encontrar)?
pero como todavía no se conoce el motivo real, y no puse ninguna explicación adecuada en la red, esta no es una solución permanente. En realidad, la respuesta seleccionada podría ser la solución permanente. Solo quería agregar esto para referencia futura, ya que un reinicio (para que sysctl tenga efecto) no siempre es posible.
Otra solución podría ser configurar THP en cualquiera madvice
o never
(ver el comentario de poige a su respuesta , ¿Cómo modifico "/ sys / kernel / mm / transparent_hugepage / enabled" y el Manual de MongoDB referenciado sobre Desactivar páginas enormes transparentes (THP) )
trabajo cron
He configurado el siguiente lote como un trabajo cron como una solución "permanente":
#!/bin/bash
## run as cron, thus no $PATH, thus need to define all absolute paths
top=/usr/bin/top
grep=/bin/grep
top=$($top -bn1 -o \%CPU -u0 | $grep -m2 -E "%CPU|kswapd0")
IFS='
'
set -f
i=0
for line in $top
do
#echo $i $line
if ! (( i++ ))
then
pos=${line%%%CPU*}
pos=${#pos}
#echo $pos
else
cpu=${line:(($pos-1)):3}
cpu=${cpu// /}
#echo $cpu
fi
done
[[ -n $cpu ]] && \
(( $cpu >= 90 )) \
&& echo 1 > /proc/sys/vm/drop_caches \
&& echo "$$ $0: cache dropped (kswapd0 %CPU=$cpu)" >&2 \
&& exit 1
exit 0
invocado con
# m h dom mon dow command
* * * * * /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1
16.04 14.04 intercambio