Sticks de memoria de acceso aleatorio (RAM) para una computadora.

El valor de intercambio de Linux no tiene nada que ver con la cantidad de RAM que se usa antes de que comience el intercambio. Ese es un error ampliamente reportado y ampliamente creído. Te explicamos qué es realmente.

Rompiendo mitos sobre el intercambio

El intercambio es una técnica en la que los datos de la memoria de acceso aleatorio (RAM) se escriben en una ubicación especial de su disco duro, ya sea una partición de intercambio o un archivo de intercambio, para liberar RAM.

Linux tiene una configuración llamada valor de intercambio. Hay mucha confusión sobre lo que controla esta configuración. La descripción incorrecta más común del intercambio es que establece un umbral para el uso de RAM, y cuando la cantidad de RAM usada alcanza ese umbral, comienza el intercambio.

Este es un concepto erróneo que se ha repetido tan a menudo que ahora se recibe sabiduría. Si (casi) todos los demás te dicen que así es exactamente como funciona el intercambio, ¿por qué deberías creernos cuando decimos que no es así?

Simple. Lo vamos a demostrar.

Tu RAM está dividida en zonas

Linux no piensa en su RAM como una gran reserva de memoria homogénea. Considera que está dividido en varias regiones diferentes llamadas zonas. Las zonas que están presentes en su computadora dependen de si es de  32 bits o de 64 bitsA continuación, se muestra una descripción simplificada de las posibles zonas en una computadora con arquitectura x86.

  • Acceso directo a memoria (DMA) : estos son los 16 MB de memoria bajos. La zona recibe su nombre porque, hace mucho tiempo, había computadoras que solo podían hacer acceso directo a la memoria en esta área de la memoria física.
  • Direct Memory Access 32 : a pesar de su nombre, Direct Memory Access 32 (DMA32) es una zona que solo se encuentra en Linux de 64 bits. Son los 4 GB de memoria bajos. Linux que se ejecuta en computadoras de 32 bits solo puede hacer DMA a esta cantidad de RAM (a menos que estén usando el kernel de extensión de dirección física (PAE)), que es como la zona obtuvo su nombre. Aunque, en computadoras de 32 bits, se llama HighMem.
  • Normal : en computadoras de 64 bits, la memoria normal es toda la RAM por encima de 4 GB (aproximadamente). En máquinas de 32 bits, la RAM está entre 16 MB y 896 MB.
  • HighMem : esto solo existe en computadoras Linux de 32 bits. Es toda la RAM por encima de 896 MB, incluida la RAM por encima de 4 GB en máquinas suficientemente grandes.

El valor PAGESIZE

La RAM se asigna en páginas, que son de un tamaño fijo. Ese tamaño lo determina el kernel en el momento del arranque detectando la arquitectura de la computadora. Normalmente, el tamaño de página en una computadora con Linux es de 4 Kbytes.

Puedes ver el tamaño de tu página usando el getconfcomando:

getconf PAGESIZE

getconf PAGESIZE

Las zonas están asociadas a los nodos

Las zonas están unidas a los nodos. Los nodos están asociados con una unidad central de procesamiento (CPU) . El kernel intentará asignar memoria para un proceso que se ejecuta en una CPU desde el nodo asociado con esa CPU.

El concepto de nodos vinculados a las CPU permite que se instalen tipos de memoria mixtos en computadoras especializadas con múltiples CPU, utilizando la arquitectura de acceso a memoria no uniforme.

Eso es todo muy de gama alta. La computadora Linux promedio tendrá un solo nodo, llamado nodo cero. Todas las zonas pertenecerán a ese nodo. Para ver los nodos y las zonas en su computadora, mire dentro del /proc/buddyinfoarchivo. Usaremos lesspara hacerlo:

menos / proc / buddyinfo

less / proc / buddyinfo en una ventana de terminal

Esta es la salida de la computadora de 64 bits en la que se investigó este artículo:

Nodo 0, zona DMA 1 1 1 0 2 1 1 0 1 1 3
Nodo 0, zona DMA32 2 67 58 19 8 3 3 1 1 1 17

Hay un solo nodo, nodo cero. Esta computadora solo tiene 2 GB de RAM, por lo que no hay una zona "Normal". Solo hay dos zonas, DMA y DMA32.

Cada columna representa el número de páginas disponibles de cierto tamaño. Por ejemplo, para la zona DMA32, leyendo desde la izquierda:

  • 2 : Hay 2 de 2 ^ ( 0 * PAGESIZE) fragmentos de memoria.
  • 67 : Hay 67 de 2 ^ ( 1 * PAGE_SIZE) fragmentos de memoria.
  • 58 : Hay 58 de 2 ^ ( 2 * PAGESIZE) fragmentos de memoria disponibles.
  • Y así sucesivamente, hasta ...
  • 17 : Hay 17 de 2 ^ ( 512 * PAGESIZE) fragmentos.

