¿Por qué usar el intercambio cuando hay más que suficiente espacio libre en la RAM?


125

El uso de espacio de intercambio en lugar de RAM puede ralentizar drásticamente una PC.

Entonces, ¿por qué, cuando tengo más que suficiente RAM disponible, utiliza mi sistema Linux (Arch) el intercambio?

Echa un vistazo a mi salida conky a continuación:

salida conky

Además, ¿podría ser esta la causa de los problemas de velocidad y capacidad de respuesta del sistema que estoy teniendo?

Salida de free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357

55
Estoy bastante seguro de que la dinámica de este problema ha cambiado significativamente con los SSD convirtiéndose en la norma. Si bien su SSD de consumo habitual sigue siendo mucho más lenta que la RAM, ahora es una cuestión de lo que es más barato: RAM $ / GB o SSD $ / GB. El SSD, aunque más lento, es mucho más barato y, en la mayoría de los casos, lo suficientemente rápido, por lo que incluso el intercambio no debería perturbar significativamente la experiencia del usuario como solía hacerlo con los medios rotativos.
lkraav

77
A veces, si usó el intercambio en el pasado debido a la RAM completa, puede tener una situación en la que los datos intercambiados anteriormente permanecen allí porque no son datos útiles en este momento.
Totor

1
Como dijo Totor. Algunas veces el sistema buscará algo (por cualquier razón). Si más tarde esa página vuelve a la memoria para una operación de lectura, la copia en el espacio de intercambio no se elimina. Si la misma página se vuelve a paginar más tarde, sin cambiarla, puede hacerlo sin volver a escribir en el disco. La copia que está allí ya está actualizada. En otras palabras, una página puede ocupar espacio tanto en el intercambio como en la memoria principal.
izak

Respuestas:


93

Es normal que los sistemas Linux utilicen algunos intercambios incluso si todavía hay RAM libre. El kernel de Linux se moverá a páginas de memoria de intercambio que rara vez se usan (por ejemplo, las gettyinstancias en las que solo usa X11 y algún otro demonio inactivo).

El uso del espacio de intercambio se convierte en un problema solo cuando no hay suficiente RAM disponible, y el núcleo se ve obligado a mover continuamente las páginas de memoria para intercambiar y volver a la RAM, solo para mantener las aplicaciones en funcionamiento. En este caso, las aplicaciones de monitoreo del sistema mostrarían mucha actividad de E / S de disco.

A modo de comparación, mi sistema Ubuntu 10.04, con dos usuarios conectados con sesiones X11 que ejecutan el escritorio GNOME, utiliza ~ 600 MB de intercambio y ~ 1 GB de RAM (sin contar buffers y caché fs), por lo que diría que sus cifras de intercambio El uso parece normal.


39
Al intercambiar programas inactivos, tiene más memoria para el almacenamiento en caché de archivos. Y eso acelera las cosas.
jmanning2k

91

Este comportamiento se puede configurar estableciendo el valor de:

/proc/sys/vm/swappiness

El valor predeterminado es 60. Establecerlo en 0 significa que nunca debe usar el intercambio cuando todavía queda RAM y 100 está intercambiando memoria lo antes posible.

Para cambiar el valor temporalmente (perdido al reiniciar):

sudo sysctl vm.swappiness=10

Para cambiar el valor permanentemente, edite el archivo:

/etc/sysctl.conf

como raíz (por ejemplo sudo nano /etc/sysctl.conf) y cambiar o agregar (si no está allí) la línea:

vm.swappiness

al valor deseado Si este archivo no existe (por ejemplo, en Arch Linux), intente en su /etc/sysctl.d/99-sysctl.conflugar.

Se ha debatido si intercambiar con memoria libre disponible es bueno o malo, pero la ayuda de Ubuntu recomienda un valor de 10 para los sistemas de escritorio . Vea también este tutorial sobre Digital Ocean para CentOS .


