linux進程數(shù)和句柄數(shù)使用及說明
注:linux版本CentOS7
一、進程和句柄概念
一個程序可能會打開多個實體,即進程;
一個進程在運行中會打開很多資源,包括文件file、通訊連接socket、正在監(jiān)聽的端口等,我們把這些統(tǒng)稱為句柄(handle),Linux中任何東西都是文件,所以當一個進程打開的句柄數(shù)超過系統(tǒng)限制時,我們會收到告警:too many open files。
二、Linux資源限制
1. 用戶資源限制
在Bash中有個ulimit命令,提供了對Shell及該Shell啟動的進程的可用資源控制。主要包括打開文件描述符數(shù)量、用戶的最大進程數(shù)量、coredump文件的大小等。
資源限制的配置可以在/etc/security/limits.conf或/etc/security/limits.d/ 下的子配置文件中配置,系統(tǒng)是先加載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 一個進程最多可打開句柄數(shù) 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 當前用戶最多可打開的進程(包括線程)數(shù) virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
2.service 資源限制
上面我們一直提到shell,那么對于那些不是通過PAM認證登錄的用戶,如mysql、nginx等,上述配置是不生效的;
因為在CentOS 7/RHEL 7的系統(tǒng)中,使用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 是系統(tǒng)實例使用的,user.conf用戶實例使用的。一般的sevice,使用system.conf中的配置即可。system.conf.d/*.conf中配置會覆蓋system.conf。
配置格式如下:
=左側(cè)為資源類型,右側(cè)為大小
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. 系統(tǒng)資源限制
前面對user和service進行了資源,但系統(tǒng)總的資源數(shù)量是多少呢?這就涉及到了內(nèi)核參數(shù),內(nèi)核參數(shù)眾多,我們只需要知道如何修改常用的,如進程數(shù)、句柄數(shù)即可
三、 進程數(shù)限制
1. 用戶進程數(shù)限制
/etc/security/limits.d/下默認存在一個子配置文件20-nproc.conf,用于設(shè)置每個用戶最大進程數(shù)
查看/etc/security/limits.d/20-nproc.conf會發(fā)現(xiàn),默認root用戶無限制,普通用戶進程數(shù)最大為4096
實際上roott和普通用戶默認是 # cat /proc/sys/kernel/threads-max的值/2,即系統(tǒng)線程數(shù)的一半
[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
設(shè)置每個用戶最大進程數(shù)
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. #針對所有用戶,設(shè)置其可打開最大進程數(shù)為4096(hard),warning值為2048(soft);ulimit看大的是soft大小 * soft nproc 2048 * hard nproc 4096 限制用戶root可打開最大進程數(shù)為65535 root soft nproc 65535 root hard nproc 65535
注意:修改配置文件,不會改變當前已經(jīng)登錄的用戶的進程數(shù)限制
2. service進程數(shù)限制
[root@zandon ~]# vi /etc/systemd/system.conf #修改以下參數(shù) DefaultLimitNPROC=65535 #使配置生效 systemctl daemon-reload #如果某個服務句柄數(shù)已達到原限制,也需要重啟; systemctl restart nginx.service
注意:修改配置文件,不會改變當前已經(jīng)啟動的service的進程數(shù)限制 ,需重啟
3. 系統(tǒng)總進程數(shù)
上面我們給每個用戶設(shè)置了其能打開的最大進程數(shù),但這樣并不能控制系統(tǒng)總的進程數(shù)(kernel.pid_max),假設(shè)kernel.pid_max=1000,用戶的max user processes,值無論設(shè)置多大,最多能打開的進程數(shù)依然為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
然后重啟機器。
四、 句柄數(shù)限制
1. 用戶句柄數(shù)限制
登錄用戶的限制,與上面講的一樣,可通過/etc/security/limits.conf或 /etc/security/limits.d/下的子配置文件來配置,如下:
vi /etc/security/limits.conf # /etc/security/limits.conf #該文件只影響通過PAM登錄的用戶,不影響系統(tǒng)服務的資源限制 #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 #限制單進程可打開最大句柄數(shù)為65535(默認1024) #soft為warning大小,hard為最大數(shù)量 * soft nofile 65535 * hard nofile 65535 # End of file
注意:修改配置文件,不會改變當前已經(jīng)登錄的用戶的句柄數(shù)限制
2. service句柄數(shù)限制
#修改service句柄數(shù)限制 sed -i "s/#DefaultLimitNOFILE=/DefaultLimitNOFILE=655350/g" /etc/systemd/system.conf #使配置生效 sudo systemctl daemon-reload #如果某個服務句柄數(shù)已達到原限制,也需要重啟; sudo systemctl restart nginx.service
注意:修改配置文件,不會改變當前已經(jīng)啟動的service的句柄數(shù)限制
3. 系統(tǒng)總句柄數(shù)
上面設(shè)置了每個用戶可打開的進程數(shù),每個進程可打開的句柄數(shù);還有一個文件設(shè)置了系統(tǒng)所有進程可打開的總句柄數(shù),也就是說,這項參數(shù)是系統(tǒng)級別的。
- 修改系統(tǒng)總句柄數(shù)最大值,方法如下(配置后即生效):
echo 6553560 > /proc/sys/fs/file-max
- 查看系統(tǒng)當前使用的總句柄數(shù):
[root@bogon security]# cat /proc/sys/fs/file-nr 1408 0 95852 //1408為使用數(shù),95852為總數(shù)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux6.7卸載系統(tǒng)自帶的mysql-libs* crontab命令不能用了原因分析
這篇文章主要介紹了Linux6.7卸載系統(tǒng)自帶的mysql-libs* crontab命令不能用了原因分析及解決方法,非常不錯,需要的朋友參考下吧2016-12-12

