kswapd0 nimmt viel CPU

45

kswapd0 beansprucht 99,9% meiner CPU, wie ich oben gesehen habe. Das Problem trat heute beim Spielen auf und das erste Mal verschwand es nach 6 Minuten, und jetzt macht es das seit ungefähr 20 Minuten. Wie ist das reparabel und was verursacht das?

Kaspar
quelle
Das passiert bei mir auch in Ubuntu 14.04.
eri0o
Das passiert mir auch für den 18.04. Details hier: askubuntu.com/questions/1118932/…
Yuvraj Jaiswal

Antworten:

48

Der Prozess kswapd0 ist der Prozess, der den virtuellen Speicher verwaltet. Ihr Computer sollte über RAM, SWAP und EXT4 auf Ihrer Festplatte / SSD verfügen. In ext4 ist alles gespeichert und der Zugriff ist immer langsamer als im RAM. RAM ist wie ein halbwegs laufender Bereich, in dem Programme schnell auf Informationen zugreifen können. Die meisten Computer haben mindestens 4 GB RAM, was unter normalen Bedingungen ausreichend ist. Wenn Sie ein Spiel spielen, kann es jedoch sein, dass Ihnen der RAM-Speicherplatz ausgeht. Hier kommt SWAP ins Spiel.

SWAP ist ein gefälschter RAM, der sich auf Ihrer Festplatte / SSD neben Ihrem EXT4 befindet. Der Zugriff ist schneller als beim EXT4, aber viel langsamer als beim eigentlichen RAM. Wenn Ihnen der Speicher ausgeht, verschiebt kswapd0 Programme, die Sie nicht oder nicht so oft verwenden wie andere Programme, in den SWAP, was zu extremen Verzögerungen bei diesen Prozessen führt. Wenn Ihr Spiel 5 GB RAM benötigt, ist mindestens 1 GB in SWAP enthalten. Das heißt, wenn es versucht, auf diese Informationen zuzugreifen, muss es länger warten, um sie abzurufen.

Dieser gesamte Prozess führt zu einer extremen CPU-Auslastung, zum Verschieben von Informationen von und zu SWAP und RAM sowie zur gleichzeitigen Verarbeitung der Informationsanforderung. Wie kann man dieses Problem lösen?

  1. Weisen Sie kswapd0 an, nur dann Daten nach SWAP zu verschieben, wenn der Arbeitsspeicher voll ist. Dies ist die effektivste Methode zur Lösung von SWAP-Problemen. Lauf

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

    Wo 0bleibt der Prozentsatz übrig, 100bei dem SWAP verwendet werden soll (wenn Sie 0% RAM übrig haben, beginnt SWAP mit der Datenerfassung). Sie können auch einfach /etc/sysctl.conf nach Ihren Wünschen bearbeiten, anstatt diesen Befehl jedes Mal mit gedit oder nano oder einem anderen Befehl an das Ende des Befehls anzufügen. Neustart und fertig!

  2. Reduzieren Sie den RAM-Verbrauch durch andere Prozesse oder schließen Sie andere Programme, während Sie Programme mit hohem Arbeitsspeicher ausführen. Aus diesem Grund werden Sie bei den meisten Spielen aufgefordert, vor dem Spielen alle anderen Fenster zu schließen, oder bei Installationen werden dieselben Schritte ausgeführt. Dinge wie Dateisynchronisierungsdienste beanspruchen in der Regel viel Speicher.
  3. Kaufe mehr RAM. Das Installieren von RAM ist nicht so schwierig wie es sich anhört. Eine oder zwei Schrauben in einem kleinen Fach (wenn Sie einen Laptop haben) und ein einfaches Klicken. Stellen Sie sicher, dass Sie die richtige Sorte kaufen!
  4. Niedrigere Prozesse der CPU als beim RAM. Dies wird dazu beitragen, dass die RAM-zu-SWAP-Bursts viel flüssiger werden.

