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?
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?
Antworten:
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?
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 0
bleibt der Prozentsatz übrig, 100
bei 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!
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 .
kwapd0
vorbei. Vielen Dank.
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
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
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 madvice
oder 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) ).
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