Tengo dos instalaciones diferentes de Debian 10, ambas con 4 núcleos/8 GB de RAM (nómbrelas A y B).
Pero el valor de /proc/sys/kernel/threads-max
es muy diferente:A=63388 y B=7055.
El valor de threads-max debe ser total virtual memory / stack size
[1]. El valor del tamaño de la pila y la memoria virtual es el mismo en dos instalaciones ( ulimit -s
=8192, ulimit -v
=ilimitado), el intercambio está desactivado en ambos sistemas. Además, las otras configuraciones relacionadas con sysctl son similares en dos máquinas virtuales.
Entonces, ¿cuál es la causa de la threads-max
diferencia entre dos sistemas?
PS1: El valor de cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}'
es: A=2359295 y B=6029273
PS2: indicadores de arranque del kernel y /etc/initramfs-tools/modules
son los mismos en A/B. A se aprovisiona mediante vmware y B se aprovisiona mediante proxmox.
PS3: encontré que dmesg | grep Memory:
difiere en dos VM: (https://github.com/torvalds/linux/blob/v4.19/mm/page_alloc.c#L7060)
A| Memory: 8113684K/8388020K available (10252K kernel code, 1241K rwdata, 3320K rodata, 1592K init, 2272K bss, 274336K reserved, 0K cma-reserved)
B| Memory: 903068K/1048032K available (10252K kernel code, 1242K rwdata, 3328K rodata, 1600K init, 2260K bss, 144964K reserved, 0K cma-reserved)
y 8113684 / 903068 = 63388 / 7055
!!
Respuesta1
Desde la fuente de 4.19.170, en el archivo Documentation/sysctl/kernel.txt:
hilos-max
Este valor controla el número máximo de subprocesos que se pueden crear usando fork().
Durante la inicialización, el kernel establece este valor de manera que incluso si se crea el número máximo de subprocesos, las estructuras de subprocesos ocupan solo una parte (1/8) de las páginas RAM disponibles.
El valor mínimo que se puede escribir en threads-max es 20. El valor máximo que se puede escribir en threads-max viene dado por la constante FUTEX_TID_MASK (0x3ffffff). Si se escribe un valor fuera de este rango en threads-max, se produce un error EINVAL.
El valor escrito se compara con las páginas de RAM disponibles. Si las estructuras de subprocesos ocupan demasiado (más de 1/8) de las páginas de RAM disponibles, el máximo de subprocesos se reduce en consecuencia.
Esto significa que puede configurar este parámetro directamente o usando
# sysctl kernel.threads-max=255353
Este valor es diferente en los dos sistemas porque tienen una versión de kernel diferente o el proceso de arranque es diferente o la configuración del sistema es diferente. Además, deberían tener valores diferentes porque, como se indicó, el valor depende de otros dos parámetros configurables y sus sistemas no son idénticos.