linux进程数和句柄数

注:linux版本CentOS7

目录

一、进程和句柄概念

二、Linux资源限制

1. 用户资源限制

2.service 资源限制

3. 系统资源限制

三、 进程数限制

1. 用户进程数限制

2. service进程数限制

3. 系统总进程数

四、 句柄数限制

1. 用户句柄数限制

2. service句柄数限制

3. 系统总句柄数


一、进程和句柄概念

一个程序可能会打开多个实体,即进程;

一个进程在运行中会打开很多资源,包括文件file、通讯连接socket、正在监听的端口等,我们把这些统称为句柄(handle),Linux中任何东西都是文件,所以当一个进程打开的句柄数超过系统限制时,,我们会收到告警:too many open files。

 

二、Linux资源限制

1. 用户资源限制

在Bash中有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制。主要包括打开文件描述符数量、用户的最大进程数量、coredump文件的大小等。

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

soft为warning值,hard为最大值,*代表匹配所有用户

*     soft   nofile    65535
*     hard   nofile    65535
*     soft   nproc     10000
*     hard   nproc     10000
*     soft   core      20000
*     hard   core      20000

查看登录当前shell的用户资源限制

 

[root@localdomain ~]# 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) 7424
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) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024  当前用户最多可打开的进程(包括线程)数
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

2.service 资源限制

上面我们一直提到shell,那么对于那些不是通过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。

配置格式如下:

=左侧为资源类型,右侧为大小

 

vi /etc/systemd/system.conf 
......................
[Manager]
#LogLevel=info
#LogTarget=journal-or-kmsg
#LogColor=yes
#LogLocation=no
#DumpCore=yes
#CrashShell=no
#ShowStatus=yes
#CrashChVT=1
#CtrlAltDelBurstAction=reboot-force
#CPUAffinity=1 2
......................

查看某个service的资源限制

cat /proc/YOUR-PID/limits

如查看nginx service的配置效果:

 

$ cat /proc/$(cat /run/nginx.pid)/limits
  Limit                     Soft Limit           Hard Limit           Units
  Max cpu time              unlimited            unlimited            seconds
  Max file size             unlimited            unlimited            bytes
  Max data size             unlimited            unlimited            bytes
  Max stack size            8388608              unlimited            bytes
  Max core file size        unlimited            unlimited            bytes
  Max resident set          unlimited            unlimited            bytes
  Max processes             100000               100000               processes
 Max open files            100000               100000               files
 Max locked memory         65536                65536                bytes
 Max address space         unlimited            unlimited            bytes
 Max file locks            unlimited            unlimited            locks
 Max pending signals       1030606              1030606              signals
 Max msgqueue size         819200               819200               bytes
 Max nice priority         0                    0
 Max realtime priority     0                    0
 Max realtime timeout      unlimited            unlimited            us

3. 系统资源限制

前面对user和service进行了资源,但系统总的资源数量是多少呢?这就涉及到了内核参数,内核参数众多,我们只需要知道如何修改常用的,如进程数、句柄数即可

 

 

 

三、 进程数限制

1. 用户进程数限制

/etc/security/limits.d/下默认存在一个子配置文件20-nproc.conf,用于设置每个用户最大进程数

查看/etc/security/limits.d/20-nproc.conf会发现,默认root用户无限制,普通用户进程数最大为4096

实际上roott和普通用户默认是 # cat /proc/sys/kernel/threads-max的值/2,即系统线程数的一半

 

[root@localhost ~]# cat /etc/security/limits.d/20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

设置每个用户最大进程数

 

vim  /etc/security/limits.d/20-nproc.conf 
$ cat /etc/security/limits.d/90-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.
#针对所有用户,设置其可打开最大进程数为4096(hard),warning值为2048(soft);ulimit看大的是soft大小
* soft nproc 2048
* hard nproc 4096
限制用户root可打开最大进程数为65535
root soft nproc 65535
root hard nproc 65535

注意:修改配置文件,不会改变当前已经登录的用户的进程数限制

 

2. service进程数限制

[root@zandon ~]# vi /etc/systemd/system.conf 
#修改以下参数
DefaultLimitNPROC=65535
#使配置生效
systemctl daemon-reload
#如果某个服务句柄数已达到原限制,也需要重启;
systemctl restart nginx.service

注意:修改配置文件,不会改变当前已经启动的service的进程数限制 ,需重启

 

3. 系统总进程数

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

查看全局的pid_max方法:

方法一:

 

cat /proc/sys/kernel/pid_max

方法二:

 

# sysctl kernel.pid_max
kernel.pid_max = 32768

临时修改这个值方法:

 

echo 65535 > /proc/sys/kernel/pid_max

所以以上都操作完成后,才算是正确修改了max user processes 的值

上面只是临时生效,重启机器后会失效,永久生效方法:

在/etc/sysctl.conf中添加kernel.pid_max = 65535

 

# vim /etc/sysctl.conf
kernel.pid_max = 65535

或者:

 

echo "kernel.pid_max = 65535" >> /etc/sysctl.conf

然后重启机器。

 

四、 句柄数限制

1. 用户句柄数限制

登录用户的限制,与上面讲的一样,可通过/etc/security/limits.conf或 /etc/security/limits.d/下的子配置文件来配置,如下:

 

vi /etc/security/limits.conf
# /etc/security/limits.conf
#该文件只影响通过PAM登录的用户,不影响系统服务的资源限制
#This file sets the resource limits for the users logged in via PAM.
#It does not affect resource limits of the system services.
........................................................
#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

#限制单进程可打开最大句柄数为65535(默认1024)
#soft为warning大小,hard为最大数量
* soft nofile 65535 
* hard nofile 65535

# End of file

注意:修改配置文件,不会改变当前已经登录的用户的句柄数限制

 

2. service句柄数限制

 

#修改service句柄数限制
sed -i "s/#DefaultLimitNOFILE=/DefaultLimitNOFILE=655350/g"  /etc/systemd/system.conf
#使配置生效
sudo systemctl daemon-reload
#如果某个服务句柄数已达到原限制,也需要重启;
sudo systemctl restart nginx.service

注意:修改配置文件,不会改变当前已经启动的service的句柄数限制

3. 系统总句柄数

上面设置了每个用户可打开的进程数,每个进程可打开的句柄数;还有一个文件设置了系统所有进程可打开的总句柄数,也就是说,这项参数是系统级别的。

修改系统总句柄数最大值,方法如下(配置后即生效):

 

echo  6553560 > /proc/sys/fs/file-max

 

查看系统当前使用的总句柄数:

[root@bogon security]# cat /proc/sys/fs/file-nr
1408    0       95852    //1408为使用数,95852为总数

 

posted @ 2019-02-18 15:23  ZanDon  阅读(1392)  评论(0编辑  收藏  举报