O kswapd0 está ocupando 99,9% da minha CPU, conforme mostra o topo, o problema apareceu hoje quando os jogos foram jogados pela primeira vez depois de 6 minutos e agora o faz há cerca de 20 minutos. Como isso é corrigível e o que está causando isso?
O kswapd0 está ocupando 99,9% da minha CPU, conforme mostra o topo, o problema apareceu hoje quando os jogos foram jogados pela primeira vez depois de 6 minutos e agora o faz há cerca de 20 minutos. Como isso é corrigível e o que está causando isso?
Respostas:
O processo kswapd0 é o processo que gerencia a memória virtual. Sua máquina deve ter RAM, SWAP e EXT4 no seu HDD / SSD. O ext4 é onde tudo é armazenado e é sempre mais lento de acessar 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 possui pelo menos 4 GB de RAM, o que em condições normais é suficiente. Ao jogar, no entanto, você pode ficar com pouco espaço na RAM, e é aí que entra o SWAP.
SWAP é uma RAM falsa localizada no seu HDD / SSD ao lado do seu EXT4. O acesso é mais rápido que o EXT4, mas é muito mais lento que a RAM real. Quando você fica com pouca memória, o kswapd0 move os 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 estava precisando de 5 GB de RAM, 1 GB pelo menos estaria em SWAP. Isso significa que, quando tenta acessar essas informações, precisa esperar mais para obtê-las.
Todo esse processo causa um uso extremo da CPU, movendo informações de e para SWAP e RAM e manipulando a solicitação de informações, tudo ao mesmo tempo. Como resolver este problema?
Diga ao kswapd0 para mover apenas as coisas para SWAP quando estiver completamente sem RAM. Esse é o método mais eficaz para resolver problemas de SWAP. Corre
echo vm.swappiness=0 | sudo tee -a /etc/sysctl.conf
onde 0
é a porcentagem restante 100
em que o SWAP deve ser usado (quando você tiver 0% de RAM restante, o SWAP começará a receber dados). Você também pode editar o arquivo /etc/sysctl.conf ao seu gosto, em vez de adicionar este comando sempre que usar gedit ou nano ou o que for, certifique-se de usar o sudo, esse arquivo é de propriedade do root. Reinicie e você está pronto!
É o melhor que você pode fazer. Outros podem dizer desativar completamente a troca, mas isso é perigoso e eu NÃO recomendaria isso. Isso pode causar o congelamento de sistemas inteiros se houver um vazamento de memória ou muitos aplicativos em execução. Basta perceber que o SWAP é à prova de falhas para a RAM. Definitivamente, não é tão rápido ou eficiente quanto a RAM, mas é melhor que o arquivo de paginação do Windows! (que cumpre o mesmo objetivo)
EDIT: Se você estiver interessado em aprender mais sobre o SWAP, clique aqui .
kwapd0
se foi. Obrigado.
Para mim, às vezes acontece no Ubuntu 14.04 com o kernel 3.19.0-50-generic (e anterior) sendo executado em um VMware vm. Não tenho idéia do que fez parecer, mas ocorre 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
uma reinicialização resolveu o problema - temporariamente.
seguindo a resposta em serverfault (o kswapd geralmente usa 100% da CPU quando o swap está em uso) lá onde 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 realmente # 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
mas como o motivo real ainda não é conhecido e eu não refinei nenhuma explicação adequada na rede, essa 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, pois uma reinicialização (para fazer o sysctl entrar em vigor) nem sempre é possível.
Uma outra solução pode ser definir THP como um madvice
ou never
(consulte o comentário de poige à sua resposta , Como faço para modificar “/ sys / kernel / mm / transparent_hugepage / enabled” e o referenciado Manual do MongoDB sobre Desativar Páginas Enormes Transparentes (THP) )
Eu configurei o seguinte lote como um trabalho 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