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.
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í?
Sencillo. Lo vamos a demostrar.
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 bits . A continuación, se muestra una descripción simplificada de las posibles zonas en una computadora con arquitectura x86 .
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 getconf
comando :
getconf PAGESIZE
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 instalar 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/buddyinfo
archivo. Usaremos less
para hacerlo:
menos / proc / buddyinfo
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:
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.
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:
Para intercambiar, solo debemos preocuparnos por los dos primeros de la lista: páginas de archivo y páginas anónimas.
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 es devuelto por 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_swappiness
. Entonces, ahora, la variable swappiness
se establece para que sea igual al valor que vm_swappiness
se 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 swappiness
. Las variables anon_prio
y file_prio
tienen 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.
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 volver a 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».
anon_prio
variable se establece en el valor de intercambio de Linux.file_prio
valor se establece en 200 menos el anon_prio
valor.Estas variables contienen valores que funcionan en conjunto. Si ambos se establecen en 100, son iguales. Para cualquier otro valor, anon_prio
disminuirá de 100 a 0 y file_prio
aumentará 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_prio
en la voluntad del sistema de liberar páginas de archivos y anon_prio
como 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.
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/zoneinfo
archivo con este comando:
menos / proc / zoneinfo
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:
anon_prio
y file_prio
.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í.
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:
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
Para configurar el valor de intercambio, use el sysctl
comando :
sudo sysctl vm.swappiness = 45
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.conf
archivo. . Puede utilizar el editor que prefiera. Utilice el siguiente comando para editar el archivo con el nano
editor:
sudo nano /etc/sysctl.conf
Cuando se nano
abra, 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
Para guardar los cambios y salir de nano
, presione «Ctrl + O», presione «Enter» y presione «Ctrl + Z».
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 top
y free
pueden 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.
El mundo del gaming ha experimentado un crecimiento exponencial en los últimos años. La…
Stokkete/Shutterstock.com ¿Sigue utilizando una unidad flash USB obsoleta para almacenar sus archivos? ¿Por qué no…
LG Los fabricantes siempre intentan mejorar el rendimiento de imagen de los monitores. Como resultado,…
Patty Chan/Shutterstock.com Si cree en lo que ve en las redes sociales, puede pensar en…
Seksan.TH/Shutterstock.com Los servicios de suscripción como Netflix, Game Pass y Spotify nos permiten consumir tantas…
fatmawati achmad zaenuri/Shutterstock El acceso a Internet, oa cualquier otra red, se rige por la…