¿Es una mala idea crear un script cron que vacía el intercambio cada hora?

26

Durante años he tenido el mismo problema con mis pequeñas configuraciones de Ubuntu: el espacio de intercambio utilizado aumenta con el tiempo. Tengo la impresión de que esto se debe principalmente a que la memoria asignada nunca regresa a la RAM aunque haya suficiente espacio para ello, excepto en el caso de una acción del usuario como deshabilitar el intercambio.

Hice un croncomando corto para automatizar esto, y tengo buenos resultados:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Pero debido a que es más un truco que una solución real a este problema, me pregunto por las posibles razones por las que podría ser una mala idea, o ¿cómo podría mejorar este script para hacerlo un poco más inteligente?

Yvan Sraka
fuente
29
Disculpe mi ignorancia, pero ¿qué quiere decir exactamente al decir que el espacio SWAP crece con el tiempo y el vaciado a la RAM de la memoria asignada ? Normalmente asigna algo de espacio como intercambio al sistema y nunca más vuelve a saber de él. ¿A quién le importa cuánto intercambio se toma realmente? ¿Cuál es el problema?
postre
55
¿Por qué quieres hacer esto? ¿Por qué crees que algo de uso de intercambio es algo malo? ¿De cuánto uso de intercambio estamos hablando?
marcelm
25
Estoy un poco perplejo. Sigue hablando de un "problema" pero en realidad no describe ningún efecto negativo de ningún tipo. ¿Por qué consideras esto un problema?
David Schwartz el
17
Si algo se intercambia y permanece allí, es porque nada lo está usando. Y si no lo está utilizando, es mejor dejar que la memoria RAM se utiliza para algo que se accede, como caché, que a intercambio de datos en la parte posterior.
hobbs
12
¿Cómo es esto mejor que simplemente dejar el intercambio?
user253751

Respuestas:

51

Usarlo así: sí, mal. Realmente necesita verificar si hay suficiente memoria disponible antes de desactivar el intercambio. Consulte /ubuntu//a/90399/15811 para obtener una versión mejor.

Además: ¿estás seguro de esto? El intercambio que se asigna no significa que se utilice el intercambio. El comando vmstat, columnas si(intercambiar) y so(intercambiar). Si esos permanecen 0 tienes otro problema. En mi experiencia, el intercambio apenas se usa, y es posible que no lo esté usando pensando que no lo vacía, pero no hay nada que vaciar.

Rinzwind
fuente
3
¿Esperar lo? Si no hay suficiente memoria para que el intercambio tenga éxito, primero el asesino OOM mata al intercambio. Sí, en realidad lo codificaron (se verifica por llamada al sistema).
Joshua
@Joshua seguro, pero quiere que funcione de manera automatizada. No error fuera.
Rinzwind
44
Para elaborar sin entrar en escribir mi propia respuesta, el uso de intercambio que crece con el tiempo no es algo malo en absoluto . Lo que significa es que el kernel está descubriendo lentamente qué basura que consume memoria nunca se está utilizando y moviéndola para intercambiarla, de modo que la memoria se pueda usar para cosas que realmente lo ayudan (como poder mantener más datos en caché para no tiene que seguir descartándolo y releyéndolo del disco).
R ..
@Rinzwind cron funciona bien con trabajos que producen errores, y el script vinculado tampoco se usa vmstat.
jpaugh
41

Yo diría que es una mala idea. Si crees que tienes memoria libre y un proceso activo no se está moviendo de intercambio a RAM, entonces no tienes tanta memoria libre como crees que tienes, o el proceso no es tan activo como crees es.

Si se continúa intercambiando un proceso activo, debe corregir lo que sea que esté causando presión en la memoria. Si no es un proceso activo, ¿cuál es el problema?

