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)?

swapoff -así 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 -acausa de la "tormenta" de E / S?fstablínea sobre el intercambio. Intenta si el comportamiento es el mismo.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 hiceswapoff -aporque el intercambio era 0 en ese momento.swapoff -aes 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/meminfoen 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
chromiumprocesos 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
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: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 ).fuente
swapeninit.d, ni tengo enfstab, pero tengo/etc/init.d/mountoverflowtmpque se montatmpfspara las escrituras de registro de emergencia. ¿El demonio de intercambiotmpfstambié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, porquetmpfses un sistema de archivos en memoria (RAM). Pero otros servicios / programas que utilizantmpfspueden 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 eltmpfscontrolador reclama el acceso al espacio de intercambio.swapoffy víavm.swappiness=0. Sin embargo,kswapd0todaví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/fstabque ejecutarswapoff -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.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.fuente
kswapd0vuelve loco y no tiene activado el intercambio, está sin RAM. Sus opciones son OOM Killer okswapd0. Linux funcionakswapd0porque 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/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;)).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_cachescuandoActive(file):(de / proc / meminfo) supere los 2 GB (en un sistema RAM de 16G), puede llegar a un máximo de 4G