27
Tenga en cuenta que reducir el intercambio no significa necesariamente un aumento del rendimiento o la capacidad de respuesta. He visto informes de un intercambio cada vez mayor que se traduce en un mejor rendimiento. No creas nada de lo que leas que no incluya puntos de referencia, y verifica que los puntos de referencia usen una carga de trabajo similar a la tuya.
Gilles

¿Esto persiste durante el reinicio? Pensé que / proc se regeneraba cada arranque.
HandyGandy

@HandyGandy: agregué información a la respuesta sobre cómo cambiarla permanentemente.
Marcel Stimberg el

@HandyGandy: para ser pedante, / proc no se regenera en cada arranque, sino que proc es un sistema de archivos virtual, por lo que solo se "genera" cuando se accede a ellos. No existe en el disco en absoluto.
Mentira Ryan

swappinessEl valor no tiene ningún efecto en mi sistema. Incluso estableciéndolo en 0, continuará moviendo páginas cruciales y de uso frecuente (por ejemplo, el índice de mi IDE) para intercambiar cuando todavía hay 2GB de RAM libre.
chefarov

46

Linux comienza a intercambiarse antes de que se llene la RAM. Esto se hace para mejorar el rendimiento y la capacidad de respuesta:

  • El rendimiento aumenta porque a veces la RAM se usa mejor para el caché de disco que para almacenar la memoria del programa. Por lo tanto, es mejor cambiar un programa que ha estado inactivo durante un tiempo y, en su lugar, mantener los archivos de uso frecuente en la memoria caché.

  • La capacidad de respuesta mejora al intercambiar páginas cuando el sistema está inactivo, en lugar de cuando la memoria está llena y algún programa se está ejecutando y solicita más RAM para completar una tarea.

El intercambio ralentiza el sistema, por supuesto, pero la alternativa al intercambio no es no cambiar, es tener más RAM o usar menos RAM.


Entonces, en cierto sentido, ¿el intercambio es una medida en el caso ? ¿Eso y lo de hibernar ?
tshepang

@Tshepang: tener suficiente intercambio para adaptarse a su memoria virtual no es "por si acaso", es necesario (de lo contrario, sus programas se bloquearán debido a la falta de memoria).
Gilles

1
@Tschepang: El asesino de OOM es la razón por la que colapsan. (Técnicamente, podría prescindir de un asesino OOM y simplemente no poder asignar nada, pero eso tendría una buena posibilidad de bloquear el sistema; el asesino OOM hace que sea un poco más probable que el administrador pueda iniciar sesión y para los procesos importantes para seguir funcionando.)
Gilles

1
Entiendo su punto "intercambiar páginas cuando el sistema está inactivo, en lugar de cuando la memoria está llena", pero el tipo apenas está utilizando el 15% de su RAM. Lejos de estar casi lleno, ¿no? Aunque un intercambio anterior causado por la RAM completa puede haber dejado esta situación ...
Totor

1
"Linux comienza a intercambiar antes de que se llene la RAM" ¿cuándo? exactamente
Yousha Aleayoub

12

Esta es una publicación antigua, sin embargo, todavía me tomaría la libertad de poner mis pensamientos aquí.

Comenzando desde abajo, Linux primero dividiría la memoria en páginas (generalmente 4K por página en el sistema x86_64). Posteriormente, se crea la memoria virtual, cuyo mapeo se realiza con memoria física utilizando MMU (Unidad de Administración de Memoria).

A los procesos se les asigna memoria desde el área de memoria virtual, así que tenga en cuenta que cuando vea / proc / meminfo, verá VMalloc * como los detalles de la memoria virtual.

Digamos que tiene un proceso que solicita memoria (digamos 300 MB, un navegador web). El proceso se asignaría a 300 MB de la memoria virtual, sin embargo, no es necesario que se asigne a la memoria (que se asigna a la memoria física). Existe el concepto de "Copiar en escritura" para la administración de memoria, según el cual, si sus procesos realmente usan la memoria asignada desde la memoria virtual (es decir, escribe algo en la memoria), solo entonces se asigna a la memoria física. Esto ayuda al kernel a funcionar correctamente en un entorno multiproceso de manera eficiente.