Pero en realidad, la única razón por la que estamos viendo esta información es para ver la relación entre los nodos y las zonas.

Páginas de archivo y páginas anónimas

El mapeo de memoria utiliza conjuntos de entradas de la tabla de páginas para registrar qué páginas de memoria se utilizan y para qué.

Las asignaciones de memoria pueden ser:

  • Archivo respaldado : las asignaciones respaldadas por archivos contienen datos que se han leído de un archivo. Puede ser cualquier tipo de archivo. Lo importante a tener en cuenta es que si el sistema liberó esta memoria y necesitaba obtener esos datos nuevamente, se pueden leer del archivo una vez más. Pero, si los datos se han modificado en la memoria, esos cambios deberán escribirse en el archivo del disco duro antes de que se pueda liberar la memoria. Si eso no sucediera, los cambios se perderían.
  • Anónimo : la memoria anónima es una asignación de memoria sin ningún archivo o dispositivo que la respalde. Estas páginas pueden contener memoria solicitada sobre la marcha por programas para almacenar datos o para cosas como la pila y el montónDebido a que no hay ningún archivo detrás de este tipo de datos, se debe reservar un lugar especial para el almacenamiento de datos anónimos. Ese lugar es la partición de intercambio o el archivo de intercambio. Los datos anónimos se escriben para intercambiar antes de que se liberen las páginas anónimas.
  • Respaldo de dispositivo : los dispositivos se direccionan a través de archivos de dispositivo de bloque que se pueden tratar como si fueran archivosLos datos se pueden leer y escribir en ellos. Un mapeo de memoria respaldado por un dispositivo tiene datos de un dispositivo almacenados en él.
  • Compartido : varias entradas de la tabla de páginas se pueden asignar a la misma página de RAM. Acceder a las ubicaciones de la memoria a través de cualquiera de las asignaciones mostrará los mismos datos. Los diferentes procesos pueden comunicarse entre sí de una manera muy eficiente cambiando los datos en estas ubicaciones de memoria supervisadas conjuntamente. Las asignaciones de escritura compartidas son un medio común de lograr comunicaciones entre procesos de alto rendimiento.
  • Copiar en escritura : Copiar en escritura es una técnica de asignación perezosa. Si se solicita una copia de un recurso que ya está en la memoria, la solicitud se satisface devolviendo una asignación al recurso original. Si uno de los procesos que "comparten" el recurso intenta escribir en él, el recurso debe estar realmente replicado en la memoria para permitir que se realicen los cambios en la nueva copia. Por tanto, la asignación de memoria solo tiene lugar en el primer comando de escritura.

Para intercambiar, solo debemos preocuparnos por los dos primeros de la lista: páginas de archivo y páginas anónimas.

Swappiness

Aquí está la descripción del intercambio de la documentación de Linux en GitHub:

"This control is used to define how aggressive (sic) the kernel will swap memory pages. Higher values will increase aggressiveness, lower values decrease the amount of swap. A value of 0 instructs the kernel not to initiate swap until the amount of free and file-backed pages is less than the high water mark in a zone.

The default value is 60."

Eso suena a que el intercambio cambia hacia arriba o hacia abajo en intensidad. Curiosamente, establece que establecer el intercambio en cero no desactiva el intercambio. Indica al núcleo que no realice cambios hasta que se cumplan determinadas condiciones. Pero el intercambio aún puede ocurrir.

Profundicemos más. Aquí está la definición y el valor predeterminado de  vm_swappiness en el archivo de código fuente del kernel vmscan.c:

/*
* From 0 .. 100. Higher means more swappy.
*/
int vm_swappiness = 60;

El valor de intercambio puede oscilar entre 0 y 100. Una vez más, el comentario ciertamente parece que el valor de intercambio influye en la cantidad de intercambio que se realiza, con una cifra más alta que conduce a más intercambio.

Más adelante en el archivo de código fuente, podemos ver que a una nueva variable llamada  swappiness se le asigna un valor que devuelve la función mem_cgroup_swappiness()Un poco más de seguimiento a través del código fuente mostrará que el valor devuelto por esta función es vm_swappinessEntonces, ahora, la variable  swappinessse establece para que sea igual al valor que vm_swappinessse estableció.

int swappiness = mem_cgroup_swappiness(memcg);

Y  un poco más abajo en el mismo archivo de código fuente, vemos esto:

/*
* With swappiness at 100, anonymous and file have the same priority.
* This scanning priority is essentially the inverse of IO cost.
*/
anon_prio = swappiness;
file_prio = 200 - anon_prio;

