kswapd0 fonctionne à 99,9% d'un processeur mais n'échange pas du tout
Pour moi, cela arrive parfois sur Ubuntu 14.04 avec le noyau 3.19.0-50-generic (et antérieur) s'exécutant dans une machine virtuelle VMware. Je n'ai aucune idée de ce qui l'a fait apparaître, mais cela vient pendant les temps morts.
top
spectacles:
# 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
Solution temporaire
un redémarrage a résolu le problème - temporairement.
en suivant la réponse sur serverfault (kswapd utilise souvent 100% de la CPU lorsqu’un swap est utilisé), là où se trouvent les mêmes paramètres sur mon système:
# 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 solution était en réalité # 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
maintenant c'est bon:
# 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
Solution permanente (à trouver)?
mais comme la raison réelle n’est pas encore connue et que je n’ai pas trouvé d’explications appropriées sur le net, ce n’est pas une solution permanente. En fait, la réponse choisie pourrait être la solution permanente. Je voulais juste ajouter ceci pour référence future, car un redémarrage (pour que sysctl prenne effet) ne soit pas toujours possible.
Une autre solution pourrait être de définir THP sur madvice
ou never
(voir le commentaire de poige dans sa réponse , Comment modifier «/ sys / kernel / mm / transparent_hugepage / enabled» et le manuel MongoDB sur la désactivation des pages transparentes immenses (THP) )
Cron
J'ai configuré le lot suivant en tant que tâche cron en tant que solution "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
invoqué avec
# m h dom mon dow command
* * * * * /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1
16.04 14.04 swap