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爲總數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章