我有兩個不同的 debian 10 安裝,都有 4 個核心/8GB-RAM(將它們命名為 A 和 B)。
但 的值/proc/sys/kernel/threads-max
卻截然不同:A=63388,B=7055。
threads-max 的值應該是total 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() 建立的最大執行緒數。
在初始化期間,核心設定此值,以便即使建立了最大數量的線程,線程結構也僅佔用可用 RAM 頁的一部分(1/8)。
可寫入threads-max 的最小值為20。如果將超出此範圍的值寫入threads-max,則會發生錯誤EINVAL。
寫入的值將根據可用 RAM 頁進行檢查。如果線程結構佔用太多(超過 1/8)可用 RAM 頁,threads-max 就會相應減少。
這意味著您可以直接設定此參數或使用
# sysctl kernel.threads-max=255353
該值在兩個系統上不同,因為它們具有不同的核心版本或引導過程不同或系統配置不同。此外,它們應該具有不同的值,因為如上所述,該值取決於其他兩個可配置參數,並且您的系統並不相同。