kswapd0 zajmuje dużo procesora

25

kswapd0 bierze 99,9% mojego procesora, jak pokazuje top, problem pojawił się dziś, kiedy gra i po raz pierwszy odszedł po 6 minutach, a teraz robi to przez około 20 minut. Jak to naprawić i co to powoduje?

    
zadawane Kaspar 22.02.2013, 13:32
źródło

2 odpowiedzi

25

Proces kswapd0 jest procesem niż zarządzanie pamięcią wirtualną. Twoja maszyna "powinna" mieć RAM, SWAP i EXT4 na twoim dysku HDD / SSD. W ext4 jest wszystko, gdzie wszystko jest przechowywane i zawsze jest wolniej dostęp z pamięci RAM. Pamięć RAM jest jak półmetek, aby programy mogły szybko uzyskać 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 w grę może brakować pamięci RAM, do której wkracza SWAP.

SWAP to fałszywa pamięć RAM umieszczona na dysku twardym / dysku SSD obok urządzenia EXT4. Jest szybszy dostęp niż EXT4, ale jest znacznie wolniejszy niż rzeczywisty RAM. Kiedy masz mało pamięci, kswapd0 przenosi programy, których nie używasz / nie używa tak dużo, jak inne programy do SWAP, co powoduje ekstremalne opóźnienie w tych procesach. Jeśli twoja gra wymagała 5 GB RAM, 1GB na LEAST będzie w SWAP. Oznacza to, że gdy próbuje uzyskać dostęp do tych informacji, musi czekać dłużej, aby je uzyskać.

Cały proces powoduje ekstremalne użycie procesora, przenoszenie informacji zi do SWAP i RAM oraz obsługę żądania informacji w tym samym czasie. Jak rozwiązać ten problem?

  1. Powiedz kswapd0, aby przenosił tylko rzeczy do SWAP, gdy jesteś całkowicie Z RAM. Jest to najskuteczniejsza metoda rozwiązywania problemów związanych z SWAP. Uruchom

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

    gdzie 0 jest procentem pominiętym z 100 , przy którym powinien być użyty SWAP (gdy masz 0% pamięci RAM, SWAP zacznie przyjmować dane). Możesz także po prostu edytować plik /etc/sysctl.conf zgodnie z własnymi upodobaniami, zamiast dodawać to polecenie do końca za każdym razem, używając gedit lub nano, lub cokolwiek innego, ale koniecznie sudo, ten plik jest własnością root. Uruchom ponownie i ustawiono twoje ustawienia!

  2. Zmniejsz zużycie pamięci RAM przez inne procesy lub zamknij inne programy podczas pracy z programami o wysokiej pamięci. Dlatego większość gier każe ci 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. Instalacja pamięci RAM nie jest tak trudna, jak się wydaje. Jeden lub dwa wkręty na małym przedziale (jeśli jesteś na laptopie) i proste kliknięcie. Tylko pamiętaj, że kupujesz odpowiedni rodzaj!
  4. Niższe procesy procesora, podobnie jak w przypadku pamięci RAM. Pomoże to tym RAM-owi, aby impulsy SWAP stały się bardziej płynne.

To najlepsze, co możesz zrobić. Inni mogą powiedzieć, że całkowicie się wyłączają, ale to jest niebezpieczne i NIE polecam tego. Może to spowodować zawieszenie się całego systemu w przypadku wycieku pamięci lub zbyt wielu uruchomionych aplikacji. Po prostu sobie sprawę, że SWAP jest bezpieczne dla RAM. Z pewnością nie jest tak szybki i wydajny jak pamięć RAM, ale jest lepszy niż Pagefile Window'a! (który realizuje ten sam cel)

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

    
odpowiedział Zzzach... 30.09.2014, 18:37
źródło
22

kswapd0 działa na 99,9% jednego procesora, ale w rzeczywistości wcale się nie zmienia

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

top pokazuje:

# 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

Tymczasowe rozwiązanie

Restart rozwiązał problem - tymczasowo.

po odpowiedzi na temat serverfault (często używa kswapd 100% procesora, gdy używana jest zamiana) tam, gdzie są takie 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ązanie 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

Trwałe rozwiązanie (można znaleźć)?

ale ponieważ faktyczny powód nie jest jeszcze znany, a nie dopracowałem żadnego odpowiedniego wyjaśnienia w sieci, nie jest to trwałe rozwiązanie. W rzeczywistości wybrana odpowiedź może być rozwiązaniem trwałym. Chciałem tylko dodać to na przyszłość, ponieważ restartowanie (aby sysctl przynosił efekt) nie zawsze jest możliwe.

Innym rozwiązaniem może być ustawienie THP na madvice lub never (zobacz komentarz do jego answer , Jak zmodyfikować" / sys / kernel / mm / transparent_hugepage / enabled " i odnośnik MongoDB Manual na Wyłącz przezroczyste duże strony (THP) )

zadanie cron

Ustawiłem następującą serię jako zadanie cron jako "stał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

wywołany przez

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

16.04 14.04 zamień

    
odpowiedział Martin Rüegg 20.02.2016, 11:09
źródło

Przeczytaj inne pytania na temat tagów