¿Por qué Linux informa de forma extraña la memoria "libre"?

44

Esta es una pregunta canónica sobre cómo los sistemas operativos Unix informan sobre el uso de la memoria.
Preguntas similares:

Tengo un servidor de producción que ejecuta Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Todos los días cron ejecuta un script de respaldo como root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Todo funciona perfectamente, pero me doy cuenta de que el gráfico de memoria de Munin muestra un aumento de la memoria caché y las memorias intermedias después de la copia de seguridad.

Luego solo descargo los archivos de respaldo y los elimino. Después de la eliminación, el gráfico de memoria de Munin devuelve el caché y las memorias intermedias al estado que tenía antes de la copia de seguridad.

Aquí está el gráfico de Munin:

La imagen alojada externamente era un enlace muerto.

Comunidad
fuente
3
Felicitaciones, esta pregunta ha sido canonizada (es como la sexta pregunta de hoy sobre esto, y resulta ser el ejemplo más interesante y más bonito :-)
voretaq7
66
Vea LinuxAteMyRam.com
Christoffer Hammarström el

Respuestas:

27

Este es el mismo "problema" que el Servidor se niega a usar la partición de intercambio y algunas otras preguntas similares en este sitio. ( Uso elevado de memoria en el servidor Linux , uso de memoria en LINUX , servidor web con poca memoria , etc.)

Presta atención al hecho de que el consumo de memoria es de caché . Esto significa que mantiene un archivo en la memoria. La memoria caché es memoria "libre". En lugar de dejar el bloque de memoria vacío, su sistema operativo mantiene los archivos leídos recientemente en ese espacio. Si una aplicación necesita esa memoria, será utilizada por la aplicación. Hasta entonces, existe la posibilidad de evitar que tenga que leer un archivo del disco nuevamente si se hace referencia con frecuencia.

De acuerdo con este gráfico, su consumo efectivo de memoria no ha cambiado en absoluto durante toda la duración del gráfico.

Jeff Ferland
fuente
¿Es posible indicarle al servidor que no almacene en caché estos archivos? Supongo que debería correr sync; echo 3 > /proc/sys/vm/drop_cachesdespués de la copia de seguridad?
13
@ stan31337 Sí, es posible, no, no debes hacer eso. Tener este archivo en la memoria no le cuesta nada. Si borra todas sus cachés, cada archivo que se almacena en caché y debe leerse nuevamente desde el disco ralentizará su sistema. Deja que haga lo que fue diseñado para hacer.
Jeff Ferland el
2
@ stan31337 Cuando elimina su archivo de copia de seguridad, el sistema operativo lo saca automáticamente del caché (es por eso que su memoria libre salta nuevamente después de eliminarlo): Linux es lo suficientemente inteligente como para saber que un archivo que no está abierto y no puede ser alcanzado desde el árbol del sistema de archivos nunca se volverá a acceder. Como Jeff dijo que definitivamente no quiere volcar toda su caché FS (el sistema solo tendrá que volver a leer y volver a almacenar en caché esos datos del disco, lo que en realidad hará que su servidor sea más lento por un tiempo)
voretaq7
61

Estás experimentando el problema de Linux Ate My Ram .

No se asuste

Esto no es un problema.

Su sistema funciona según lo diseñado.

El problema no es su sistema operativo; el problema es su comprensión de lo que es la memoria "libre".


Los sistemas Unix usan memoria para algo más que solo ejecutar programas. La memoria puede usarse para:

  • Ejecución de programas (activo / usado)
  • Almacenamiento de datos en tránsito (buffers)
  • Almacenamiento en caché de datos recientemente leídos / escritos en el disco (caché)
  • Absolutamente nada (gratis)

Lo que sigue es un recorrido breve (y en gran medida incompleto) de cómo los sistemas Unix modernos informan el uso de RAM.

¿Qué es la memoria libre (la definición del sistema operativo) ?

Cuando un sistema Unix informa RAM como Libre , significa "No estoy usando esta RAM para nada".
La memoria RAM gratuita no tiene ningún valor: no está haciendo que su sistema sea más rápido, solo está "libre" en caso de que algo lo necesite. Ese algo podría ser cualquiera de los otros tres elementos que mencioné anteriormente.

¿Qué son la memoria caché y la memoria intermedia?

La memoria caché y la memoria intermedia son RAM que el sistema operativo está utilizando para acelerar su sistema.
Esta memoria no es necesaria para ejecutar programas en este momento , por lo que su sistema operativo la está utilizando para almacenar datos que necesita con frecuencia, por ejemplo, la biblioteca C (que necesitan casi todos los programas que ejecuta) casi siempre se guarda en la cachememoria, por lo que el sistema no tiene que ir al disco para encontrar las instrucciones que necesita para imprimir "Hello World" en la pantalla.
En realidad, es mucho más complicado que eso: hay memoria compartida , memoria cableada , etc., pero para nuestros propósitos esta explicación simple es adecuada.

¿Qué es la memoria activa?

La memoria activa es parte de lo que entendemos como memoria "usada" - RAM que las aplicaciones están usando para lo que sea que hagan - ordenar hojas de cálculo, servir páginas web, editar gráficos, etc.
La memoria "activa" ha estado "activa" recientemente - - el programa que afirma que ha hecho uso de sus contenidos (lectura o escritura), y no se considera un buen candidato para el intercambio.

¿Qué es la memoria inactiva?

Al igual que la memoria activa, la memoria inactiva es la RAM que las aplicaciones usan para lo que sea que hagan. La diferencia es que no se ha accedido a esta memoria desde hace tiempo, por lo que si se llega a empujar, el sistema operativo cree que se puede cambiar al disco y (con un poco de suerte) el programa afirma que no la volverá a pedir, por lo que Nunca lo notaré.

