Linux之进程数和句柄数

1.背景

由于业务的需要,我们在阿里云上面申请了30多台主机,安装的是centos7.2.1511系统。一般情况下,我们需要对文件句柄数、进程数等做一些标准化的配置。

2.进程和句柄的概念

一个程序可能打开多个进程,一个进程在运行中会打开很多资源,如文件file、通讯连接socket、正在监听的端口等,我们都统称为句柄(handle)。linux任何东西都是文件,所以当一个进程打开的句柄数超过系统限制时,会提示too many open files。

3.进程数限制

资源限制的配置可以在/etc/security/limits.conf或/etc/security/limits.d/ 下的子配置文件中配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文件,后加载配置覆盖之前的配置。 

3.1 用户资源限制

2.1 修改root用户max user process
vim /etc/security/limits.conf
root     soft   nproc     10000
root     hard   nproc     10000

2.2 修改普通用户max user process
方法1:
vim /etc/security/limits.conf
tomcat     soft   nproc     10000
tomcat     hard   nproc     10000
方法2:
vim /etc/security/limits.d/20-nproc.conf
*          soft    nproc     4096
root       soft    nproc     unlimited
tomcat     soft    nproc     10000
tomcat     hard    nproc     10000

说明:
1.soft为warning值,hard为最大值,*代表匹配所有用户。
2.在limits.conf里配置针对所有用户(*)的max user process的不生效,只能在20-nproc.conf里配置。
3.如果单独对某一用户,如tomcat这种,可以在limits.conf配置文件里单独配置,也可以在20-nproc.conf里配置。
4.如果20-nproc.conf和limits.conf同时配置了如tomcat用户的max user process,系统以20-nproc.conf里的配置值为标准。

3.2 service资源限制

对于那些不是通过PAM认证登录的用户,如mysql、nginx等,上述配置是不生效的;因为在CentOS 7/RHEL 7的系统中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf文件的配置作用域缩小了一些,limits.conf这里的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。

需要通过文件/etc/systemd/system.conf和/etc/systemd/user.conf配置, 同样,也会加载两个对应的目录中的所有.conf文件 /etc/systemd/system.conf.d/*.conf 和 /etc/systemd/user.conf.d/*.conf。其中,system.conf是系统实例使用的,user.conf用户实例使用的。一般的sevice,使用system.conf中的配置即可。system.conf.d/*.conf中配置会覆盖system.conf。

示例1:docker容器的进程数限制

vim /etc/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNPROC=16665         #修改容器的进程数限制,只能在docker服务的docker.service文件里修改
TimeoutStartSec=16665    #修改容器的句柄数限制,只能在docker服务的docker.service文件里修改
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

注明:查看某个服务的资源限制 (cat /proc/pid/limits)。

3.3 系统资源限制

每个用户设置了其能打开的最大进程数,但这样并不能控制系统总的进程数(kernel.pid_max),假设kernel.pid_max=1000,用户的max user processes,值无论设置多大,最多能打开的进程数依然为1000。

查看全局的pid_max方法:
方法1:
cat /proc/sys/kernel/pid_max
方法2:
cat /etc/sysctl.conf
kernel.pid_max = 32768

修改全局pid_max方法
临时修改:echo 65535 > /proc/sys/kernel/pid_max
永久修改:echo "kernel.pid_max = 65535" >> /etc/sysctl.conf && sysctl -p

3.4 查看进程数

1.查看系统下所有进程
ps -eFH | wc -l
ps aux | wc -l

2.查看系统当前所有线程
ps -eLf | wc -l

3.查看一个进程下有多少个线程
pstack pid
top -H -p pid
ps hH p pid | wc -l
cat /proc/pid/status | grep Threads

4.查看系统当前允许最大线程数
cat /proc/sys/kernel/threads-max 

4.句柄数限制

4.1 用户句柄数限制

登录用户的限制,可通过/etc/security/limits.conf或 /etc/security/limits.d/下的子配置文件来配置。

修改root用户的句柄数限制
vim /etc/security/limits.conf
#该文件只影响通过PAM登录的用户,不影响系统服务的资源限制
root soft nofile 65535
root hard nofile 65535

修改tomcat用户句柄数限制
方法1:
vim /etc/security/limits.conf
tomcat soft nofile 65535
tomcat hard nofile 65535
方法2:
vim /etc/security/limits.d/20-nproc.conf
tomcat hard nofile 99999
tomcat soft nofile 99999

注明:如果需要单独对某一用户的文件句柄数进行限制,如tomcat,则如上述方法,如果对所有用户的文件句柄数进行限制,则为 * hard nofile 99999和* soft nofile 99999。

4.2 service句柄数限制

示例1:docker容器的进程数限制

vim /etc/systemd/system/docker.service 
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
 
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=16665         #修改容器的进程数限制,只能在docker服务的docker.service文件里修改
TimeoutStartSec=16665    #修改容器的句柄数限制,只能在docker服务的docker.service文件里修改
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
 
[Install]
WantedBy=multi-user.target

4.3 系统句柄数限制

查看系统允许最大句柄数
cat /proc/sys/fs/file-max

查看系统当前使用的总句柄数
cat /proc/sys/fs/file-nr
1408    0       95852    #1408为使用数,95852为总数

临时修改
echo  6553560 > /proc/sys/fs/file-max

永久修改
echo "fs.file-max=655350" >> /etc/sysctl.conf && sysctl -p

5.ulimit命令

[root@docker ~]# 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) 7284
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 99998
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) 10000
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

5.1 命令参数

命令参数
-H   设置硬资源限制,一旦设置不能增加。 
-S   设置软资源限制,设置后可以增加,但是不能超过硬资源设置。   
-a   显示当前所有的 limit 信息。  
-c   最大的 core 文件的大小, 以 blocks 为单位。 
-d   进程最大的数据段的大小,以 Kbytes 为单位。 
-f   进程可以创建文件的最大值,以 blocks 为单位。
-l   最大可加锁内存大小,以 Kbytes 为单位。   
-m   最大内存大小,以 Kbytes 为单位。
-n   Linux操作系统对一个进程可以打开最大文件描述符的数量。 
-p   管道缓冲区的大小,以 Kbytes 为单位。 
-s   线程栈大小,以 Kbytes 为单位。   
-t   最大的 CPU 占用时间,以秒为单位。    
-u   用户最大可用的进程数。   
-v   进程最大可用的虚拟内存,以 Kbytes 为单位。

resource:
core - 限制内核文件的大小
date - 最大数据大小
fsize - 最大文件大小
memlock - 最大锁定内存地址空间
nofile - 打开文件的最大数目
rss - 最大持久设置大小
stack - 最大栈大小
cpu - 以分钟为单位的最多 CPU 时间
noproc - 进程的最大数目
as - 地址空间限制
maxlogins - 此用户允许登录的最大数目

5.2 查看句柄数

查看系统用户所有限制值:ulimit -a
设置用户open files(用户可以打开文件的最大数目):ulimit -n 4096。执行该命令非root用户只能设置到4096。想要设置到8192需要sudo权限或者root用户。
查看当前系统打开的文件数量: lsof | wc -l  
查看当前进程的打开文件数量:lsof -p pid | wc -l      (lsof -p 1234 | wc -l  )
查看当前进程的最大可以打开的文件数:cat /proc/PID/limits  (如果通过ulimit -n 设置或者修改/etc/security/limits.conf,看看进程是否生效)  
查看系统总限制打开文件的最大数量:cat /proc/sys/fs/file-max

注明:lsof只能以root权限执行。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

Logo

更多推荐