Низкое значение `threads-max` в установке Debian

Низкое значение `threads-max` в установке Debian

У меня есть две разные установки Debian 10, обе с 4 ядрами и 8 ГБ ОЗУ (назовем их A и B).

Но значение /proc/sys/kernel/threads-maxсовсем другое:А=63388 и В=7055.

Значение threads-max должно быть total virtual memory / stack size[1]. Значение размера стека и виртуальной памяти одинаково в двух установках ( ulimit -s=8192, ulimit -v=unlimited), подкачка отключена в обеих системах. Также другие конфигурации, связанные с sysctl, похожи в двух виртуальных машинах.

Так в чем же причина разницы threads-maxв двух системах?

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:отличается в двух виртуальных машинах: (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().

Во время инициализации ядро ​​устанавливает это значение таким образом, что даже если создается максимальное количество потоков, структуры потоков занимают только часть (1/8) доступных страниц оперативной памяти.

Минимальное значение, которое можно записать в threads-max, равно 20. Максимальное значение, которое можно записать в threads-max, задается константой FUTEX_TID_MASK (0x3fffffff). Если в threads-max записывается значение, выходящее за пределы этого диапазона, возникает ошибка EINVAL.

Записанное значение проверяется на соответствие доступным страницам ОЗУ. Если структуры потоков занимают слишком много (более 1/8) доступных страниц ОЗУ, threads-max соответственно уменьшается.

Это означает, что вы можете задать этот параметр либо напрямую, либо с помощью

# sysctl kernel.threads-max=255353

Это значение отличается в двух системах, поскольку у них разная версия ядра, или отличается процесс загрузки, или отличается конфигурация системы. Кроме того, они должны иметь разные значения, поскольку, как указано, значение зависит от двух других настраиваемых параметров, а ваши системы не идентичны.

Связанный контент