¿Cómo deshabilitar completamente el intercambio?

30

Estoy usando Debian sid, disco duro formateado con ext4, ejecutándose en linux 3.1

Recuerdo que en versiones anteriores de Linux (tal vez antes de 3.0), si me quedo sin memoria y el intercambio no está habilitado, los programas generalmente se bloquean. Esto es perfecto para mi entorno: navegación web simple sin operaciones críticas. Es decir, si accidentalmente me encuentro con un sitio web malo que usa demasiada memoria, simplemente se bloquea sin dejar mi terminal inutilizable.

Pero en mi configuración actual, la computadora se cuelga con un violento rendimiento de E / S en el fondo. iotop revela que kswapd0 es el culpable, lo que significa que se debe al intercambio. Después de usar swapon -spara determinar los swaps que estaban habilitados, solía swapoff -adeshabilitar todos los swaps y swapon -snuevamente para confirmar que todos los swaps estaban deshabilitados.

Luego intenté maximizar mi uso de memoria nuevamente. Por desgracia, el comportamiento que esperaba no sucedió. En cambio, kswapd0 intenta una y otra vez intercambiar la RAM y falla ya que no hay espacio de intercambio. Debido a que nunca se rinde, mi computadora está bloqueada en un congelamiento eterno de E / S, lo que es malo para la salud de mi disco.

¿Estoy haciendo algo mal al intentarlo swapoff -a? ¿Por qué el comportamiento es diferente de lo que solía ser (probablemente antes de 3.0 veces)?

syockit
fuente
Eso realmente no tiene sentido. Hacerlo por swapoff -a sí mismo , si había cosas en el intercambio, generará una gran cantidad de E / S (y puede provocar que se eliminen los procesos si no hay suficiente RAM real disponible). ¿Estás seguro de que no fue la swapoff -acausa de la "tormenta" de E / S?
Mat
1
Supongo que es suficiente comentar la fstablínea sobre el intercambio. Intenta si el comportamiento es el mismo.
enzotib
@Mat swapoff -adebería deshabilitar el intercambio de forma permanente, lo que significa que debería permanecer deshabilitado después del próximo reinicio. Confirmé esto. Sin embargo, la "tormenta" de E / S todavía ocurre durante la sesión después del próximo reinicio. Para el registro, la "tormenta" de E / S no ocurrió en el momento en que lo hice swapoff -aporque el intercambio era 0 en ese momento.
syockit
99
@syockit: noswapoff -a es permanente.
Mat
1
la carga de la base de datos alcanzó aproximadamente el 15% en 14 horas. Apagó el intercambio, y en el siguiente intento se llegó al 40% en 4 horas. Es cierto que el servidor tiene poca potencia y poca memoria RAM, pero sin intercambio activado, OpenSuSE funciona mucho más rápido para este proceso. La opinión del sistema operativo sobre "mejor" y la mía difiere dramáticamente durante una simple carga de mysql db. comentó la unidad de intercambio en / etc / fstab y la reinició.
TheSatinKnight

Respuestas:

15

Deshabilitar el intercambio no hará lo que quieres. Todavía obtendrá un rendimiento de E / S violento, pero será de páginas limpias en lugar de sucias.

Sin intercambio, el sistema comprimirá la memoria caché de las páginas limpias (sin modificar) a casi cero, porque esas son las únicas páginas que puede desalojar de la memoria física. Solo puede expulsar páginas sucias (modificadas) de la memoria escribiéndolas para intercambiar, sin intercambio, no tiene forma de expulsar páginas sucias.

A medida que tenga poca memoria física, cada proceso tendrá que cargar sus páginas de códigos desde el disco, ya que desaloja las páginas de códigos de proceso anteriores. El resultado será una violenta agitación y un trabajo excesivo realizado por el subsistema de intercambio.

Este es un caso especial de un principio muy importante: para un sistema bien diseñado, no puede hacer que funcione mejor reduciendo sus opciones. Linux es un sistema bien diseñado. Eliminar el intercambio solo le da menos opciones, por lo que no es sorprendente que se comporte peor.

