Optimización SLUB de Linux 6.10 para reducir el consumo de memoria en escenarios extremos

Se ha puesto en cola un parche para el asignador SLUB del kernel de Linux antes de la próxima ventana de fusión de Linux 6.10 para ayudar a reducir el consumo de memoria en escenarios extremos.

El parche del ingeniero de Huawei, Chen Jun, ayudará a reducir el consumo de memoria en casos extremos. Chen Jun explicó sobre el trabajo:
Cuando se llama a kmalloc_node() sin __GFP_THISNODE y el nodo de destino carece de memoria suficiente, SLUB asigna una publicación de un nodo diferente al nodo solicitado, en lugar de tomar una losa parcial de él.

Sin embargo, como el folio asignado no pertenece al nodo solicitado, en la siguiente asignación se desactiva y se agrega a la lista de losa parcial del nodo al que pertenece.

Este comportamiento puede provocar un uso excesivo de la memoria cuando el nodo solicitado no tiene memoria suficiente, ya que SLUB asignará repetidamente publicaciones de otros nodos sin reutilizar las asignadas previamente.

Para evitar el desperdicio de memoria, cuando se indica un nodo preferido (no NUMA_NO_NODE) ​​pero sin una restricción previa de __GFP_THISNODE:

1) intente obtener una losa parcial del nodo de destino solo teniendo __GFP_THISNODE en pc.flags para get_partial()
2) si 1) falló, intente asignar una nueva losa desde el nodo de destino con GFP_NOWAIT | __GFP_THISNODE de forma oportunista.
3) si 2) falla, vuelva a intentarlo con gfpflags originales que permitirán que get_partial() pruebe listas parciales de otros nodos antes de asignar potencialmente una nueva página desde otros nodos.

Al realizar pruebas en una máquina virtual QEMU con cuatro nodos NUMA, cada uno con 1 GB de memoria y al realizar un caso de prueba simple, Chen descubrió que la cantidad de objetos asignados a través de /proc/slabinfo disminuyó de 13,519,712 a 4,200,768 objetos. O solo el 31% del número original de objetos asignados como se encuentra con los kernels de Linux actuales en este caso extremo.

El parche se encuentra en la rama “para la próxima” del repositorio SLAB.git antes de la ventana de fusión de Linux 6.10 que llegará a mediados de mayo.

Relacionado