私には 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/modules
A/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 つの構成可能なパラメータに依存しており、システムが同一ではないため、異なる値になるはずです。