¿Qué son los caché?

Se comparte mucha memoria utilizada por los procesos. Digamos que la biblioteca glibc es utilizada por casi todos los procesos. ¿Cuál es el punto de mantener múltiples copias de glibc en la memoria, cuando cada proceso puede acceder a la misma ubicación de memoria y hacer el trabajo? Dichos recursos de uso frecuente se mantienen en caché para que, cuando los procesos lo exijan, se puedan hacer referencia a la misma ubicación de memoria. Esto ayuda a acelerar los procesos, ya que leer glibc (etc.) una y otra vez desde el disco llevaría mucho tiempo.

Lo anterior fue para bibliotecas compartidas por ejemplo, similar también es cierto para la lectura de archivos también. Si lee un archivo grande (digamos 100-200MB) por primera vez, tomaría mucho tiempo. Sin embargo, cuando intente y vuelva a hacer la misma lectura, sería más rápido. Los datos se almacenaron en la memoria caché y no se volvieron a leer todos los bloques.

¿Qué es el búfer?

En lo que respecta al búfer, cuando un proceso archiva E / S, se basa en el búfer del núcleo para escribir datos en el disco. Los procesos solicitan al núcleo que haga el trabajo. Entonces, en nombre del proceso, el kernel escribe los datos en su "búfer" y le dice al proceso que la escritura ha terminado. De manera asíncrona, el núcleo seguirá sincronizando estos datos en el búfer al disco. De esta forma, los procesos dependen del núcleo para elegir la hora correcta para sincronizar los datos en el disco, y los procesos podrían continuar trabajando en el futuro. Recuerde, esto es E / S general que están haciendo los procesos normales. Sin embargo, los procesos especializados, que necesitan confirmar que la E / S se realiza realmente en el disco, pueden usar otro mecanismo para realizar E / S en el disco. Algunas de las utilidades de código abierto son libaio. Además, hay formas de llamar a la sincronización explícita a los FD abiertos en el contexto de sus procesos,

¿Qué son las fallas de página entonces?

Considere un ejemplo, cuando inicia un proceso (digamos un navegador web), cuyo binario es de aproximadamente 300 MB. Sin embargo, los 300 MB completos del binario del navegador web no comienzan a funcionar instantáneamente. El proceso continúa moviéndose de funciones a funciones en su código. Como se dijo anteriormente, la memoria virtual se consumiría 300 MB, sin embargo, no toda la memoria se asigna a la memoria física (RSS - la memoria residente sería menor, ver salida superior). Cuando la ejecución del código llega a un punto, para el cual la memoria no está realmente mapeada físicamente, se producirá un error de página. Kernel mapearía esta memoria a física, asociaría la página de memoria a su proceso. Este fallo de página se denomina "Fallos de página menores". De manera similar, cuando un proceso está haciendo E / S de archivo, se generan fallas importantes en la página.

¿Cuándo y por qué ocurre el intercambio?

Situación 1:

En línea con los detalles anteriores, consideremos un escenario cuando la buena cantidad de memoria se convierte en memoria asignada. Y ahora se inicia un proceso, que requiere memoria. Como se discutió anteriormente, el núcleo tendrá que hacer un mapeo de memoria. Sin embargo, no hay suficiente RAM física disponible para asignar la memoria. Ahora, el núcleo primero buscará en la memoria caché, tendrá algunas páginas de memoria antiguas que no se están utilizando. Vaciará esas páginas en una partición separada (llamada SWAP), liberará algunas páginas y asignará páginas liberadas a la nueva solicitud que viene. Como la escritura en disco es mucho más lenta que la RAM de estado sólido, este proceso lleva mucho tiempo y, por lo tanto, se observa una desaceleración.

Situación 2:

