У меня есть две разные установки 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
Это значение отличается в двух системах, поскольку у них разная версия ядра, или отличается процесс загрузки, или отличается конфигурация системы. Кроме того, они должны иметь разные значения, поскольку, как указано, значение зависит от двух других настраиваемых параметров, а ваши системы не идентичны.