Eso es interesante. Se derivan de dos valores distintos swappinessLas  variables anon_priofile_priotienen estos valores. A medida que uno aumenta, el otro disminuye y viceversa .

El valor de intercambio de Linux en realidad establece la relación entre dos valores.

La proporción áurea

Las páginas de archivo contienen datos que se pueden recuperar fácilmente si se libera esa memoria. Linux puede volver a leer el archivo. Como hemos visto, si los datos del archivo se han modificado en la RAM, esos cambios deben escribirse en el archivo antes de que se pueda liberar la página del archivo. Pero, de cualquier manera, la página del archivo en la RAM se puede volver a llenar leyendo los datos del archivo. Entonces, ¿por qué molestarse en agregar estas páginas a la partición de intercambio o al archivo de intercambio? Si necesita esos datos nuevamente, también puede leerlos del archivo original en lugar de una copia redundante en el espacio de intercambio. Por lo tanto, las páginas de archivo no se almacenan en intercambio. Están "almacenados" de nuevo en el archivo original.

Con páginas anónimas, no hay ningún archivo subyacente asociado con los valores en la memoria. Se ha llegado a los valores de esas páginas de forma dinámica. No puede simplemente volver a leerlos desde un archivo. La única forma en que se pueden recuperar los valores de memoria de páginas anónimos es almacenar los datos en algún lugar antes de liberar la memoria. Y eso es lo que tiene el intercambio. Páginas anónimas a las que necesitará hacer referencia nuevamente.

Pero tenga en cuenta que tanto para las páginas de archivos como para las páginas anónimas, liberar memoria puede requerir una escritura en el disco duro. Si los datos de la página del archivo o los datos de la página anónima han cambiado desde la última vez que se escribieron en el archivo o se intercambiaron, se requiere una escritura del sistema de archivos. Para recuperar los datos se requerirá una lectura del sistema de archivos. Ambos tipos de recuperación de páginas son costosos. Intentar reducir la entrada y salida del disco duro minimizando el intercambio de páginas anónimas solo aumenta la cantidad de entrada y salida del disco duro que se requiere para lidiar con las páginas de archivo que se escriben y leen en archivos.

Como puede ver en el último fragmento de código, hay dos variables. Uno pidió file_prio"prioridad de archivo" y otro pidió anon_prio"prioridad anónima".

  • La anon_priovariable se establece en el valor de intercambio de Linux.
  • El file_priovalor se establece en 200 menos el anon_priovalor.

Estas variables contienen valores que funcionan en conjunto. Si ambos se establecen en 100, son iguales. Para cualquier otro valor, anon_priodisminuirá de 100 a 0 y file_prioaumentará de 100 a 200. Los dos valores se incorporan a un algoritmo complicado que determina si el kernel de Linux se ejecuta con preferencia por recuperar (liberar) páginas de archivos o páginas anónimas.

Puede pensar file_prioen la voluntad del sistema de liberar páginas de archivos y anon_priocomo la voluntad del sistema de liberar páginas anónimas. Lo que estos valores no hacen es establecer ningún tipo de activador o umbral para cuándo se utilizará el intercambio. Eso se decide en otra parte.

Pero, cuando es necesario liberar memoria, los algoritmos de recuperación e intercambio tienen en cuenta estas dos variables, y la relación entre ellas, para determinar qué tipos de páginas se consideran preferentemente para liberar. Y eso dicta si la actividad asociada del disco duro procesará archivos para páginas de archivos o intercambiará espacio por páginas anónimas.

¿Cuándo entra realmente Swap?

Hemos establecido que el valor de intercambio de Linux establece una preferencia por el tipo de páginas de memoria que se analizarán para una posible recuperación. Eso está bien, pero algo debe decidir cuándo se producirá el intercambio.

Cada zona de memoria tiene una marca de agua alta y una marca de agua baja. Estos son valores derivados del sistema. Son porcentajes de RAM en cada zona. Son estos valores los que se utilizan como umbrales de activación de intercambio.

Para verificar cuáles son sus marcas de agua alta y baja, mire dentro del /proc/zoneinfoarchivo con este comando:

menos / proc / zoneinfo

less / proc / zoneinfo en una ventana de terminal

Cada una de las zonas tendrá un conjunto de valores de memoria medidos en páginas. Estos son los valores para la zona DMA32 en la máquina de prueba. La marca de agua baja es 13966 páginas y la marca de agua alta es 16759 páginas:

Valores de marca de agua DMA32 en una ventana de terminal

  • En condiciones normales de funcionamiento, cuando la memoria libre en una zona cae por debajo de la marca de agua baja de la zona, el algoritmo de intercambio comienza a escanear páginas de memoria en busca de memoria que pueda recuperar, teniendo en cuenta los valores relativos de  anon_priofile_prio.
  • Si el valor de intercambio de Linux se establece en cero, el intercambio se produce cuando el valor combinado de las páginas del archivo y las páginas libres es menor que la marca de agua máxima.

