kswapd0 zajmuje dużo procesora

45

kswapd0 zajmuje 99,9% mojego procesora, jak pokazuje top, problem pojawił się dzisiaj, gdy gra i po raz pierwszy odeszła po 6 minutach, a teraz robi to około 20 minut. Jak to naprawić i co to powoduje?

Kaspar
źródło
Dzieje się tak również ze mną w Ubuntu 14.04.
eri0o
Zdarza mi się to również od 18.04. Szczegóły tutaj: askubuntu.com/questions/1118932/…
Yuvraj Jaiswal

Odpowiedzi:

48

Proces kswapd0 to proces zarządzający pamięcią wirtualną. Twoje urządzenie powinno mieć pamięć RAM, SWAP i EXT4 na twoim HDD / SSD. Ext4 to miejsce, w którym wszystko jest przechowywane i zawsze jest wolniejszy dostęp niż RAM. Pamięć RAM przypomina przestrzeń do biegania w połowie drogi, dzięki której programy mają szybki dostęp do informacji. Większość komputerów ma co najmniej 4 GB pamięci RAM, co w normalnych warunkach jest wystarczające. Podczas grania możesz jednak zabraknąć miejsca w pamięci RAM, czyli tam, gdzie przychodzi SWAP.

SWAP to fałszywa pamięć RAM znajdująca się na dysku HDD / SSD obok EXT4. Jest szybszy dostęp niż EXT4, ale jest znacznie wolniejszy niż rzeczywista pamięć RAM. Kiedy kończy się mało pamięci, kswapd0 przenosi programy, których nie używasz / nie używasz tak często, jak inne programy do SWAP, co powoduje znaczne opóźnienie tych procesów. Gdyby twoja gra wymagała 5 GB pamięci RAM, 1 GB w LEAST byłby w SWAP. Oznacza to, że kiedy próbuje uzyskać dostęp do tych informacji, musi czekać dłużej, aby je uzyskać.

Cały ten proces powoduje ekstremalne zużycie procesora, przenoszenie informacji zi do SWAP i pamięci RAM oraz obsługę żądania informacji jednocześnie. Jak rozwiązać ten problem?

  1. Powiedz kswapd0, aby przenosił rzeczy do SWAP tylko wtedy, gdy całkowicie brakuje pamięci RAM. Jest to najbardziej skuteczna metoda rozwiązywania problemów SWAP. Biegać

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

    gdzie 0jest procent pominięty, 100przy którym należy użyć SWAP (gdy pozostało 0% pamięci RAM, SWAP zacznie pobierać dane). Możesz także edytować /etc/sysctl.conf według własnych upodobań zamiast dodawać to polecenie na końcu za każdym razem, używając gedit lub nano lub cokolwiek innego, pamiętaj jednak, że sudo, ten plik jest własnością root. Uruchom ponownie, a twoje są gotowe!

  2. Zmniejsz zużycie pamięci RAM przez inne procesy lub zamknij inne programy podczas uruchamiania programów o dużej pamięci. Dlatego większość gier mówi, aby zamknąć wszystkie inne okna przed rozpoczęciem gry lub instalacje robią to samo. Rzeczy takie jak usługi synchronizacji plików zwykle zajmują dużo pamięci.
  3. Kup więcej pamięci RAM. Instalowanie pamięci RAM nie jest tak trudne, jak się wydaje. Jedna lub dwie śruby w małej komorze (jeśli jesteś na laptopie) i jedno kliknięcie. Tylko upewnij się, że kupujesz odpowiedni rodzaj!
  4. Obniż procesy procesora tak samo, jak w przypadku pamięci RAM. Pomoże to tym RAMom do przełączania serii SWAP na znacznie płynniejsze.

To najlepsze, co możesz zrobić. Inni mogą powiedzieć całkowicie wyłącz swap, ale jest to niebezpieczne i NIE poleciłbym tego. Może to spowodować zawieszenie się całych systemów w przypadku wycieku pamięci lub uruchomienia zbyt wielu aplikacji. Po prostu zdaj sobie sprawę, że SWAP jest bezpiecznym dla pamięci RAM. Z pewnością nie jest tak szybki ani wydajny jak pamięć RAM, ale jest lepszy niż plik stronicowania Windows! (który spełnia ten sam cel)

EDYCJA: Jeśli chcesz dowiedzieć się więcej o SWAP, zobacz tutaj .

Zzzach ...
źródło
Nie pamiętam dokładnie, co naprawiło dla mnie problem, ale dziękuję za dobrze napisaną odpowiedź, która wiele wyjaśnia.
Kaspar
Zgodnie z twoją odpowiedzią kończę proces, aby użyć mniej swapów. Teraz proces kwapd0się skończył. Dzięki.
mtoloo
28

kswapd0 działa na 99,9% jednego procesora, ale tak naprawdę wcale nie zamienia

Dla mnie zdarza się to czasami na Ubuntu 14.04 z jądrem 3.19.0-50-generic (i wcześniejszym) uruchomionym w VMware vm. Nie mam pojęcia, co sprawiło, że się pojawił, ale pojawia się w czasie bezczynności.

top przedstawia:

# 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

Rozwiązanie tymczasowe

ponowne uruchomienie rozwiązało problem - tymczasowo.

po odpowiedzi na błąd serwera (kswapd często używa 100% procesora, gdy używana jest funkcja swap) tam, gdzie te same ustawienia w moim systemie:

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

rozwiązaniem było w rzeczywistości # 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

teraz jest w porządku:

# 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

Stałe rozwiązanie (do znalezienia)?

ale ponieważ faktyczny powód nie jest jeszcze znany, a ja nie podałem żadnego odpowiedniego wyjaśnienia w sieci, nie jest to trwałe rozwiązanie. Właściwie wybrana odpowiedź może być trwałym rozwiązaniem. Chciałem tylko dodać to do przyszłego odwołania, ponieważ ponowne uruchomienie (aby sysctl zadziałało) nie zawsze jest możliwe.

Innym rozwiązaniem może być ustawienie THP na jeden madvicelub never(patrz komentarz poige'a do jego odpowiedzi : Jak zmodyfikować „/ sys / kernel / mm / transparent_hugepage / enabled” oraz przywołany Podręcznik MongoDB na temat wyłączania przezroczystych ogromnych stron (THP) )

praca crona

skonfigurowałem następującą partię jako zadanie CRON jako „trwałe” rozwiązanie:

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

przywołany z

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

Martin Rüegg
źródło
Bardzo ładna odpowiedź, dzięki. Jądro RPi zostało zaktualizowane i to właśnie otrzymuję, berserking kswap.
Paul B
Dzięki, @PaulB. Do mojej odpowiedzi dodałem zadanie crona, którego używam jako stałego rozwiązania w moim systemie.
Martin Rüegg,
Jak słusznie zauważył @Veger , działa to również 16.04. Ponieważ obecnie używam siebie. Więc dodał tag. Dzięki!
Martin Rüegg
Jeszcze raz dziękuję, @Veger ! - Poprawiłem brakujący wykrzyknik w scenariuszu Sha-Bang.
Martin Rüegg,
1
„echo 1> / proc / sys / vm / drop_caches” naprawiło dla mnie wysokie użycie procesora - różnica dnia i nocy! kswapd0 przeszedł ze 100% procesora do 0%. Wyjaśnienie dlaczego i trwałe rozwiązanie byłoby świetne. (Uwaga dodatkowa: Używam jądra Linuksa 4.8.0-36-generic z 16 GB mem i 16 GB swap.)
josephdpurcell