David Schwartz
fuente
1
Esto solo es cierto si asigna poco menos de toda la memoria. Por lo general, un proceso de escape intentará asignar mucho más, por lo que se eliminará temprano, liberando esa memoria, en lugar de continuar intercambiando el sistema hasta la muerte tratando de acomodar más asignaciones, por lo tanto, deshabilitar el intercambio puede ser útil cuando solo maximiza su uso de ram de un proceso desbocado.
psusi
1
Un poco menos que toda la memoria siempre se asignará. Linux se ajusta específicamente de esta manera. Haga una cat /proc/meminfoen cualquier caja de Linux típica después de unas horas de carga.
David Schwartz
2
@syockit Si deshabilita la paginación, no puede ejecutar ningún programa. La paginación es el mecanismo por el cual los archivos se leen cuando se asignan a la memoria.
David Schwartz el
2
@psusi: las páginas limpias no se reducirán al mínimo cuando haya intercambiado. En su lugar, intercambiará páginas sucias y anónimas que no se han utilizado recientemente. Por supuesto, de cualquier manera, eventualmente recibirás una violenta paliza si el conjunto de trabajo excede la memoria física. El punto es que, con o sin intercambio, recibirás muchos golpes violentos antes de que realmente se te acabe la memoria. La diferencia es que, con el intercambio, el intercambio violento se intercambiará (páginas sucias, escribir y leer). Sin intercambio, la violenta paliza será fallas de código (páginas limpias, solo lectura).
David Schwartz el
2
@psusi: Tiene razón si la preocupación es un proceso desbocado que explota rápidamente en el consumo de memoria. Pero eso no es de lo que está hablando el OP, que es un proceso que consume memoria excesiva, pero no ilimitada o excesivamente masiva. A medida que crece a través del gran punto dulce (donde se aprieta el caché) crecerá más y más lentamente a medida que el sistema se agita.
David Schwartz
13

Una mejor solución que desactivar el intercambio, que en el mejor de los casos hará que se eliminen los procesos aleatorios cuando la memoria se agote, es establecer el límite del segmento de datos por proceso para los procesos que extraen cosas de la red. De esta manera, un navegador fuera de control llegará al límite y morirá, en lugar de hacer que todo el sistema quede inutilizable. Ejemplo, desde el caparazón

(ulimit -d 400000; firefox) &

El número después de -d está en kilobytes. Debe experimentar con esto en su sistema para elegir el mejor valor para sus hábitos de navegación. Los paréntesis hacen que se cree una subshell; El comando ulimit solo afecta a ese shell y sus hijos, aislando sus efectos del shell padre.

Kyle Jones
fuente
¿Funcionará para el cromo, por ejemplo, donde tenemos un montón de chromiumprocesos que utilizan pequeños fragmentos de memoria?
jberryman
@jberryman No, los límites de memoria son por proceso en lugar de por usuario.
Kyle Jones
¿Hay alguna forma de enviarle una señal específica (por ejemplo, SIGHUP) cuando alcanza el límite de memoria?
Geremia
1
@Geremia No. Las llamadas al sistema brk y sbrk dejan de funcionar, lo que hará que la mayoría de las cosas se enrosquen y mueran.
Kyle Jones
Si desea continuar con la sintonización manual, le sugiero que use el cgroup de memoria en lugar de ulimit porque con cgroup de memoria puede establecer el límite para todo el grupo de procesos y puede configurar el proceso de asignación de memoria para que se detenga y su proceso de política de modo de usuario puede decidir qué hacer. hacer (por ejemplo, enviar algunas señales, seleccionar el proceso a matar, elevar el límite de memoria sobre la marcha). Ver kernel.org/doc/Documentation/cgroup-v1/memory.txt y kernel.org/doc/Documentation/cgroup-v2.txt para más detalles.
Mikko Rantalainen
4

Para asegurarse de que no se usa el intercambio, sería mejor evitar que se agregue cualquier intercambio en el arranque. Esto se puede hacer, dependiendo del sistema, deshabilitando el swapservicio de arranque o simplemente comentando la entrada de intercambio /etc/fstab.

En lo que respecta a su bloqueo, la stop()función en /etc/init.d/swappodría dar una pista:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Observe la parte sobre el punto muerto . Puede intentar hacerlo umount -a -t tmpfsusted mismo antes de desactivar el intercambio.


Editar:

Probablemente, también podría lograr su objetivo modificando la sysctlconfiguración (consulte esta pregunta ).