¿Qué es la memoria "usada" (la definición HUMANA)

Lo que usted y yo pensamos como memoria "usada" es, esencialmente, la suma de la memoria activa e inactiva. Toda la RAM actualmente reclamada por las aplicaciones para su uso.
Mientras tenga más RAM instalada que la suma de la memoria activa e inactiva (más un buen margen de seguridad de, digamos, 512-1024MB en la parte superior) estará en un lugar ACEPTABLE: su sistema operativo probablemente no afectará el intercambio y el rendimiento. .

¿Qué es la memoria "libre" (la definición HUMANA) ?

Lo que usted y yo pensamos como memoria "libre" es la memoria disponible para ejecutar programas.
Esto es un poco más complicado que solo la figura "Gratis" que informa su sistema operativo. Cuando un programa solicita RAM, el sistema operativo intentará obtener esa RAM de la manera menos disruptiva posible:

  • Si hay memoria libre disponible (sin hacer nada), se asignará esa RAM.
  • Si no hay memoria libre disponible, el sistema operativo eliminará el espacio de la memoria caché y el búfer: se eliminarán los elementos a los que se accedió menos recientemente / con menos frecuencia en el grupo de búferes, y esa RAM se le dio al programa.
  • Si no hay memoria RAM de búfer / caché para canibalizar, el intercambiador mirará la memoria inactiva y seleccionará las regiones que cree que es menos probable que accedan. Que los datos se copia en disco de intercambio (disco), y la RAM recién liberados dado al programa.
  • Si se ha intercambiado toda la RAM inactiva, el intercambiador comenzará a colocar la RAM activa en el disco.
    (Aquí se trata de que el rendimiento generalmente recae en los perros: cada vez que un programa obtiene su turno en la CPU, sus bits intercambiados deben volver a la RAM, lo que significa que la memoria activa de algún otro programa debe cambiarse : el la alta rotación en el intercambio se llama paliza )
  • Si el sistema ha cambiado todo lo que puede (y ha llenado la partición de intercambio), o si está ejecutando un sistema sin una partición de intercambio, suceden cosas malas . En este punto ocurrirá una de dos cosas:
    • malloc()fallará. Este es el comportamiento conforme con POSIX: el sistema operativo le dirá al programa que solicita RAM que no puede satisfacer la solicitud.
      El programa puede pedir menos RAM o, si no puede conformarse con una pequeña porción de memoria, puede limpiar y salir. (Si el programa está mal escrito, simplemente se bloqueará).
    • Si está en una caja de Linux, el OOM-Killer puede ir en una unidad de estilo de pandillas matando juerga, terminando otros procesos para tratar de liberar suficiente RAM para cumplir con la solicitud.
      En caso de que no pueda distinguir mi descripción aquí y mi respuesta a la pregunta vinculada, creo que esta es una forma terrible de abordar el problema.

¿Por qué sube RAM libre cuando borras archivos?

En el ejemplo de la pregunta aquí, notó que es posible "liberar" RAM eliminando el archivo de copia de seguridad; la explicación es bastante simple: dado que nada está usando ese archivo (sin identificadores de archivo abiertos) y ya no es accesible desde el sistema de archivos (desvinculado) el sistema operativo sabe que nadie volverá a acceder a esos datos y purga los datos del caché del sistema de archivos.
Esto hace que el sistema operativo informe más memoria libre, pero no tiene impacto en el rendimiento del sistema.

voretaq7
fuente
Ahora está perfectamente claro para mí ... Mi experiencia con Linux es de 2 meses, todo comenzó con este servidor Debian. Hace un mes instalé Gentoo en la computadora portátil de mi casa y me sorprendió tanto su rendimiento que cambió completamente de usuario de Windows a usuario de Linux incluso en mi computadora de trabajo. Es genial aprender Linux con Gentoo, y aún hay mucho que aprender.
@ stan31337 No eres el único para el que no está claro: es especialmente difícil para las personas que vienen de un entorno de Windows porque a menos que profundices en él, Windows no informa el uso de memoria con este nivel de detalle, es solo "Usado" (por programas ) y "Gratis" (para programas a tomar). Los usuarios de Mac lo tienen un poco más fácil porque Activity Monitor es básicamente una versión gráfica topy reporta RAM libre / cableada / activa / inactiva.
voretaq7
Yo solía trabajar con Process Explorer en Windows, que tenía un montón de cosas de memoria para mostrar, pero la mayoría de ellos eran tan claro para mí, que en realidad no se veía en ellos ...
2
Además, debe tenerse en cuenta que, aunque Windows generalmente no lo muestra con tanto detalle, tiene una configuración muy similar.
Joachim Sauer el
Ya sabes, incluso en Windows la lectura de memoria es confusa. Esto es algo en lo que los fabricantes de sistemas operativos pueden querer poner más énfasis, o más bien algo en lo que los usuarios deberían preocuparse menos de lo que lo hacen actualmente.
gparent
2

Algo más para verificar si lo anterior falla:

Verifique el uso del caché de losa ( Slab:, SReclaimable:y SUnreclaim:en /proc/meminfo). Este es un caché de estructuras de datos en el núcleo, y está separado del caché de página informado por free.

Si el caché de losa es responsable de una gran parte de su "memoria faltante", verifique /proc/slabinfopara ver dónde se ha ido. Si se trata de dentries o inodes, puede usar sync ; echo 2 > /proc/sys/vm/drop_cachespara deshacerse de ellos.

También puede usar la slabtopherramienta para mostrar el uso actual del caché Slab en un formato amigable. cordenará la lista por tamaño de caché actual.

Desde: https://stackoverflow.com/a/5467207

Chris S
fuente