Digamos que ve mucha memoria libre disponible en el sistema. Incluso entonces ves que está sucediendo mucho intercambio. Podría haber un problema probable de fragmentación de la memoria. Considere un proceso que requiere 50 MB de memoria contigua del núcleo. (tenga en cuenta contiguo). Obviamente, el núcleo habría asignado páginas al azar a diferentes procesos, y habría liberado algunos de ellos. Sin embargo, cuando exigimos memoria contigua, tendrá que buscar un fragmento que satisfaga la demanda de los procesos. Si no puede obtener dicha memoria, tendrá que cambiar algunas páginas de memoria antiguas y luego asignar las contiguas. Incluso en tales casos, sucedería SWAP. Comenzando Kernel ver 2.6 y superior, tales problemas de fragmentación se han reducido considerablemente. Sin embargo, si el sistema se ejecuta durante mucho tiempo, aún podrían surgir tales problemas.

Ver este ejemplo ( salida vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, vemos que todavía hay una buena cantidad de RAM disponible. Sin embargo, incluso entonces sucedió el intercambio. Verificamos el árbol de procesos en este punto, y no vimos ningún proceso que demande tanta cantidad de memoria (más que memoria libre). La sospecha obvia era la situación 2 descrita anteriormente. Verificamos los registros de buddyinfo y zoneinfo arriba (Use echo m> / proc / sysrq-trigger para verificar esto, la salida va a syslogs).

Para un sistema normal nuestro, la comparación de la información de zona va así. Y los gráficos para caché / libre / baja memoria también se mencionan a continuación

información de zona

intercambio libre bajo libre

Mirando la información, está claro que hay fragmentación de memoria en el nodo 0 y el nodo 1 normal (Nodo, es una máquina basada en NUMA, por lo tanto, múltiples nodos (consulte el numactl para verificar la información de su sistema)).

La fragmentación de la memoria también es una razón por la cual el uso de intercambio puede aumentar incluso cuando hay memoria libre.


2
Debe aclarar si en su "situación 2", el proceso exigente es asignar memoria física, lo cual es un caso inusual. La mayoría de los procesos solo se ocupan de la memoria virtual donde la fragmentación es casi irrelevante. También es posible que desee explicar mejor cómo afirma que hay fragmentación de la memoria de los números y el gráfico que se muestra, ya que no es obvio a primera vista. Ah, y por cierto, en realidad estás hablando de memoria contigua , con suerte no memoria contagiosa ;-)
jlliagre

@jlliagre: Gracias por los aportes. Estoy editando el error "contiguo".
Anugraha Sinha

5

Tener más memoria disponible

Como todos decían, sí swap lo ayudará a deshacerse de la memoria no utilizada, por lo que puede ayudarlo a tener más memoria disponible.

Hibernando

Pero el intercambio también se puede utilizar para hibernar, lo que puede ser realmente útil cuando tiene una computadora portátil o desea ahorrar energía y poner su computadora y trabajar en hibernación antes de dejar el trabajo. Para que pueda comenzar más rápido la mañana siguiente.

Tener una función de hibernación es una de las principales razones por las que todavía vemos que hoy en día aconsejamos tener al menos el tamaño de RAM para el intercambio. De esa forma, el sistema puede poner toda la RAM utilizada en el intercambio y entrar en hibernación.

Deficiencias

Tenga cuidado de que una vez intercambiados los datos de un proceso puedan leerse en el intercambio incluso después del apagado, a menos que el intercambio haya sido encriptado (por supuesto).

El uso de intercambio cifrado con hibernación no funciona listo para usar con todas las distribuciones. Debe usar una clave de cifrado constante (algunas configuraciones generan aleatoriamente la clave de cifrado de espacio de intercambio en cada arranque) y un initrd / initramfs para activar el volumen cifrado antes de reanudar.


3

Muchos programas modernos se basan en marcos hinchados que arrastran una gran cantidad de basura que realmente no necesita para ejecutar el programa. Intercambiar esas páginas no utilizadas libera RAM para caché y programas que realmente pueden hacer uso de la RAM.

Hablo de una experiencia personal dolorosa aquí.

El año pasado, cambié uno de mis sitios web a un nuevo y prometedor marco de servidores web que se creó sobre Firefox. Puede sonar extraño construir un sistema del lado del servidor sobre un programa centrado en el cliente como Firefox, pero tuvo algunos beneficios enormes. Firefox es muy potente, ofrece algunos servicios internos realmente impresionantes y reduce la falta de coincidencia de impedancia entre el servidor y el cliente para que ambos ejecuten plataformas similares.

