kswapd0 está tomando mucha CPU

46

kswapd0 está tomando el 99.9% de mi CPU, como me muestra la parte superior, el problema apareció hoy cuando jugué y la primera vez desapareció después de 6 minutos y ahora lo ha estado haciendo durante unos 20 minutos. ¿Cómo es esto reparable y qué está causando esto?

Kaspar
fuente
Esto también sucede conmigo en Ubuntu 14.04.
eri0o
Esto también me está sucediendo para 18.04. Detalles aquí: askubuntu.com/questions/1118932/…
Yuvraj Jaiswal

Respuestas:

49

El proceso kswapd0 es el proceso que administra la memoria virtual. Su máquina debe tener RAM, SWAP y EXT4 en su HDD / SSD. El ext4 es donde se almacena todo, y siempre es más lento el acceso que la RAM. La RAM es como un espacio intermedio para que los programas accedan a la información rápidamente. La mayoría de las computadoras tienen al menos 4 GB de RAM, que en condiciones normales es suficiente. Sin embargo, cuando juegas un juego, puedes quedarte sin espacio en RAM, que es donde entra SWAP.

SWAP es una RAM falsa ubicada en su HDD / SSD junto a su EXT4. Es de acceso más rápido que el EXT4, pero es mucho más lento que la RAM real. Cuando se queda sin memoria, kswapd0 mueve los programas que no está usando / no usa tanto como otros programas al SWAP, lo que causa un retraso extremo en esos procesos. Si su juego necesitaba 5GB de RAM, 1GB al MENOS estaría en SWAP. Eso significa que cuando intenta acceder a esa información, tiene que esperar más para obtenerla.

Todo este proceso provoca un uso extremo de la CPU, trasladando información desde y hacia SWAP y RAM y manejando la solicitud de información, todo al mismo tiempo. ¿Cómo resolver este problema?

  1. Dígale a kswapd0 que solo mueva cosas a SWAP cuando esté completamente sin RAM. Este es el método más efectivo para resolver problemas de SWAP. correr

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

    donde 0es el porcentaje restante 100en el que se debe usar SWAP (cuando tiene 0% de RAM restante, SWAP comenzará a recibir datos). También puede editar /etc/sysctl.conf a su gusto en lugar de agregar este comando al final cada vez que use gedit o nano o lo que sea, asegúrese de sudo, sin embargo, este archivo es propiedad de la raíz. Reiniciar y ya está listo!

  2. Reduzca el consumo de RAM por otros procesos o cierre otros programas mientras ejecuta programas de alta memoria. Es por eso que la mayoría de los juegos te dicen que cierres todas las demás ventanas antes de jugar, o las instalaciones hacen lo mismo. Cosas como los servicios de sincronización de archivos tienden a ocupar mucha memoria.
  3. Compra más RAM. Instalar RAM no es tan difícil como parece. Uno o dos tornillos en un compartimento pequeño (si está en una computadora portátil) y un simple clic. ¡Solo asegúrese de comprar el tipo correcto!
  4. Procesos más bajos de la CPU tanto como lo hizo con la RAM. Esto ayudará a que las ráfagas de RAM a SWAP sean mucho más suaves.

Eso es lo mejor que puedes hacer. Otros pueden decir deshabilitar el intercambio completamente, pero eso es peligroso y NO lo recomendaría. Eso puede hacer que sistemas completos se congelen si hay una pérdida de memoria o si se están ejecutando demasiadas aplicaciones. Solo tenga en cuenta que el SWAP es a prueba de fallas para la RAM. Definitivamente no es tan rápido o eficiente como la RAM, ¡pero es mejor que el Pagefile de Windows! (que cumple el mismo propósito)

EDITAR: Si está interesado en aprender más sobre SWAP, consulte aquí .

Zzzach ...
fuente
Ya no recuerdo exactamente qué me solucionó el problema, pero le agradezco la respuesta bien escrita que explica mucho.
Kaspar
Según su respuesta, finalizo algún proceso para que se use menos intercambio. Ahora el proceso kwapd0se ha ido. Gracias.
mtoloo
29

kswapd0 se ejecuta al 99.9% de una CPU pero en realidad no se intercambia en absoluto

Para mí sucede a veces en Ubuntu 14.04 con el kernel 3.19.0-50-generic (y anterior) ejecutándose en un VMware vm. No tengo idea de qué lo hizo aparecer, pero viene durante el tiempo de inactividad.

top muestra:

# 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

Solución temporal

un reinicio resolvió el problema temporalmente.

siguiendo la respuesta en serverfault (kswapd a menudo usa el 100% de la CPU cuando el intercambio está en uso) donde la misma configuración en mi 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 solución fue en realidad # 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

ahora está bien:

# 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

¿Solución permanente (por encontrar)?

pero como todavía no se conoce el motivo real, y no puse ninguna explicación adecuada en la red, esta no es una solución permanente. En realidad, la respuesta seleccionada podría ser la solución permanente. Solo quería agregar esto para referencia futura, ya que un reinicio (para que sysctl tenga efecto) no siempre es posible.

Otra solución podría ser configurar THP en cualquiera madviceo never(ver el comentario de poige a su respuesta , ¿Cómo modifico "/ sys / kernel / mm / transparent_hugepage / enabled" y el Manual de MongoDB referenciado sobre Desactivar páginas enormes transparentes (THP) )

trabajo cron

He configurado el siguiente lote como un trabajo cron como una solución "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 con

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

Martin Rüegg
fuente
Muy buena respuesta, gracias. RPi kernel actualizado y esto es lo que obtengo, berserking kswap.
Paul B
Gracias, @PaulB. Agregué a mi respuesta el trabajo cron que uso como solución permanente en mi sistema.
Martin Rüegg
Como señaló correctamente @Veger , esto también funciona en 16.04. Como actualmente me estoy usando a mí mismo. Entonces agregué la etiqueta. ¡Gracias!
Martin Rüegg el
Gracias de nuevo, @Veger ! - He corregido el signo de exclamación faltante en el Sha-Bang del guión.
Martin Rüegg
1
"echo 1> / proc / sys / vm / drop_caches" solucionó el alto uso de CPU para mí: ¡diferencia de día y noche! kswapd0 pasó de 100% de CPU a 0%. Una explicación de por qué y una solución permanente sería genial. (Nota al margen: estoy ejecutando Linux kernel 4.8.0-36-generic con 16 GB de memoria y 16 GB de intercambio.)
josephdpurcell