kswapd0 prend beaucoup de cpu

46

kswapd0 prend 99,9% de mon processeur comme le montre le mieux, le problème est apparu aujourd'hui lors du jeu et la première fois, il est parti après 6 minutes et maintenant, cela fait environ 20 minutes. Comment cela est-il réparable et quelle en est la cause?

Kaspar
la source
Cela arrive aussi avec moi dans Ubuntu 14.04.
eri0o
Cela m’arrive aussi pour le 18.04. Détails ici: askubuntu.com/questions/1118932/…
Yuvraj Jaiswal

Réponses:

49

Le processus kswapd0 est le processus qui gère la mémoire virtuelle. Votre ordinateur doit disposer de la RAM, du SWAP et de l’extension EXT4 sur votre disque dur / SSD. L'ext4 est l'endroit où tout est stocké, et l'accès est toujours plus lent que la RAM. La RAM est comme un espace intermédiaire permettant aux programmes d’accéder rapidement aux informations. La plupart des ordinateurs ont au moins 4 Go de RAM, ce qui est suffisant dans des conditions normales. Cependant, lorsque vous jouez à un jeu, vous risquez de manquer d’espace en mémoire RAM, point d’intervention de SWAP.

SWAP est une fausse RAM située sur votre disque dur / SSD à côté de votre EXT4. Il est plus rapide d’accéder que le EXT4, mais il est beaucoup plus lent que la RAM réelle. Lorsque vous manquez de mémoire, kswapd0 déplace les programmes que vous n'utilisez pas / n'utilisez pas autant que d'autres programmes dans le SWAP, ce qui entraîne un retard extrême sur ces processus. Si votre jeu nécessitait 5 Go de RAM, 1 Go au moins serait en SWAP. Cela signifie que lorsqu'il tente d'accéder à cette information, il doit attendre plus longtemps avant de l'obtenir.

Tout ce processus entraîne une utilisation extrême du processeur, le déplacement des informations de et vers SWAP et RAM et le traitement de la demande d'informations en même temps. Comment résoudre ce problème?

  1. Dites à kswapd0 de ne déplacer des éléments dans SWAP que lorsque vous êtes complètement à court de RAM. C’est la méthode la plus efficace pour résoudre les problèmes SWAP. Courir

    echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf

    0est le pourcentage restant pour 100lequel SWAP doit être utilisé (quand il vous restera 0% de RAM, SWAP commencera à prendre des données). Vous pouvez aussi simplement éditer /etc/sysctl.conf à votre convenance au lieu d’ajouter cette commande à la fin de celle-ci à chaque fois en utilisant gedit ou nano ou autre, assurez-vous de choisir sudo, ce fichier appartient à la racine. Redémarrez et vous êtes prêt!

  2. Réduisez la consommation de RAM par d'autres processus ou fermez d'autres programmes lors de l'exécution de programmes à mémoire vive. C'est pourquoi la plupart des jeux vous demandent de fermer toutes les autres fenêtres avant de jouer, ou les installations font de même. Les services de synchronisation de fichiers, par exemple, nécessitent généralement beaucoup de mémoire.
  3. Achetez plus de RAM. L'installation de la RAM n'est pas aussi difficile qu'il y paraît. Une ou deux vis sur un petit compartiment (si vous êtes sur un ordinateur portable) et un simple clic. Assurez-vous simplement que vous achetez le bon type!
  4. Abaissez les processus du processeur comme vous le faisiez avec la RAM. Cela aidera ces RAM à SWAP à aller beaucoup mieux.

C'est le mieux que vous puissiez faire. D'autres peuvent dire de désactiver complètement l'échange, mais c'est dangereux et je ne le recommanderais PAS. Cela peut provoquer le gel de systèmes entiers en cas de fuite de mémoire ou de trop d'applications en cours d'exécution. Il suffit de se rendre compte que le SWAP est un fail-safe pour la RAM. Ce n'est certainement pas aussi rapide et efficace que la RAM, mais c'est mieux que le fichier Page de Windows! (qui accomplit le même but)

EDIT: Si vous souhaitez en savoir plus sur SWAP, cliquez ici .

Zzzach ...
la source
Je ne peux pas me rappeler exactement ce qui a réglé le problème pour moi, mais je vous remercie pour la réponse bien écrite qui explique beaucoup.
Kaspar
Selon votre réponse, je termine un processus de sorte que moins d'échange soit utilisé. Maintenant, le processus kwapd0est parti. Merci.
mtoloo
29

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 madviceou 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

Martin Rüegg
la source
Très belle réponse, merci. Le noyau RPi a été mis à jour et voici ce que j'ai, berserking kswap.
Paul B
Merci, PaulB. J'ai ajouté à ma réponse le travail cron que j'utilise comme solution permanente sur mon système.
Martin Rüegg le
Comme correctement souligné par @Veger , cela fonctionne également le 16.04. Comme je me sers actuellement. Alors ajouté le tag. Merci!
Martin Rüegg
Merci encore, @Veger ! - J'ai corrigé le point d'exclamation manquant dans le script Sha-Bang.
Martin Rüegg
1
"echo 1> / proc / sys / vm / drop_caches" corrige l'utilisation élevée du processeur pour moi - différence jour et nuit! kswapd0 est passé de 100% du processeur à 0%. Une explication de pourquoi et une solution permanente serait génial. (Remarque: j'utilise le noyau linux 4.8.0-36-generic avec 16 Go de mémoire et 16 Go de swap.)
josephdpurcell Le