Pero hay un inconveniente: Firefox es grande. Realmente grande. Este era un tipo de proyecto de versión 1.x, por lo que no habían abordado cosas como eliminar el soporte de la GUI. [*] Mi sitio no necesitaba nada de eso, pero debido a la tecnología VPS que utilizaba mi proveedor de hosting no No permita el espacio de intercambio, ese código GUI y todas las otras partes de Firefox que no utilicé comieron RAM real. Terminé necesitando un mínimo de 512 MB de RAM solo para ejecutar el sitio sin que falle debido al agotamiento de la memoria. Si mi VPS tuviera algo de espacio de intercambio, probablemente podría haber logrado un plan de 256 MB.

[*] Eliminar el código GUI del marco puede incluso no haber sido deseable, ya que uno de los beneficios de esta plataforma fue el raspado web de alta fidelidad, porque el marco del lado del servidor podría descargar páginas web de otro sitio, y podría manipularlas tal como lo haría en el lado del cliente. Piensa mashups. Gran parte de ese tipo de cosas se romperían si no puede "renderizar" la página web en algún contexto gráfico.

Por cierto, este marco web está esencialmente muerto ahora, por lo que no tiene sentido nombrarlo y avergonzarlo. Lo mejor es tomar la lección más amplia en serio: sí, el intercambio sigue siendo útil incluso si tiene conciertos de RAM libre.


3

Desde Ubuntu Swap FAQ que Marcel se vinculó a

Como mínimo base, se recomienda que el espacio de intercambio sea igual a la cantidad de memoria física (RAM). Además, se recomienda que el espacio de intercambio sea el doble de la cantidad de memoria física (RAM) dependiendo de la cantidad de disco duro

Creo que debería aumentar su espacio de intercambio en su sistema. El intercambio acelera la asignación de memoria RAM al permitir descartar datos ya paginados.


66
Todavía encuentro esto increíble. ¿Por qué debería necesitar 8 GB de intercambio para mi sistema de 4 GB que nunca hiberna? ¿Realmente necesito 128 GB de intercambio para mi nodo de cómputo de 64 GB? Por lo general, no asigno más de 1 GB para el intercambio a menos que haya una razón muy específica.
David Mackintosh el

2
Deja más espacio para almacenar en caché la unidad de disco duro lenta como todo el mundo en la RAM a la velocidad del rayo. (Además, algunos esquemas de hibernación guardan una copia de RAM en el espacio de intercambio)
Arafangion

66
@David, @Jader: La figura swap = 2 * ram es una vieja castaña que sobrevivió mucho después de que la justificación original se volviera irrelevante; ahora las personas intentan encontrar una manera de justificar esta figura, en lugar de encontrar una figura adecuada para su sistema . ¿ Ves por qué necesitamos configurar el espacio de intercambio tan grande como nuestra memoria física? .
Gilles

1
@Gilles Me quedo con mi posición porque una vez vi un documento autorizado sobre este tema que contradice a un grupo de expertos que no sé cuán profundo es su conocimiento.
Jader Dias el

44
Si puede recordar la referencia, por favor comparta.
Gilles

2

Creo que "Gilles" ya mencionó el hecho de que, si bien es posible que tenga RAM más que suficiente, el intercambio puede ser útil durante ciertas "deficiencias", así como guardar persistentemente algunos datos incluso después de los apagados, ¿o me equivoco al asumir eso? ya que la RAM se vacía después de reiniciar) Tengo 12 GB de RAM disponibles en mi sistema, y ​​yo también he reflexionado sobre esta pregunta antes. En un momento, cuando desactivé todo el intercambio y solo confiaba en mi RAM, tuve experiencias dolorosamente difíciles al tratar de depurar algún error del sistema, o fallar, etc. después del apagado del sistema. Desde entonces, he vuelto a habilitar la partición de intercambio.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.