¿Qué controla realmente el parámetro vm.swappiness?

37

Según la documentación del kernel:

This control is used to define how aggressive the kernel will swap
memory pages.  Higher values will increase aggressiveness, lower values
decrease the amount of swap.

Sin embargo, esto es un poco vago. Estoy tratando de averiguar exactamente qué controla el parámetro en última instancia. Sé que ajusta cuán agresivamente el núcleo intenta intercambiar páginas, pero ¿qué proceso de toma de decisiones en el código del núcleo afecta?

¿Ajusta hace cuánto tiempo se debe haber accedido a una página antes de que el núcleo la cambie? Si es así, ¿qué representa el valor predeterminado de 60? ¿Y cuánto cambia un incremento / decremento de 1 (una fórmula sería buena)?
¿O intercambia páginas según su frecuencia de acceso?
¿O algo mas?

Patricio
fuente
2
Sí, el intercambio es vago ;-)
phaphink

Respuestas:

27

Desde la versión del kernel 2.6.28, Linux usa una estrategia de reemplazo de página Split Least Latest Used (LRU). Las páginas con una fuente del sistema de archivos, como el texto del programa o las bibliotecas compartidas pertenecen al caché de archivos. Las páginas sin respaldo del sistema de archivos se denominan páginas anónimas, y consisten en datos de tiempo de ejecución, como el espacio de pila reservado para aplicaciones, etc. Por lo general, las páginas que pertenecen al caché de archivos son más baratas de desalojar de la memoria (ya que estas pueden leerse desde el disco cuando sea necesario) . Dado que las páginas anónimas no tienen respaldo del sistema de archivos, deben permanecer en la memoria siempre que un programa las necesite a menos que haya espacio de intercambio para almacenarlas.

La vm.swappinessopción entra en juego en get_scan_count()definido en mm/vmscan.c. get_scan_count()determina cuán agresivamente se deben escanear las listas de LRU anónimas y de archivo cuando se buscan páginas para desalojar. El valor de cada caso está determinado por el promedio flotante de las relaciones recientemente rotadas y escaneadas recientemente, donde las referencias más recientes tienen más peso que las anteriores para tener en cuenta la carga de trabajo cambiante del sistema.

El vm.swappinesses un modificador que cambia el equilibrio entre el intercambio de páginas de caché de archivos a favor de páginas anónimas. vm.swappinesses el valor de prioridad dado a las páginas anónimas, por defecto establecido en 60 . El caché del archivo tiene un valor de prioridad de 200 del que vm.swappinessse deduce el modificador ( file_prio=200-anon_prio). Esto significa que, por defecto, los pesos de prioridad son moderadamente favorables a las páginas anónimas ( anon_prio=60, file_prio=200-60=140). Sin embargo, cuando el sistema está cerca de una condición de falta de memoria , las listas de LRU anónimas y de archivo se analizan por igual, a menos que vm.swappinessse establezca en cero.

Cuando vm.swappinessse establece en 100, las prioridades serían iguales ( anon_prio=100, file_prio=200-100=100). Establecer vm.swappinessa cero evitará que el kernel expulse páginas anónimas a favor de las páginas del caché de archivos.

Thomas Nyman
fuente
¿Hay alguna manera de cambiar el intercambio de file_prio? ¿O limitarlo a un directorio particular?
CMCDragonkai
13

Hay una fórmula que se usa para calcular qué página se intercambiará. En vmscan.cpuedes ver este algoritmo:

tendencia de intercambio = mapped_ratio / 2 + distress + vm_swappiness

Aquí puede ver que swappiness es una escala, que se agrega en algún algoritmo y puede controlar con este parámetro cómo se comportará el núcleo cuando deba intercambiar. Puede calcularlo como un porcentaje de probabilidad de que se intercambie alguna página de memoria inactiva. Si establece el intercambio en 100, no hay probabilidad, pero hay una garantía de que se intercambiará y si lo establece en 0, el núcleo intentará no intercambiar en absoluto mientras tenga algo de memoria vacía.

Jan Marek
fuente
6

Se ha dicho (creo que Norman 1986) que a menudo el botón "CERRAR PUERTA" en un elevador está roto o nunca estaba conectado a nada en primer lugar. Esto hace que el control de Ersatz no sea una forma de manipular el elevador sino de apaciguar al jinete demasiado apresurado.

De manera similar, el intercambio tiene un efecto no relacionado con su control determinista bien definido de un predicado del núcleo. Como señaló @neon_overlord en askubuntu.com

Porque la mayoría cree que el intercambio = malo y que si no reduce el intercambio, el sistema cambiará cuando realmente no sea necesario. Ninguno de los dos es realmente cierto. Las personas asocian el intercambio con los momentos en que su sistema se atasca; sin embargo, es principalmente un intercambio porque el sistema se atasca, no al revés. Es cierto que hay ciertos momentos en que el intercambio puede tener una penalidad notable, pero la reducción del intercambio para ese caso puede reducir el rendimiento general del sistema o la estabilidad de otras maneras que luego pueden volverse notables ...

Entonces, ¿qué controla realmente ? Una respuesta válida, además de las excelentes respuestas ya proporcionadas, es que modifica su expectativa de que tiene más control sobre su sistema y que girar un botón le permitirá ejercer ese control de manera significativa.

msw
fuente