Debian インストールでの `threads-max` が低い

Debian インストールでの `threads-max` が低い

私には 2 つの異なる Debian 10 インストールがあり、どちらも 4 コア/8GB-RAM です (A と B と名付けます)。

しかし、 の値は/proc/sys/kernel/threads-max非常に異なります。A=63388、B=7055です。

threads-maxの値はtotal virtual memory / stack size[1]。スタック サイズと仮想メモリの値は 2 つのインストールで同じ ( ulimit -s=8192、ulimit -v=無制限) で、スワップは両方のシステムでオフになっています。また、その他の sysctl 関連の構成も 2 つの VM で似ています。

threads-maxでは、 2 つのシステムの違いの原因は何でしょうか?

PS1: の値はcat /proc/zoneinfo | grep spanned | awk '{totalpages=totalpages+$2} END {print totalpages}'、A=2359295、B=6029273です。

PS2: カーネル ブート フラグは/etc/initramfs-tools/modulesA/B で同じです。A は vmware を使用してプロビジョニングされ、B は proxmox を使用してプロビジョニングされます。

PS3: dmesg | grep Memory:2つの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)

そして8113684 / 903068 = 63388 / 7055!!

答え1

4.19.170 のソースから、Documentation/sysctl/kernel.txt ファイル内:

スレッド最大

この値は、fork() を使用して作成できるスレッドの最大数を制御します。

初期化中にカーネルはこの値を設定するため、最大数のスレッドが作成された場合でも、スレッド構造は使用可能な RAM ページの一部 (1/8) のみを占有します。

threads-max に書き込むことができる最小値は 20 です。threads-max に書き込むことができる最大値は、定数 FUTEX_TID_MASK (0x3fffffff) によって指定されます。この範囲外の値が threads-max に書き込まれると、エラー EINVAL が発生します。

書き込まれた値は、使用可能な RAM ページと照合されます。スレッド構造が使用可能な RAM ページの多く (1/8 以上) を占める場合、threads-max はそれに応じて削減されます。

つまり、このパラメータは直接設定することも、

# sysctl kernel.threads-max=255353

この値は、カーネル バージョンが異なるか、ブートストラップ プロセスが異なるか、システム構成が異なるため、2 つのシステムで異なります。また、前述のように、この値は他の 2 つの構成可能なパラメータに依存しており、システムが同一ではないため、異なる値になるはずです。

関連情報