muru
fuente
1
+1: ¿Cuál es el gran problema? Nunca cambie un sistema en ejecución , no creo que uno deba meterse con las funciones centrales del sistema de esa manera, especialmente no sin ninguna necesidad.
postre
3
A veces tengo problemas en los que elimino un proceso con una pérdida de memoria (que obligó a todo lo demás a cambiar), dejándome con ~ 10% de RAM utilizada ... pero todos los programas en ejecución están en intercambio hasta que accedo a ellos nuevamente. Entonces, cada vez que tocas algo, hay un retraso de dos segundos. Puedo ver de dónde viene OP, y sería bueno que se hiciera automáticamente, pero esta no es la forma correcta.
Alguien en algún lugar
1
@SomeoneSomewhere Pero de todos modos no es así como funciona. Si el proceso está perdiendo memoria, entonces, por definición, no está usando activamente esa memoria (no está leyendo y escribiendo); solo lo tiene asignado, por accidente. Si hay otros procesos activos, la memoria perdida se intercambiará y será su intercambio el que estará lleno de basura, no su RAM física.
David Richerby el
@DavidRicherby Si tiene un programa abierto en segundo plano, entonces ese programa aún está menos activo que la pérdida de memoria, y cuando va a volver a cambiarlo, tiene que salir del intercambio.
Alguien en algún lugar
@SomeoneSomewhere Parece que has entendido mal cómo funciona el sistema de memoria. No es necesario tener todo el proceso en la RAM física: el intercambio se gestiona según la granularidad de las páginas individuales. Cualquier página que no se haya usado durante un tiempo es probable que se cambie, y una página que consista completamente en memoria perdida nunca se volverá a usar, por lo que nunca se volverá a cambiar después de que se haya cambiado.
David Richerby
34

Es una mala idea.

El núcleo comienza a copiar (no mover) los datos para intercambiarlos mucho antes de que la memoria física esté cerca de estar llena, porque si algún proceso requiere mucha memoria, cualquier página que ya tenga una copia válida en el intercambio puede reutilizarse inmediatamente sin requerir otra escritura al disco

En general, esto ocurre principalmente para páginas a las que no se ha accedido en mucho tiempo, lo que es un buen indicador de que es poco probable que se acceda pronto.

Si descarta explícitamente las copias, eso no aporta ningún beneficio, ya que los datos aún existen en la RAM, pero puede costarle velocidad cuando algún proceso quiere asignar mucha memoria y el intercambio es necesario.

El kernel también utilizará siempre el espacio de intercambio tan pronto como la memoria física esté por encima del 50%, por lo que estos números no serán cero, incluso si tiene suficiente memoria instalada.

Simon Richter
fuente
44
siempre : creo que está asumiendo que /proc/sys/vm/swappinessse deja en su valor predeterminado de 70, que es bueno para los servidores y elimina de manera bastante agresiva las páginas sucias de los procesos que no las han tocado durante un tiempo para dejar espacio para más caché de páginas. Esto a menudo es malo para los escritorios porque alt-tab puede ser lento.
Peter Cordes
@PeterCordes, si las páginas realmente fueron expulsadas, entonces los cachés han visto más accesos que las páginas de la aplicación en cuestión, por lo que ha habido un beneficio neto al usarlos como cachés de disco. Puedo ver cómo el rendimiento de Alt-Tab es más visible para el usuario que, por ejemplo, el tiempo de compilación para un proyecto grande, pero me resulta difícil formular una política que garantice una respuesta instantánea sin sacrificar demasiado rendimiento.
Simon Richter
1
Dicho de otra manera: el kernel está ajustado para el rendimiento ( swappiness=70), pero la latencia es más importante para la experiencia del usuario en un escritorio. Es una compensación. Si compila rutinariamente cosas que son un poco demasiado grandes para permanecer en el caché de página, entonces, deje swappinessun poco más alto, como 20 o 30 en lugar de 5 o 10. Consulte también akitaonrails.com/2017/01/17/optimizing-linux-for -computadoras lentas . Ver vm.vfs_cache_pressuremenos de 100 también favorece el almacenamiento en caché de metadatos de inodo / directorio sobre páginas de datos, lo que también es bueno para la capacidad de respuesta de la interfaz de usuario.
Peter Cordes
1
Otros ajustables: umbrales de reescritura lonesysadmin.net/2013/12/22/… . Estos controlan la rapidez con que Linux comienza a escribir en el disco después de que algo escribe en los archivos y cuántas páginas sucias están permitidas. (es decir, cuánta memoria se puede gastar en el almacenamiento en caché de escritura)
Peter Cordes
21

