kswapd0 sta prendendo molta cpu

25

kswapd0 sta prendendo il 99,9% della mia CPU come mi mostra la parte superiore, il problema è apparso oggi durante il gioco e la prima volta è andato via dopo 6 minuti e ora lo fa da circa 20 minuti. In che modo è risolvibile e cosa sta causando questo?

    
posta Kaspar 22.02.2013 - 13:32
fonte

2 risposte

25

Il processo kswapd0 è il processo che gestisce la memoria virtuale. La tua macchina "dovrebbe" avere RAM, SWAP e EXT4 sul tuo HDD / SSD. L'ext4 è dove tutto è memorizzato, ed è sempre più lento per accedere dalla RAM. La RAM è come uno spazio di esecuzione a metà strada per i programmi per accedere rapidamente alle informazioni. La maggior parte dei computer ha almeno 4 GB di RAM, che in condizioni normali è abbondante. Tuttavia, quando si gioca, è possibile che lo spazio sulla RAM sia insufficiente, ovvero in cui entra in gioco SWAP.

SWAP è una RAM falsa situata sul tuo HDD / SSD vicino a EXT4. È più rapido accedere a EXT4, ma è molto più lento della RAM attuale. Quando si esaurisce la memoria, kswapd0 sposta i programmi che non si stanno utilizzando / non utilizzando tanto quanto altri programmi per lo SWAP, il che causa un estremo ritardo su tali processi. Se il tuo gioco avesse bisogno di 5 GB di RAM, 1 GB al minimo sarebbe in SWAP. Ciò significa che quando tenta di accedere a tali informazioni, deve attendere più a lungo per ottenerlo.

L'intero processo causa un utilizzo estremo della CPU, lo spostamento delle informazioni da e verso SWAP e RAM e la gestione della richiesta di informazioni tutte contemporaneamente. Come risolvere questo problema?

  1. Dì a kswapd0 di spostare le cose su SWAP solo quando sei completamente fuori RAM. Questo è il singolo metodo più efficace per risolvere i problemi SWAP. Esegui

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

    dove 0 è la percentuale lasciata da 100 a cui deve essere usato SWAP (quando è rimasto 0% di RAM, SWAP inizierà ad acquisire dati). Puoi anche modificare /etc/sysctl.conf a tuo piacimento invece di aggiungere questo comando alla fine di esso ogni volta usando gedit o nano o qualsiasi altra cosa, accertati di farlo sudo, questo file è di proprietà della root. Riavvia e sei pronto!

  2. Ridurre il consumo di RAM da parte di altri processi o chiudere altri programmi mentre si eseguono programmi di memoria alta. Questo è il motivo per cui la maggior parte dei giochi ti dice di chiudere tutte le altre finestre prima di giocare, o le installazioni fanno lo stesso. Cose come i servizi di sincronizzazione dei file tendono a richiedere molta memoria.
  3. Acquista più RAM. L'installazione della RAM non è così difficile come sembra. Una o due viti su un piccolo compartimento (se si è su un laptop) e un semplice clic. Assicurati di acquistare il tipo corretto!
  4. Riduci i processi della CPU come hai fatto con la RAM. Ciò consentirà a quelle RAM di SWAP di scoppiare molto più agevolmente.

Questo è il meglio che puoi fare. Altri potrebbero dire disabilitare completamente lo swap, ma ciò è pericoloso e NON lo consiglierei. Ciò può causare il blocco di interi sistemi in caso di perdita di memoria o di esecuzione di troppe applicazioni. Basta rendersi conto che lo SWAP è un fail-safe per la RAM. Non è sicuramente veloce o efficiente come la RAM, ma è meglio del Pagefile di Windows! (che ha lo stesso scopo)

MODIFICA: se sei interessato a saperne di più su SWAP, consulta qui .

    
risposta data Zzzach... 30.09.2014 - 18:37
fonte
22

kswapd0 gira al 99,9% di una CPU, ma in realtà non si scambia affatto

A me capita a volte su Ubuntu 14.04 con il kernel 3.19.0-50-generic (e precedenti) in esecuzione in un VMware VM. Non ho idea, cosa l'ha fatto apparire, ma viene durante il tempo di inattività.

top mostra:

# 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

Soluzione temporanea

un riavvio ha risolto il problema - temporaneamente.

in seguito alla risposta su serverfault (kswapd usa spesso 100% CPU quando lo swap è in uso) dove sono le stesse impostazioni sul mio sistema:

# 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 soluzione era in realtà # 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

ora va bene:

# 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

Soluzione permanente (da trovare)?

ma poiché la ragione effettiva non è ancora nota, e non ho trovato alcuna spiegazione adeguata in rete, questa non è una soluzione permanente. In realtà, la risposta selezionata potrebbe essere la soluzione permanente. Volevo solo aggiungere questo per riferimento futuro, come un riavvio (per rendere sysctl abbia effetto) non è sempre possibile.

Un'altra soluzione potrebbe essere quella di impostare THP a madvice o never (vedi poison's commento ai suoi risposta , Come modifico" / sys / kernel / mm / transparent_hugepage / enabled " e il manuale di riferimento di MongoDB su Disattiva pagine trasparenti (THP) )

cron job

ho impostato il seguente batch come processo cron come soluzione "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

richiamato con

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

16.04 14.04 di swap

    
risposta data Martin Rüegg 20.02.2016 - 11:09
fonte

Leggi altre domande sui tag