Niedriges „Threads-Max“ bei einer Debian-Installation

Niedriges „Threads-Max“ bei einer Debian-Installation

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-maxist 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-maxUnterschied 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/modulessind 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.

verwandte Informationen