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