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

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

Но ценность/proc/sys/kernel/threads-maxсильно отличается: A=63388 и B=7055.

Значение threads-max должно быть общим.virtual memory / stack size[1]. Значение размера стека и виртуальной памяти одинаково в двух установках (ulimit -s=8192,ulimit -v=без ограничений), подкачка отключена в обеих системах. Кроме того, другие конфигурации, связанные с 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) доступных страниц ОЗУ, число потоков соответственно уменьшается.

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

      # sysctl kernel.threads-max=255353

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

Другие вопросы по тегам