linux進(jìn)程數(shù)和句柄數(shù)使用及說明
注:linux版本CentOS7
一、進(jìn)程和句柄概念
一個(gè)程序可能會(huì)打開多個(gè)實(shí)體,即進(jìn)程;
一個(gè)進(jìn)程在運(yùn)行中會(huì)打開很多資源,包括文件file、通訊連接socket、正在監(jiān)聽的端口等,我們把這些統(tǒng)稱為句柄(handle),Linux中任何東西都是文件,所以當(dāng)一個(gè)進(jìn)程打開的句柄數(shù)超過系統(tǒng)限制時(shí),我們會(huì)收到告警:too many open files。
二、Linux資源限制
1. 用戶資源限制
在Bash中有個(gè)ulimit命令,提供了對(duì)Shell及該Shell啟動(dòng)的進(jìn)程的可用資源控制。主要包括打開文件描述符數(shù)量、用戶的最大進(jìn)程數(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
查看登錄當(dāng)前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 一個(gè)進(jìn)程最多可打開句柄數(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 當(dāng)前用戶最多可打開的進(jìn)程(包括線程)數(shù) virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
2.service 資源限制
上面我們一直提到shell,那么對(duì)于那些不是通過PAM認(rèn)證登錄的用戶,如mysql、nginx等,上述配置是不生效的;
因?yàn)樵贑entOS 7/RHEL 7的系統(tǒng)中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf 文件的配置作用域縮小了一些,limits.conf這里的配置,只適用于通過PAM認(rèn)證登錄用戶的資源限制,它對(duì)systemd的service的資源限制不生效。
需要通過文件 /etc/systemd/system.conf 和 /etc/systemd/user.conf配置, 同樣,也會(huì)加載兩個(gè)對(duì)應(yīng)的目錄中的所有.conf文件 /etc/systemd/system.conf.d/*.conf 和 /etc/systemd/user.conf.d/*.conf。
其中,system.conf 是系統(tǒng)實(shí)例使用的,user.conf用戶實(shí)例使用的。一般的sevice,使用system.conf中的配置即可。system.conf.d/*.conf中配置會(huì)覆蓋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 ......................
查看某個(gè)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)資源限制
前面對(duì)user和service進(jìn)行了資源,但系統(tǒng)總的資源數(shù)量是多少呢?這就涉及到了內(nèi)核參數(shù),內(nèi)核參數(shù)眾多,我們只需要知道如何修改常用的,如進(jìn)程數(shù)、句柄數(shù)即可
三、 進(jìn)程數(shù)限制
1. 用戶進(jìn)程數(shù)限制
/etc/security/limits.d/下默認(rèn)存在一個(gè)子配置文件20-nproc.conf,用于設(shè)置每個(gè)用戶最大進(jìn)程數(shù)
查看/etc/security/limits.d/20-nproc.conf會(huì)發(fā)現(xiàn),默認(rèn)root用戶無限制,普通用戶進(jìn)程數(shù)最大為4096
實(shí)際上roott和普通用戶默認(rèn)是 # 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è)置每個(gè)用戶最大進(jìn)程數(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. #針對(duì)所有用戶,設(shè)置其可打開最大進(jìn)程數(shù)為4096(hard),warning值為2048(soft);ulimit看大的是soft大小 * soft nproc 2048 * hard nproc 4096 限制用戶root可打開最大進(jìn)程數(shù)為65535 root soft nproc 65535 root hard nproc 65535
注意:修改配置文件,不會(huì)改變當(dāng)前已經(jīng)登錄的用戶的進(jìn)程數(shù)限制
2. service進(jìn)程數(shù)限制
[root@zandon ~]# vi /etc/systemd/system.conf #修改以下參數(shù) DefaultLimitNPROC=65535 #使配置生效 systemctl daemon-reload #如果某個(gè)服務(wù)句柄數(shù)已達(dá)到原限制,也需要重啟; systemctl restart nginx.service
注意:修改配置文件,不會(huì)改變當(dāng)前已經(jīng)啟動(dòng)的service的進(jìn)程數(shù)限制 ,需重啟
3. 系統(tǒng)總進(jìn)程數(shù)
上面我們給每個(gè)用戶設(shè)置了其能打開的最大進(jìn)程數(shù),但這樣并不能控制系統(tǒng)總的進(jìn)程數(shù)(kernel.pid_max),假設(shè)kernel.pid_max=1000,用戶的max user processes,值無論設(shè)置多大,最多能打開的進(jìn)程數(shù)依然為1000
查看全局的pid_max方法:
- 方法一:
cat /proc/sys/kernel/pid_max
- 方法二:
# sysctl kernel.pid_max kernel.pid_max = 32768
臨時(shí)修改這個(gè)值方法:
echo 65535 > /proc/sys/kernel/pid_max
所以以上都操作完成后,才算是正確修改了max user processes 的值
上面只是臨時(shí)生效,重啟機(jī)器后會(huì)失效,永久生效方法:
在/etc/sysctl.conf中添加kernel.pid_max = 65535
# vim /etc/sysctl.conf kernel.pid_max = 65535
或者:
echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
然后重啟機(jī)器。
四、 句柄數(shù)限制
1. 用戶句柄數(shù)限制
登錄用戶的限制,與上面講的一樣,可通過/etc/security/limits.conf或 /etc/security/limits.d/下的子配置文件來配置,如下:
vi /etc/security/limits.conf # /etc/security/limits.conf #該文件只影響通過PAM登錄的用戶,不影響系統(tǒng)服務(wù)的資源限制 #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 #限制單進(jìn)程可打開最大句柄數(shù)為65535(默認(rèn)1024) #soft為warning大小,hard為最大數(shù)量 * soft nofile 65535 * hard nofile 65535 # End of file
注意:修改配置文件,不會(huì)改變當(dāng)前已經(jīng)登錄的用戶的句柄數(shù)限制
2. service句柄數(shù)限制
#修改service句柄數(shù)限制 sed -i "s/#DefaultLimitNOFILE=/DefaultLimitNOFILE=655350/g" /etc/systemd/system.conf #使配置生效 sudo systemctl daemon-reload #如果某個(gè)服務(wù)句柄數(shù)已達(dá)到原限制,也需要重啟; sudo systemctl restart nginx.service
注意:修改配置文件,不會(huì)改變當(dāng)前已經(jīng)啟動(dòng)的service的句柄數(shù)限制
3. 系統(tǒng)總句柄數(shù)
上面設(shè)置了每個(gè)用戶可打開的進(jìn)程數(shù),每個(gè)進(jìn)程可打開的句柄數(shù);還有一個(gè)文件設(shè)置了系統(tǒng)所有進(jìn)程可打開的總句柄數(shù),也就是說,這項(xiàng)參數(shù)是系統(tǒng)級(jí)別的。
- 修改系統(tǒng)總句柄數(shù)最大值,方法如下(配置后即生效):
echo 6553560 > /proc/sys/fs/file-max
- 查看系統(tǒng)當(dāng)前使用的總句柄數(shù):
[root@bogon security]# cat /proc/sys/fs/file-nr 1408 0 95852 //1408為使用數(shù),95852為總數(shù)
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux下tar解壓錯(cuò)誤:文件損壞與不完整問題的解決方案
在日常的 Linux 系統(tǒng)管理中,我們經(jīng)常需要使用 tar 命令來壓縮和解壓文件,然而,有時(shí)在解壓過程中會(huì)遇到諸如“文件損壞”或“意外結(jié)束”等錯(cuò)誤提示,本文將詳細(xì)分析這些問題的原因,并提供一套完整的解決方案,需要的朋友可以參考下2025-02-02
Linux切換root用戶的幾種實(shí)現(xiàn)方式
在Linux系統(tǒng)中,root用戶為超級(jí)用戶,擁有最高權(quán)限,切換到root用戶的常用方法包括使用su、sudo、sudo-i和sudosu命令,每種方法適用于不同場景,需根據(jù)實(shí)際需求選擇,使用root權(quán)限需謹(jǐn)慎,以免對(duì)系統(tǒng)造成損壞2024-11-11
Linux中VirtualBox的虛擬機(jī)開機(jī)自啟方式
本文介紹如何通過創(chuàng)建start.sh腳本并設(shè)置開機(jī)自啟路徑,實(shí)現(xiàn)VirtualBox虛擬機(jī)的開機(jī)自動(dòng)運(yùn)行,包含檢查運(yùn)行狀態(tài)、腳本編輯及權(quán)限配置步驟2025-09-09
Tomeat6.0 連接池?cái)?shù)據(jù)庫配置
關(guān)于tomeat6.0的連接數(shù)據(jù)庫配置實(shí)現(xiàn)代碼2009-03-03
Linux6.7卸載系統(tǒng)自帶的mysql-libs* crontab命令不能用了原因分析
這篇文章主要介紹了Linux6.7卸載系統(tǒng)自帶的mysql-libs* crontab命令不能用了原因分析及解決方法,非常不錯(cuò),需要的朋友參考下吧2016-12-12