rozcietrzewiacz
fuente
No tengo swapen init.d, ni tengo en fstab, pero tengo /etc/init.d/mountoverflowtmpque se monta tmpfspara las escrituras de registro de emergencia. ¿El demonio de intercambio tmpfstambién lo usa ?
syockit
Es posible que lo tenga habilitado en otro lugar; hágalo grep -RF swap /etc/si desea encontrarlo. Pero para deshabilitar un servicio, usaría un comando como service(IIRC; yo no uso Debian).
rozcietrzewiacz
1
El intercambio en sí no se usa tmpfs , porque tmpfses un sistema de archivos en memoria (RAM). Pero otros servicios / programas que utilizan tmpfspueden depender del intercambio de una manera especial. Realmente no lo sé, pero podría tener algo que ver con el almacenamiento en caché o una forma especial en la que el tmpfscontrolador reclama el acceso al espacio de intercambio.
rozcietrzewiacz
Hay algo acerca de cómo Linux maneja la memoria virtual que no entiendo. He desactivado el intercambio de la mayoría de las formas posibles: vía swapoffy vía vm.swappiness=0. Sin embargo, kswapd0todavía corre! Me pregunto si esto es una regresión de los 2.4 días ...
syockit
55
@syockit Es comportamiento esperado. El sistema todavía está intercambiando páginas limpias (páginas que contienen copias de datos de archivos). No requiere espacio de intercambio para intercambiar páginas limpias, ya que se pueden volver a leer desde fuentes que no sean de intercambio.
David Schwartz
2

Es mejor comentar la entrada de la partición de intercambio /etc/fstabque ejecutar swapoff -adespués de cada arranque.

Tengo el mismo problema con kswapd0 en mi hardware.

El vm.swappinessparámetro del sistema de ajuste no me ayuda.

sysctl -w vm.swappiness=0

Busqué en Google y leí muchas publicaciones, listas de correo, y ahora creo que esto es un error del kernel.

Cuando no hay una partición de intercambio activa y la memoria libre se vuelve inferior a un umbral (alrededor de 300 MB en mi caso) el sistema deja de responder debido a la locura kswapd0.

Probablemente se reproduce con una configuración y condiciones especiales.

Para alguien, se resuelve mediante la reinstalación del sistema con una nueva partición para otros mediante la construcción de un núcleo personalizado con kswapd0deshabilitado.

chicles
fuente
2
Si se kswapd0vuelve loco y no tiene activado el intercambio, está sin RAM. Sus opciones son OOM Killer o kswapd0. Linux funciona kswapd0porque el núcleo asume que es más importante terminar lentamente que abortar el proceso. Para los humanos ocasionales, el umbral en el que el núcleo cree que todavía se produce un avance suficiente es glacialmente lento y casi cualquier persona preferiría seleccionar OOM Killer.
Mikko Rantalainen
1

En mi sistema (debian sid 2016-11-15), hice esto:

  1. deshabilitar el intercambio ahora:

    swapoff -a
    
  2. comentar la línea con la partición de intercambio en / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. deshabilitar el montaje de intercambio en systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Sería suficiente. Hay referencia del intercambio en el /etc/initramfs-tools/conf.d/resumearchivo. No sé cuál es el propósito de esto. Tal vez este archivo sea un problema en el próximo reinicio (aún no intento reiniciar, mi tiempo de actividad es precioso;)).

homer242
fuente
1

la computadora se cuelga con un violento rendimiento de E / S en el fondo. iotop revela que kswapd0 es el culpable

He encontrado una forma (hasta ahora) para evitar eso. Si desea probarlo y ver cómo funciona en su sistema, vea el parche del núcleo dentro de esta pregunta . Básicamente, no desaloja las Active(file)páginas (al menos) cuando está bajo presión de memoria, por lo tanto, la agitación del disco (lectura constante) se reduce a casi nada y se permite que OOM-killer se active en 1 segundo, en lugar de congelar el sistema operativo por lo que parece como permanentemente (o al menos durante muchos minutos). Espero que los programadores reales (de los cuales no soy) mejoren el parche y lo conviertan en una solución real, ahora que ven que lo que hace está funcionando para estas situaciones.


fuente
¿Este parche del kernel ya está incluido?
humanityANDpeace
@humanityANDpeace probablemente no, porque no es tan bueno (ya que no soy un programador), sin embargo, tuve algunos problemas con él, como: a veces, dependiendo de la carga de trabajo, con este parche, puede quedarse sin memoria en casos en el que sin este parche no tendrías y, por lo tanto, OOM-killer matará a Xorg y xfwm4, A MENOS que corra echo 1 | sudo tee /proc/sys/vm/drop_cachescuando Active(file):(de / proc / meminfo) supere los 2 GB (en un sistema RAM de 16G), puede llegar a un máximo de 4G