Das ist das Beste, was Sie tun können. Andere mögen sagen, Swap komplett deaktivieren, aber das ist gefährlich und ich würde das NICHT empfehlen. Dies kann dazu führen, dass ganze Systeme einfrieren, wenn ein Speicherverlust vorliegt oder zu viele Anwendungen ausgeführt werden. Beachten Sie, dass der SWAP ausfallsicher für den Arbeitsspeicher ist. Es ist definitiv nicht so schnell oder effizient wie RAM, aber es ist besser als Window's Pagefile! (was den gleichen Zweck erfüllt)

EDIT: Wenn Sie mehr über SWAP erfahren möchten, lesen Sie hier .

Zzzach ...
quelle
Ich kann mich nicht mehr genau erinnern, was das Problem für mich behoben hat, aber ich danke Ihnen für die gut geschriebene Antwort, die viel erklärt.
Kaspar
Ihrer Antwort zufolge beende ich einen Prozess, sodass weniger Swap verwendet wird. Jetzt ist der Prozess kwapd0vorbei. Vielen Dank.
Mtoloo
28

kswapd0 läuft mit 99,9% einer CPU, tauscht aber tatsächlich überhaupt nicht aus

Mir passiert es manchmal unter Ubuntu 14.04 mit Kernel 3.19.0-50-generic (und früher), der in einer VMware vm läuft. Ich habe keine Ahnung, was es erscheinen ließ, aber es kommt während der Leerlaufzeit.

top zeigt an:

# 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

Vorübergehende Lösung

Ein Neustart löste das Problem - vorübergehend.

nach der antwort auf serverfault (kswapd verwendet oft 100% CPU wenn swap verwendet wird) gibt es die gleichen einstellungen auf meinem system:

# cat /proc/sys/vm/swappiness
60
# cat /proc/sys/vm/vfs_cache_pressure
100
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

Die Lösung war eigentlich # 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

jetzt ist es gut:

# 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

Dauerhafte Lösung (zu finden)?

aber da der eigentliche grund noch nicht bekannt ist und ich keine passende erklärung im netz fein habe, ist dies keine dauerhafte lösung. Tatsächlich könnte die ausgewählte Antwort die dauerhafte Lösung sein. Ich wollte dies nur zum späteren Nachschlagen hinzufügen, da ein Neustart (damit sysctl wirksam wird) nicht immer möglich ist.

Eine andere Lösung könnte darin bestehen, THP auf entweder madviceoder zu setzen never(siehe den Kommentar von poige zu seiner Antwort : Wie ändere ich „/ sys / kernel / mm / transparent_hugepage / enabled“ und das MongoDB-Handbuch, auf das verwiesen wird, auf Disable Transparent Huge Pages (THP) ).

Cron-Job

Ich habe den folgenden Batch als Cron-Job als "permanente" Lösung eingerichtet:

#!/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

aufgerufen mit

# m h  dom mon dow   command
  * *  *   *   *     /bin/bash /path/to/batch/drop_caches.sh >> /var/log/syslog 2>&1

Martin Rüegg
quelle
Sehr schöne Antwort, danke. RPi-Kernel aktualisiert und das ist, was ich bekomme, wahnsinnig kswap.
Paul B
Danke, @PaulB. Ich habe meiner Antwort den Cron-Job hinzugefügt, den ich als permanente Lösung auf meinem System verwende.
Martin Rüegg
Wie von @Veger richtig hervorgehoben, funktioniert dies auch am 16.04. Wie ich mich gerade benutze. Also fügte der Tag hinzu. Vielen Dank!
Martin Rüegg
Nochmals vielen Dank, @Veger ! - Ich habe das fehlende Ausrufezeichen im Sha-Bang des Skripts korrigiert.
Martin Rüegg
1
"echo 1> / proc / sys / vm / drop_caches" hat die hohe CPU-Auslastung für mich behoben - Tag und Nacht Unterschied! kswapd0 ging von 100% CPU auf 0%. Eine Erklärung für das Warum und eine dauerhafte Lösung wäre großartig. (Anmerkung: Ich verwende Linux-Kernel 4.8.0-36-generic mit 16 GB Speicher und 16 GB Swap.)
josephdpurcell