Ich habe zwei verschiedene Debian 10-Installationen, beide mit 4 Kernen/8 GB-RAM (nennen Sie sie A und B).
Der Wert von /proc/sys/kernel/threads-max
ist jedoch völlig unterschiedlich:A=63388 und B=7055.
Der Wert von threads-max sollte total sein virtual memory / stack size
[1]. Die Werte für Stapelgröße und virtuellen Speicher sind in beiden Installationen gleich ( ulimit -s
=8192, ulimit -v
=unbegrenzt), Swap ist auf beiden Systemen ausgeschaltet. Auch die anderen Sysctl-bezogenen Konfigurationen sind in beiden VMs ähnlich.
Was ist also die Ursache für den threads-max
Unterschied zwischen den beiden Systemen?
PS1: Der Wert cat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}'
ist: A=2359295 und B=6029273
PS2: Kernel-Boot-Flags /etc/initramfs-tools/modules
sind in A/B gleich. A wird mit VMware bereitgestellt und B mit Proxmox.
PS3: Ich habe festgestellt, dass dmesg | grep Memory:
es bei zwei VMs Unterschiede gibt: (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)
Und 8113684 / 903068 = 63388 / 7055
!!
Antwort1
Aus dem Quelltext von 4.19.170, in der Datei Documentation/sysctl/kernel.txt:
Threads-Max
Dieser Wert steuert die maximale Anzahl von Threads, die mit fork() erstellt werden können.
Während der Initialisierung setzt der Kernel diesen Wert so, dass selbst wenn die maximale Anzahl an Threads erstellt wird, die Thread-Strukturen nur einen Teil (1/8) der verfügbaren RAM-Seiten belegen.
Der Mindestwert, der in threads-max geschrieben werden kann, ist 20. Der Höchstwert, der in threads-max geschrieben werden kann, wird durch die Konstante FUTEX_TID_MASK (0x3ffffffff) angegeben. Wenn ein Wert außerhalb dieses Bereichs in threads-max geschrieben wird, tritt ein Fehler EINVAL auf.
Der geschriebene Wert wird mit den verfügbaren RAM-Seiten verglichen. Wenn die Thread-Strukturen zu viel (mehr als 1/8) der verfügbaren RAM-Seiten belegen würden, wird threads-max entsprechend reduziert.
Das bedeutet, dass Sie diesen Parameter entweder direkt oder über
# sysctl kernel.threads-max=255353
Dieser Wert ist auf den beiden Systemen unterschiedlich, weil sie eine unterschiedliche Kernelversion haben oder der Bootstrapping-Prozess unterschiedlich ist oder die Systemkonfiguration unterschiedlich ist. Außerdem sollten sie unterschiedliche Werte haben, weil der Wert, wie gesagt, von zwei anderen, konfigurierbaren Parametern abhängt und Ihre Systeme nicht identisch sind.