¿Por qué se usa parte de mi espacio de intercambio cuando todavía tengo RAM sin usar?

9

Más curiosidad que problema; y, lo admito, es una pregunta embarazosamente básica:

Me di cuenta de que en muchas ocasiones, en mi máquina Linux tendré ~ 500 MB de espacio de intercambio en uso, a pesar de que tengo ~ 600 MB de RAM no utilizada.

Mi ingenua comprensión de alto nivel fue que el espacio de intercambio no se activa hasta que se agota la RAM.

Fui más allá e hice la suposición de que esta situación debe ser del núcleo de Linux, porque un proceso de usuario que solicita memoria, lo hace solo lógicamente y no tiene idea de si esa memoria está físicamente respaldada por RAM o el espacio de intercambio.

Lo que lleva a la pregunta, ¿por qué el núcleo usaría preventivamente el espacio de intercambio? ¿Es esto parte de algún algoritmo de ajuste de rendimiento? ¿Se está intercambiando a partes de disco de memoria que considera menos probable acceder (un esquema LRU, tal vez)? Si es así, ¿no tendría sentido dejar todo en la RAM, y solo cuando se acerca el agotamiento, entonces y solo entonces intercambiar las porciones LRU de la RAM al espacio de intercambio?

Debo aclarar que mi servidor Linux tiene 2 GB de RAM y 2 GB de espacio de intercambio.

user35997
fuente
1
¿Por qué los 4 votos para cerrar esta pregunta?
2
@ Aaron: No es que tengas una mala pregunta. Acaba de redactarlo en términos de administración del sistema para que se adapte mejor tanto a los usuarios avanzados como a los administradores de servidores. Que te lo preguntes como curiosidad parece más un POV de usuario avanzado.

Respuestas:

11

La parte no utilizada de la RAM se usa de hecho como caché de HDD. Si lo piensa, en realidad lee partes de su disco con más frecuencia que accede a algunas partes de la RAM. Lo que tiene sentido poner esta RAM en el disco, mientras se usa RAM para almacenar en caché los datos del HDD.

Didier Trosset
fuente
7

Tiene sentido cambiar las cosas por adelantado, ya que cuando realmente necesita la memoria, no tendrá que esperar hasta que el núcleo esté listo para acceder al disco.

Por ejemplo, supongamos que desea abrir una imagen grande. Cuando se carga la imagen, se necesitan 300 MB de RAM. Si el kernel usa toda la RAM que puede, cargar su imagen requiere que el kernel transfiera 200 MB de la RAM al disco. Si vació la RAM de forma proactiva de antemano, ahorrará unos pocos milisegundos.

Xr.
fuente
7

2 razones:

  1. (@dtrosset) Linux intercambiará bits de programas no utilizados para dar más caché y buffers.
  2. Es posible que haya usado más memoria en el pasado e intercambiado algunas cosas, y no se ha intercambiado porque no se ha utilizado, a pesar de que todo lo que lo forzó se ha ido.
Douglas Leeder
fuente
1

Además de las otras respuestas, puede configurar Linux para que requiera respaldo para cualquier memoria asignada, incluso si los programas no la usan.

Sin embargo, el exceso de memoria y el temor al asesino de OOM no son partes necesarias de la experiencia de Linux. Simplemente establecer el parámetro sysctl vm / overcommit_memory en 2 desactiva el comportamiento de sobrecompromiso y mantiene a raya al asesino OOM para siempre. La mayoría de los sistemas modernos deberían tener suficiente espacio en disco para proporcionar un amplio archivo de intercambio para la mayoría de las situaciones. En lugar de tratar de evitar que se maten los procesos favoritos cuando se agota la memoria comprometida en exceso, podría ser más fácil evitar la situación por completo. [ Respiro del asesino OOM ]

Si un programa asigna memoria, el núcleo puede simplemente marcar más páginas de intercambio como confirmadas. Esta indicación se almacena en el administrador de memoria del kernel, el espacio de disco real aún no se ha tocado. Hasta que se use esa memoria, nada tiene que intercambiarse dentro y fuera. Si nunca se usan, el uso del intercambio fluctuará sin afectar el rendimiento.

Debido a que los procesos se presentan con su propio espacio de direcciones o "vista" (así es como funciona el intercambio en primer lugar), el núcleo tiene mucho margen de maniobra en cómo lo maneja. Utilizando un ejemplo de fork también del artículo vinculado anteriormente, dado que es mucho más probable que haya compartido páginas de memoria que asignar una gran cantidad de memoria no utilizada, la memoria se puede asignar copia en escritura, aumentando el recuento de uso de intercambio. Cuando en realidad está escrito en (lo que podría no suceder), entonces ese "intercambio comprometido" puede reemplazarse por cualquier RAM no utilizada (luego aumenta el uso de RAM y disminuye el uso de intercambio). Imagine un proceso con 500 MB asignados que se bifurca en una máquina con toda o casi toda la RAM en uso. Si hay 500 MB disponibles en el intercambio (y el espacio en disco es barato, ¿qué tan grande es el 1% de las unidades de TB actuales?: P), no se debe copiar memoria (todavía,

Por lo tanto, se evita la posibilidad del asesino OOM, y es mucho más simple diseñar la mayoría del software con la suposición de que las asignaciones de memoria (incluidas las asignaciones "implícitas" a través de algo como fork) tienen éxito o fallan de inmediato, con la práctica de que si la memoria debe ser intercambiado entonces podría afectar el rendimiento. Ese impacto casi siempre es leve, pero en el peor de los casos conduce a una paliza de intercambio (aún a veces preferible a un bloqueo directo del kernel o un asesino OOM).

Aunque no conozco los detalles exactos de cómo funciona el administrador de memoria de Linux, esta respuesta es mi propia comprensión generalizada y lo que recuerdo haber leído a lo largo de los años. Intenté volver a editar esta respuesta, por lo que se requiere una comprensión mínima del diseño del sistema operativo (es considerablemente complejo y no es algo que me interese demasiado), pero parece divagar un poco; avíseme si ve cómo podría mejorarse. Por otro lado, podría no ser una pregunta tan vergonzosamente básica.

Roger Pate
fuente