nproc hard的默認(rèn)值是如何得到的提澎?
一臺(tái)1C2G的RHEL6版本虛擬機(jī),用于制作虛擬機(jī)模板念链,在/etc/security/limits.d/90-nproc.conf修改了用戶nproc的soft值盼忌,如下:
該配置設(shè)置了root用戶的nproc的soft值為ulimited,其他用戶的nproc的soft值為10240掂墓。然而當(dāng)檢查每個(gè)用戶的nproc值的時(shí)候驚奇地發(fā)現(xiàn)用戶的nproc的hard和soft值均為7387谦纱,如下:
這個(gè)值很奇怪,用戶nproc的soft和hard值并不是10240君编,但是在其他主機(jī)上這個(gè)配置能夠達(dá)到預(yù)期的值跨嘉。經(jīng)過分析,上面的配置中由于并沒有設(shè)置用戶nproc的hard值吃嘿,導(dǎo)致用戶nproc的soft值受到hard值的限制祠乃,取不到預(yù)期的值,因此關(guān)鍵問題需要搞清楚hard值是由哪個(gè)因素決定的兑燥。推斷nproc的hard值是在內(nèi)核獲取到的亮瓷,所以翻看了內(nèi)核代碼,果然在內(nèi)核代碼fork.c中發(fā)現(xiàn)端倪:
其中mempages是物理內(nèi)存頁的個(gè)數(shù)降瞳,PAGE_SIZE(內(nèi)存頁大兄鲋А)為4K蚓胸,THREAD_SIZE(線程棧大小)x86平臺(tái)是16K除师,所以最后默認(rèn)的nproc值為:
default_nproc = max_threads/2
= MemTotal(KB) / 256(KB)
即默認(rèn)nproc大小取決于主機(jī)內(nèi)存大小沛膳。在筆者2G內(nèi)存(實(shí)際虛擬機(jī)內(nèi)存為1877M,Hypervisor管理虛擬機(jī)有內(nèi)存開銷)的虛擬機(jī)上汛聚,計(jì)算一下:
default_nproc = 1877*1024/256 = 7508
由于kernel會(huì)占用一部分的內(nèi)存锹安,實(shí)際的nproc(本例中為7387)要比計(jì)算值稍小一些。筆者的案例中僅僅設(shè)置了用戶nproc的soft值贞岭,所以用戶的nproc的soft值被限制在default_nproc八毯。因此上面例子中有兩種解決方法:
評(píng)估需求搓侄,用戶的nproc要是少于7387的話瞄桨,就降低;
在配置文件中讶踪,設(shè)置上用戶nproc的hard值為10240芯侥,通過提升hard值來滿足預(yù)期。
因此各位看官今后要根據(jù)主機(jī)內(nèi)存配置合理地設(shè)置用戶nproc的值乳讥。
linux max_threads參數(shù)計(jì)算
內(nèi)核threads線程數(shù)是一定的柱查,具體是跟機(jī)器內(nèi)存有關(guān)系
部分參數(shù)獲取方法
PAGE_SIZE:getconf PAGE_SIZE 單位byte 頁的大小 4096即4K
THREAD_SIZE:ulimit -s 8192 線程棧大小,以KB為單位云石,即8192K唉工,8M
額定具體計(jì)算如下
max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8
mempages是物理內(nèi)存頁的個(gè)數(shù);
mempages計(jì)算
mempages = 物理內(nèi)存大小 ÷ PAGE_SIZE
例如:32G理論內(nèi)存 實(shí)際查看只有 32174M
mempages = 32174 * 1024 * 1024/4*1024 = 8236544 物理內(nèi)存頁的個(gè)數(shù)
max_threads = 8236544/[(81024)/(41024)]/8 = 514784
因?yàn)闉榱吮WC每個(gè)用戶進(jìn)程總數(shù)不至于超過一半內(nèi)存fork_init()指定:
init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;
即物理額定線程數(shù)為514784/2=257392
查看系統(tǒng)當(dāng)前最大線程數(shù)
cat /proc/sys/kernel/threads-max
252574
free -m
total used free shared buff/cache available
Mem: 31596 24180 317 3 7098 6869
31596(M)1024/4=8088576(頁數(shù))
理論最大線程=8088576(頁數(shù))/[(81024)/(4*1024)]/8=505536
實(shí)際上內(nèi)存不能都用來啟動(dòng)線程汹忠,所以實(shí)際最大線程是理論最大線程的1/2稍小一些(內(nèi)核運(yùn)行也會(huì)占用一些線程)
理論計(jì)算值 505536/2=252768
實(shí)際值 252574
鏈接:http://www.reibang.com/p/3726af3c9771