Debian 安装中的 `threads-max` 较低

Debian 安装中的 `threads-max` 较低

我有两个不同的 debian 10 安装,均具有 4core/8GB-RAM(分别命名为 A 和 B)。

但的值/proc/sys/kernel/threads-max却有很大不同:A=63388 和 B=7055。

线程数最大值应为总和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() 创建的最大线程数。

在初始化期间,内核设置此值,以便即使创建了最大数量的线程,线程结构也只占用可用 RAM 页面的一部分(1/8)。

可以写入threads-max的最小值为20。可以写入threads-max的最大值由常量FUTEX_TID_MASK (0x3fffffff)给出。如果将超出此范围的值写入threads-max,则会出现错误EINVAL。

写入的值将根据可用 RAM 页进行检查。如果线程结构占用了太多(超过 1/8)可用 RAM 页,则threads-max 会相应减少。

这意味着您可以直接设置此参数,也可以使用

# sysctl kernel.threads-max=255353

此值在两个系统上是不同的,因为它们的内核版本不同、引导过程不同或系统配置不同。此外,它们应该具有不同的值,因为如上所述,该值取决于另外两个可配置参数,并且您的系统并不相同。

相关内容