kswapd0 está tomando muito cpu

25

O kswapd0 está ocupando 99,9% do meu CPU, como mostra o topo, o problema apareceu hoje quando o jogo e a primeira vez que ele foi embora depois de 6 minutos e agora ele vem sendo feito por cerca de 20 minutos. Como isso é solucionável e o que está causando isso?

    
por Kaspar 22.02.2013 / 13:32

2 respostas

25

O processo kswapd0 é o processo que gerencia a memória virtual. Sua máquina "deveria" ter RAM, SWAP e EXT4 no seu HDD / SSD. O ext4 é onde tudo é armazenado, e é sempre mais lento acessar do que a RAM. A RAM é como um espaço de execução a meio caminho para os programas acessarem informações rapidamente. A maioria dos computadores tem pelo menos 4 GB de RAM, que em condições normais é suficiente. Ao jogar um jogo, no entanto, você pode ficar com pouco espaço de RAM, que é onde entra o SWAP.

O SWAP é uma RAM falsa localizada no seu HDD / SSD próximo ao seu EXT4. É mais rápido de acessar do que o EXT4, mas é muito mais lento que a RAM real. Quando você está com pouca memória, o kswapd0 move programas que você não está usando / não usa tanto quanto outros programas para o SWAP, o que causa um atraso extremo nesses processos. Se o seu jogo estivesse precisando de 5 GB de RAM, 1 GB pelo menos estaria em SWAP. Isso significa que quando tenta acessar essa informação, ela precisa esperar mais tempo para obtê-la.

Todo este processo causa um uso extremo da CPU, movendo informações de e para SWAP e RAM e lidando com a solicitação de informações ao mesmo tempo. Como resolver este problema?

  1. Diga ao kswapd0 para mover somente o material para SWAP quando você estiver completamente FORA da RAM. Esse é o método mais eficaz para resolver problemas de SWAP. Executar

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

    onde 0 é a porcentagem restante de 100 na qual o SWAP deve ser usado (quando você tem 0% de RAM sobrando, o SWAP começará a coletar dados). Você também pode simplesmente editar o /etc/sysctl.conf de acordo com o seu gosto, em vez de adicionar esse comando ao final dele toda vez usando gedit ou nano ou qualquer outra coisa, certifique-se de usar o sudo, esse arquivo é propriedade da raiz. Reinicie e você está pronto!

  2. Reduza o consumo de RAM por outros processos ou feche outros programas enquanto executa programas de alta memória. É por isso que a maioria dos jogos lhe diz para fechar todas as outras janelas antes de jogar, ou as instalações fazem o mesmo. Coisas como serviços de sincronização de arquivos tendem a ter muita memória.
  3. Compre mais RAM. Instalar a RAM não é tão difícil quanto parece. Um ou dois parafusos em um compartimento pequeno (se você estiver em um laptop) e um simples clique. Apenas certifique-se de comprar o tipo correto!
  4. Diminua os processos da CPU da mesma forma que você fez com a RAM. Isso ajudará essas rajadas de RAM a SWAP a serem mais fáceis.

Isso é o melhor que você pode fazer. Outros podem dizer desativar swap completamente, mas isso é perigoso e eu não recomendaria isso. Isso pode fazer com que sistemas inteiros congelem se houver um vazamento de memória ou muitos aplicativos em execução. Basta perceber que o SWAP é um fail-safe para a RAM. Definitivamente não é tão rápido ou eficiente quanto a RAM, mas é melhor do que o arquivo de paginação do Windows! (que cumpre o mesmo propósito)

EDIT: Se você estiver interessado em aprender mais sobre o SWAP, veja aqui .

    
por Zzzach... 30.09.2014 / 18:37
22

O kswapd0 roda a 99,9% de uma CPU, mas na verdade não está trocando nada

Para mim, acontece às vezes no Ubuntu 14.04 com kernel 3.19.0-50-genérico (e anterior) rodando em um VMware vm. Eu não tenho idéia, o que fez parecer, mas vem durante o tempo ocioso.

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

Solução temporária

uma reinicialização resolveu o problema - temporariamente.

após a resposta em serverfault (o kswapd geralmente usa 100% da CPU quando a troca está em uso) onde estão as mesmas configurações no meu 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

a solução era, na verdade, # 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

agora está tudo bem:

# 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

Solução permanente (a ser encontrada)?

mas desde que a razão real ainda não é conhecida, e eu não fiz nenhuma explicação adequada na rede, esta não é uma solução permanente. Na verdade, a resposta selecionada pode ser a solução permanente. Eu só queria adicionar isso para referência futura, já que uma reinicialização (para fazer sysctl ter efeito) nem sempre é possível.

Outra solução pode ser definir o THP como madvice ou never (consulte o comentário do poige ao seu answer , Como modifico" / sys / kernel / mm / transparent_hugepage / enabled " e o Manual MongoDB referenciado em Desativar páginas enormes e transparentes (THP) )

trabalho cron

Eu configurei o seguinte lote como uma tarefa cron como uma solução "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

invocado com

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

16.04 14.04 trocar

    
por Martin Rüegg 20.02.2016 / 11:09

Tags