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 -s
para determinar los swaps que estaban habilitados, solía swapoff -a
deshabilitar todos los swaps y swapon -s
nuevamente 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)?
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 laswapoff -a
causa de la "tormenta" de E / S?fstab
línea sobre el intercambio. Intenta si el comportamiento es el mismo.swapoff -a
deberí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 hiceswapoff -a
porque el intercambio era 0 en ese momento.swapoff -a
es permanente.Respuestas:
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.
fuente
cat /proc/meminfo
en cualquier caja de Linux típica después de unas horas de carga.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
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.
fuente
chromium
procesos que utilizan pequeños fragmentos de memoria?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
swap
servicio 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/swap
podría dar una pista:Observe la parte sobre el punto muerto . Puede intentar hacerlo
umount -a -t tmpfs
usted mismo antes de desactivar el intercambio.Editar:
Probablemente, también podría lograr su objetivo modificando la
sysctl
configuración (consulte esta pregunta ).fuente
swap
eninit.d
, ni tengo enfstab
, pero tengo/etc/init.d/mountoverflowtmp
que se montatmpfs
para las escrituras de registro de emergencia. ¿El demonio de intercambiotmpfs
también lo usa ?grep -RF swap /etc/
si desea encontrarlo. Pero para deshabilitar un servicio, usaría un comando comoservice
(IIRC; yo no uso Debian).tmpfs
, porquetmpfs
es un sistema de archivos en memoria (RAM). Pero otros servicios / programas que utilizantmpfs
pueden 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 eltmpfs
controlador reclama el acceso al espacio de intercambio.swapoff
y víavm.swappiness=0
. Sin embargo,kswapd0
todavía corre! Me pregunto si esto es una regresión de los 2.4 días ...Es mejor comentar la entrada de la partición de intercambio
/etc/fstab
que ejecutarswapoff -a
después de cada arranque.Tengo el mismo problema con kswapd0 en mi hardware.
El
vm.swappiness
parámetro del sistema de ajuste no me ayuda.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
kswapd0
deshabilitado.fuente
kswapd0
vuelve loco y no tiene activado el intercambio, está sin RAM. Sus opciones son OOM Killer okswapd0
. Linux funcionakswapd0
porque 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.En mi sistema (debian sid 2016-11-15), hice esto:
deshabilitar el intercambio ahora:
comentar la línea con la partición de intercambio en / etc / fstab
deshabilitar el montaje de intercambio en systemd:
Sería suficiente. Hay referencia del intercambio en el
/etc/initramfs-tools/conf.d/resume
archivo. 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;)).fuente
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
echo 1 | sudo tee /proc/sys/vm/drop_caches
cuandoActive(file):
(de / proc / meminfo) supere los 2 GB (en un sistema RAM de 16G), puede llegar a un máximo de 4G