寫(xiě)在前面
我遇到了什么問(wèn)題:
- 很老的一個(gè)系統(tǒng)bug原因升級(jí),大概五六年沒(méi)有重啟機(jī)器了,4A平臺(tái)上面通過(guò)ssh遠(yuǎn)程連接linux機(jī)器,偶爾連接不上
- 即使連接之后命令無(wú)法正常執(zhí)行,執(zhí)行了沒(méi)有反應(yīng)。
- 即使可以執(zhí)行,執(zhí)行命名報(bào)-bash: fork: retry: Resource temporarily unavailable.(資源暫時(shí)不可用)
出現(xiàn)問(wèn)題的原因是什么:
Linux進(jìn)程數(shù)超過(guò)了設(shè)置的最大進(jìn)程數(shù)。會(huì)對(duì)系統(tǒng)進(jìn)行資源限制,所以分配給ssh進(jìn)程的資源時(shí)有時(shí)無(wú),一些命令的bash進(jìn)程會(huì)被殺調(diào),以保證系統(tǒng)進(jìn)程不超過(guò)設(shè)置的最大進(jìn)程數(shù),無(wú)法正常執(zhí)行。即下面的第一個(gè)輸出要遠(yuǎn)遠(yuǎn)小與第二個(gè)和第三個(gè)輸出。如果有些接近就會(huì)出現(xiàn)這種問(wèn)題
┌──[[email protected]]-[/]
└─$ ps -eLf | wc -l # 當(dāng)前進(jìn)程數(shù)
221
┌──[[email protected]]-[/]
└─$ ulimit -u # 用戶的最大進(jìn)程數(shù)
15665
┌──[[email protected]]-[/]
└─$ sysctl kernel.pid_max # 內(nèi)核設(shè)置的最大進(jìn)程數(shù)
kernel.pid_max = 150000
┌──[[email protected]]-[/]
└─$
我是怎樣解決的
修改內(nèi)核參數(shù),調(diào)整最大進(jìn)程數(shù)限制。這里修改的話需要root權(quán)限,同時(shí)需要修改兩個(gè)地方。
其一:用戶登錄會(huì)加載pam_limit模塊,pam_limit模塊讀取配置文件 /etc/security/limits.conf來(lái)限制用戶資源的占用。可以使用ulimit的命令來(lái)查看和臨時(shí)設(shè)置資源信息,也可以通過(guò) 寫(xiě)入/etc/security/limits.conf來(lái)永久配置,配置文件在每次登錄時(shí)會(huì)加載。可以用來(lái)設(shè)置ssh連接數(shù),最大進(jìn)程數(shù)等。
其二:Linux系統(tǒng)中內(nèi)核kernel模塊,有個(gè)全局的設(shè)置最大進(jìn)程數(shù)的內(nèi)核參數(shù),需要修改這個(gè)參數(shù),內(nèi)核參數(shù)的設(shè)置方式有臨時(shí)設(shè)置和永久設(shè)置兩種方式,臨時(shí)設(shè)置完就會(huì)刷新,重啟失效。可以先臨時(shí)設(shè)置后查看效果,然后永久設(shè)置。
人生當(dāng)苦無(wú)妨,良人當(dāng)歸即好.——烽火戲諸侯《雪中悍刀行》
查看當(dāng)前用戶的活躍進(jìn)程數(shù)
┌──[[email protected]]-[/]
└─$ ps -eLf | wc -l # 當(dāng)前進(jìn)程數(shù)
221
查看用戶允許運(yùn)行的最大進(jìn)程數(shù)
┌──[[email protected]]-[~]
└─$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15665
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15665
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited # 無(wú)限大
┌──[[email protected]]-[~]
└─$
ulimit為shell內(nèi)建指令,可用來(lái)控制shell執(zhí)行程序的資源。
語(yǔ)法:
ulimit [-aHS][-c <core文件上限>][-d <數(shù)據(jù)節(jié)區(qū)大小>][-f <文件大小>][-m <內(nèi)存大小>][-n <文件數(shù)目>][-p <緩沖區(qū)大小>][-s <堆棧大小>][-t <CPU時(shí)間>][-u <程序數(shù)目>][-v <虛擬內(nèi)存大小>]
參數(shù): |
– |
-a |
顯示目前資源限制的設(shè)定。 |
-c |
<core文件上限> 設(shè)定core文件的最大值,單位為區(qū)塊。 |
-d |
<數(shù)據(jù)節(jié)區(qū)大小> 程序數(shù)據(jù)節(jié)區(qū)的最大值,單位為KB。 |
-f |
<文件大小> shell所能建立的最大文件,單位為區(qū)塊。 |
-H |
設(shè)定資源的硬性限制,也就是管理員所設(shè)下的限制。 |
-m |
<內(nèi)存大小> 指定可使用內(nèi)存的上限,單位為KB。 |
-n |
<文件數(shù)目> 指定同一時(shí)間最多可開(kāi)啟的文件數(shù)。 |
-p |
<緩沖區(qū)大小> 指定管道緩沖區(qū)的大小,單位512字節(jié)。 |
-s |
<堆棧大小> 指定堆棧的上限,單位為KB。 |
-S |
設(shè)定資源的彈性限制。 |
-t |
<CPU時(shí)間> 指定CPU使用時(shí)間的上限,單位為秒。 |
-u |
<進(jìn)程數(shù)目> 用戶最多可開(kāi)啟的進(jìn)程數(shù)目。 |
-v |
<虛擬內(nèi)存大小> 指定可使用的虛擬內(nèi)存上限,單位為KB。 |
┌──[[email protected]]-[~]
└─$ ulimit -u
15665
默認(rèn)值
用戶 |
描述 |
root 賬號(hào) |
ulimit -u的值 默認(rèn)是 |
普通賬號(hào) |
ulimit -u的值 默認(rèn)是 |
修改用戶允許運(yùn)行的最大進(jìn)程數(shù)
臨時(shí)修改
┌──[[email protected]]-[~]
└─$ ulimit -u 75535
┌──[[email protected]]-[~]
└─$ ulimit -u
75535
┌──[[email protected]]-[~]
└─$
永久修改
在/etc/security/limits.conf 文件里添加如下內(nèi)容
* soft nproc 65535
* hard nproc 65535
關(guān)鍵字 |
描述 |
nproc |
是操作系統(tǒng)級(jí)別對(duì)每個(gè)用戶創(chuàng)建的進(jìn)程數(shù)的限制 |
nofile |
是每個(gè)進(jìn)程可以打開(kāi)的文件數(shù)的限制 |
soft xxx |
代表警告的設(shè)定,可以超過(guò)這個(gè)設(shè)定值,但是超過(guò)后會(huì)有警告。 |
hard xxx |
代表嚴(yán)格的設(shè)定,不允許超過(guò)這個(gè)設(shè)定的值。 |
┌──[[email protected]]-[~]
└─$ echo "* soft nproc 65535" >> /etc/security/limits.conf
┌──[[email protected]]-[~]
└─$ echo "* hard nproc 65535" >> /etc/security/limits.conf
┌──[[email protected]]-[~]
└─$ cat /etc/security/limits.conf | grep nproc
# - nproc - max number of processes
#@student hard nproc 20
#@faculty soft nproc 20
#@faculty hard nproc 50
#ftp hard nproc 0
* soft nproc 65535
* hard nproc 65535
┌──[[email protected]]-[~]
└─$
從新通過(guò)ssh的方式登錄,就會(huì)刷新 ulimit -u的值
查看Linux內(nèi)核模塊kernel允許的最大進(jìn)程數(shù)
查看kernel.pid_max的內(nèi)核參數(shù)
┌──[[email protected]]-[~]
└─$ sysctl -a | grep pid_max #查看pid的內(nèi)核參數(shù)
kernel.pid_max = 131072
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.br-0e0cdf9c70b0.stable_secret"
sysctl: reading key "net.ipv6.conf.br-4b3da203747c.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.Docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.ens32.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
┌──[[email protected]]-[/]
└─$ sysctl kernel.pid_max
kernel.pid_max = 131072
根據(jù)變量找到對(duì)應(yīng)的內(nèi)核參數(shù)文件位置
┌──[[email protected]]-[~]
└─$ cd /proc/sys/kernel/;cat pid_max
131072
調(diào)整kernel.pid_max內(nèi)核參數(shù)
臨時(shí)調(diào)整內(nèi)核參數(shù)
┌──[[email protected]]-[/proc/sys/kernel]
└─$ echo 150000 > pid_max
┌──[[email protected]]-[/proc/sys/kernel]
└─$ cat pid_max # 臨時(shí)調(diào)整內(nèi)核參數(shù)
150000
永久調(diào)整kernel.pid_max內(nèi)核參數(shù)
┌──[[email protected]]-[/]
└─$ echo "kernel.pid_max = 150000" >> /etc/sysctl.conf # 永久調(diào)整
┌──[[email protected]]-[/]
└─$ cat /etc/sysctl.conf | grep kernel
kernel.pid_max = 150000
┌──[[email protected]]-[/]
└─$ sysctl -p
net.ipv4.ip_forward = 1
vm.swAppiness = 20
kernel.pid_max = 150000
┌──[[email protected]]-[/]
└─$