Esta es una mala idea. Si esto fuera útil, el kernel de Linux lo implementaría de esta manera. No creo que haya una razón para cambiar más que unos pocos parámetros de ajuste, ya que un script de shell tan simple probablemente no sea más inteligente que los algoritmos de los desarrolladores del kernel.

Básicamente tienes dos casos:

  • Los procesos en el espacio de intercambio no se utilizan de todos modos. ¿Por qué quieres recuperarlos en la RAM?
  • Hay poca RAM, por lo que se intercambian y los vuelves a colocar en la RAM. Luego, su sistema los volverá a intercambiar lo antes posible.

Entonces hay dos puntos principales:

  1. Primero, su sistema será lento cuando haya muy poca RAM para ejecutar todos sus programas a la vez. Swap lo ayudará a ejecutar más programas, pero no a cambiar rápidamente a uno que rara vez se usa, que puede intercambiarse. Ningún intercambio puede hacer que el que se usa raramente sea eliminado o enviar al que se usa actualmente una excepción de memoria insuficiente.
  2. En segundo lugar, el intercambio es algo bueno y también lo es tener cosas en el intercambio, ya que tiene RAM libre al costo de los programas que actualmente no está utilizando de todos modos.

A pesar de no tener problemas de falta de memoria con demasiados programas, algunos programas pueden asignar memoria en función de la RAM libre actualmente (tal vez su navegador usará más memoria caché y puede navegar más rápido) y el núcleo puede usar RAM libre para el almacenamiento en caché del disco y optimizaciones similares. Cuando fuerce su intercambio para que esté vacío, el núcleo perderá su caché de lectura y, por ejemplo, comenzar una nueva instancia de Firefox llevará más tiempo que cuando Firefox todavía está en el caché de disco.

Si desea ajustar el comportamiento del kernel, consulte el parámetro de intercambio .

Dos recursos adicionales contribuyen por @ peter-cordes:

Si realmente desea tener un intercambio vacío, puede desactivarlo permanentemente. No veo por qué tenerlo encendido durante una hora y luego vaciarlo tiene ventajas sobre no tener intercambio.

allo
fuente
1
Vea también akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers y lonesysadmin.net/2013/12/22/… para más sugerencias / detalles de ajuste.
Peter Cordes
5

Puede lograr los mismos resultados diciéndole al núcleo que libere los cachés:

echo 3 > /proc/sys/vm/drop_caches

De esta forma, evita el breve momento de posible falta de memoria y deja que el núcleo decida qué es necesario y qué se puede descartar.

Alex C
fuente
0

Contrariamente a la idea común, SWAP en sí mismo no es malo .
Lo que realmente ralentiza su sistema es la actividad del núcleo que mueve los datos de la RAM al SWAP y de nuevo a la RAM, el swappiness.
El sistema hace esto automáticamente ya que está configurado con swappiness.
Esto hace que la memoria de los procesos inactivos se descargue en la partición de intercambio del disco duro.
Yo mismo trabajé durante años con una máquina que no tenía tanta memoria RAM y siempre usé un poco de memoria SWAP. Aún así, mi máquina funcionó bien hasta que comienzas a mover la memoria de vuelta a la RAM, quizás intentando cerrar una aplicación abierta. Entonces la carga de trabajo comenzó a aumentar.

  • Entonces, al limpiar constantemente su memoria SWAP, la carga de trabajo en su máquina aumentará considerablemente.
  • La ejecución de aplicaciones que tienen su memoria en la partición SWAP puede dañar su ejecución.

Más bien, le sugiero que estudie detenidamente qué aplicación usa su memoria en la línea de comando con la htopaplicación y decida cerrar alguna aplicación. También gnome-system-monitorpuede darle una buena idea, en su pestaña de proceso.
Si tiene grandes aplicaciones que usan mucha RAM. No los ejecutes todos a la vez.

Bodo Hugo Barwich
fuente