Entonces puede ver que no puede usar el valor de intercambio de Linux para influir en el comportamiento del intercambio con respecto al uso de RAM. Simplemente no funciona así.

¿A qué se debe configurar el swapiness?

Esto depende del hardware, la carga de trabajo, el tipo de disco duro y si su computadora es una computadora de escritorio o un servidor. Obviamente, esta no será una talla única para todo tipo de entorno.

Y debe tener en cuenta que el intercambio no solo se usa como un mecanismo para liberar RAM cuando se está quedando sin espacio de memoria. El intercambio es una parte importante de un sistema que funciona bien y, sin él, la administración de memoria sensata se vuelve muy difícil de lograr para Linux.

Cambiar el valor de intercambio de Linux tiene un efecto instantáneo; no es necesario reiniciar. Para que pueda realizar pequeños ajustes y controlar los efectos. Idealmente, haría esto durante un período de días, con diferentes tipos de actividad en su computadora, para tratar de encontrar lo más cercano a un entorno ideal que pueda.

Estos son algunos puntos a considerar:

  • Intentar "deshabilitar el intercambio" estableciendo el valor de intercambio de Linux en cero simplemente cambia la actividad del disco duro asociada al intercambio a la actividad del disco duro asociada al archivo.
  • Si tiene discos duros mecánicos antiguos, puede intentar reducir el valor de intercambio de Linux para evitar la recuperación de páginas anónimas y reducir la pérdida de particiones de intercambio. Por supuesto, a medida que baja una configuración, la otra aumenta. Es probable que la reducción de la rotación de intercambio aumente la rotación del sistema de archivos. Pero su computadora podría estar más feliz de favorecer un método sobre el otro. Realmente, la única forma de saberlo con certeza es probar y ver.
  • Para servidores de un solo propósito, como servidores de bases de datos, puede obtener orientación de los proveedores del software de la base de datos. Muy a menudo, estas aplicaciones tienen sus propias rutinas de administración de memoria y caché de archivos especialmente diseñadas en las que sería mejor confiar. Los proveedores de software pueden sugerir un valor de intercambio de Linux de acuerdo con las especificaciones de la máquina y la carga de trabajo.
  • ¿Para el usuario de escritorio medio con hardware relativamente reciente? Déjalo así.

Cómo establecer el valor de intercambio de Linux

Antes de cambiar su valor de intercambio, necesita saber cuál es su valor actual. Si quieres reducirlo un poco, ¿la pregunta es un poco menos de qué? Puede averiguarlo con este comando:

cat / proc / sys / vm / swappiness

cat / proc / sys / vm / swappiness

Para configurar el valor de intercambio, use el   sysctl  comando:

sudo sysctl vm.swappiness = 45

sudo sysctl vm.swappiness = 45 en una ventana de terminal

El nuevo valor se utiliza de inmediato, no es necesario reiniciar.

De hecho, si reinicia, el valor de intercambio volverá a su valor predeterminado de 60. Cuando haya terminado de experimentar y haya decidido el nuevo valor que desea usar, puede hacerlo persistente entre reinicios agregándolo al /etc/sysctl.confarchivo. . Puede utilizar el editor que prefiera. Utilice el siguiente comando para editar el archivo con el nanoeditor:

sudo nano /etc/sysctl.conf

sudo nano /etc/sysctl.conf en una ventana de terminal

Cuando se nanoabra, desplácese hasta la parte inferior del archivo y agregue esta línea. Estamos usando 35 como valor de intercambio permanente. Debe sustituir el valor que desea utilizar.

vm.swappiness = 35

El /etc/sysctl.conf en el editor nano en una ventana de terminal

Para guardar los cambios y salir de nano, presione "Ctrl + O", presione "Enter" y presione "Ctrl + Z".

La gestión de la memoria es compleja

La gestión de la memoria es complicada. Y es por eso que, para el usuario promedio, generalmente es mejor dejarlo en manos del kernel.

Es fácil pensar que estás usando más RAM de la que estás. A las empresas de servicios públicos les gusta topfreepueden dar una impresión incorrecta. Linux utilizará RAM libre para una variedad de sus propios propósitos, como el almacenamiento en caché del disco. Esto eleva artificialmente la cifra de memoria "usada" y reduce la cifra de memoria "libre". De hecho, la RAM utilizada como caché de disco está marcada como "usada" y "disponible" porque se puede recuperar en cualquier momento, muy rápidamente.

Para los no iniciados, eso podría parecer que el intercambio no funciona, o que el valor del intercambio debe cambiar.

Como siempre, el diablo está en los detalles. O, en este caso, el daemon. El demonio de intercambio de kernel.