写在前面
我遇到了什么问题:
出现问题的原因是什么:
Linux 进程数超过了设置的最大进程数。会对系统进行资源限制,所以分配给 ssh 进程的资源时有时无,一些命令的 bash 进程会被杀调,以保证系统进程不超过设置的最大进程数,无法正常执行。即下面的第一个输出要远远小与第二个和第三个输出。如果有些接近就会出现这种问题
┌──[root@liruilongs.github.io]-[/]
└─$ ps -eLf | wc -l # 当前进程数
221
┌──[root@liruilongs.github.io]-[/]
└─$ ulimit -u # 用户的最大进程数
15665
┌──[root@liruilongs.github.io]-[/]
└─$ sysctl kernel.pid_max # 内核设置的最大进程数
kernel.pid_max = 150000
┌──[root@liruilongs.github.io]-[/]
└─$
复制代码
我是怎样解决的
修改内核参数,调整最大进程数限制。这里修改的话需要 root 权限,同时需要修改两个地方。
其一:
用户登录会加载pam_limit
模块,pam_limit
模块读取配置文件 /etc/security/limits.conf
来限制用户资源的占用。可以使用ulimit
的命令来查看和临时设置资源信息,也可以通过 写入/etc/security/limits.conf
来永久配置,配置文件在每次登录时会加载。可以用来设置ssh
连接数,最大进程数等。
其二:
Linux 系统中内核 kernel 模块,有个全局的设置最大进程数的内核参数,需要修改这个参数,内核参数的设置方式有临时设置和永久设置两种方式,临时设置完就会刷新,重启失效。可以先临时设置后查看效果,然后永久设置。
人生当苦无妨,良人当归即好.——烽火戏诸侯《雪中悍刀行》
查看当前用户的活跃进程数
┌──[root@liruilongs.github.io]-[/]
└─$ ps -eLf | wc -l # 当前进程数
221
复制代码
查看用户允许运行的最大进程数
┌──[root@liruilongs.github.io]-[~]
└─$ 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 # 无限大
┌──[root@liruilongs.github.io]-[~]
└─$
复制代码
ulimit 为 shell 内建指令,可用来控制 shell 执行程序的资源。
语法:
ulimit [-aHS][-c <core文件上限>][-d <数据节区大小>][-f <文件大小>][-m <内存大小>][-n <文件数目>][-p <缓冲区大小>][-s <堆栈大小>][-t <CPU时间>][-u <程序数目>][-v <虚拟内存大小>]
┌──[root@liruilongs.github.io]-[~]
└─$ ulimit -u
15665
复制代码
默认值
修改用户允许运行的最大进程数
临时修改
┌──[root@liruilongs.github.io]-[~]
└─$ ulimit -u 75535
┌──[root@liruilongs.github.io]-[~]
└─$ ulimit -u
75535
┌──[root@liruilongs.github.io]-[~]
└─$
复制代码
永久修改
在/etc/security/limits.conf
文件里添加如下内容
* soft nproc 65535
* hard nproc 65535
复制代码
┌──[root@liruilongs.github.io]-[~]
└─$ echo "* soft nproc 65535" >> /etc/security/limits.conf
┌──[root@liruilongs.github.io]-[~]
└─$ echo "* hard nproc 65535" >> /etc/security/limits.conf
┌──[root@liruilongs.github.io]-[~]
└─$ 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
┌──[root@liruilongs.github.io]-[~]
└─$
复制代码
从新通过 ssh 的方式登录,就会刷新 ulimit -u 的值
查看 Linux 内核模块 kernel 允许的最大进程数
查看kernel.pid_max
的内核参数
┌──[root@liruilongs.github.io]-[~]
└─$ sysctl -a | grep pid_max #查看pid的内核参数
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"
┌──[root@liruilongs.github.io]-[/]
└─$ sysctl kernel.pid_max
kernel.pid_max = 131072
复制代码
根据变量找到对应的内核参数文件位置
┌──[root@liruilongs.github.io]-[~]
└─$ cd /proc/sys/kernel/;cat pid_max
131072
复制代码
调整kernel.pid_max
内核参数
临时调整内核参数
┌──[root@liruilongs.github.io]-[/proc/sys/kernel]
└─$ echo 150000 > pid_max
┌──[root@liruilongs.github.io]-[/proc/sys/kernel]
└─$ cat pid_max # 临时调整内核参数
150000
复制代码
永久调整kernel.pid_max
内核参数
┌──[root@liruilongs.github.io]-[/]
└─$ echo "kernel.pid_max = 150000" >> /etc/sysctl.conf # 永久调整
┌──[root@liruilongs.github.io]-[/]
└─$ cat /etc/sysctl.conf | grep kernel
kernel.pid_max = 150000
┌──[root@liruilongs.github.io]-[/]
└─$ sysctl -p
net.ipv4.ip_forward = 1
vm.swappiness = 20
kernel.pid_max = 150000
┌──[root@liruilongs.github.io]-[/]
└─$
复制代码
评论