Linux之进程数和句柄数
Linux之進(jìn)程數(shù)和句柄數(shù)
1.背景
由于業(yè)務(wù)的需要,我們在阿里云上面申請了30多臺主機(jī),安裝的是centos7.2.1511系統(tǒng)。一般情況下,我們需要對文件句柄數(shù)、進(jìn)程數(shù)等做一些標(biāo)準(zhǔn)化的配置。2.進(jìn)程和句柄的概念
一個程序可能打開多個進(jìn)程,一個進(jìn)程在運(yùn)行中會打開很多資源,如文件file、通訊連接socket、正在監(jiān)聽的端口等,我們都統(tǒng)稱為句柄(handle)。linux任何東西都是文件,所以當(dāng)一個進(jìn)程打開的句柄數(shù)超過系統(tǒng)限制時(shí),會提示too many open files。3.進(jìn)程數(shù)限制
資源限制的配置可以在/etc/security/limits.conf或/etc/security/limits.d/ 下的子配置文件中配置,系統(tǒng)是先加載limits.conf然后按照英文字母順序加載limits.d目錄下的配置文件,后加載配置覆蓋之前的配置。3.1 用戶資源限制
2.1 修改root用戶max user process vim /etc/security/limits.conf root soft nproc 10000 root hard nproc 100002.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.如果單獨(dú)對某一用戶,如tomcat這種,可以在limits.conf配置文件里單獨(dú)配置,也可以在20-nproc.conf里配置。 4.如果20-nproc.conf和limits.conf同時(shí)配置了如tomcat用戶的max user process,系統(tǒng)以20-nproc.conf里的配置值為標(biāo)準(zhǔn)。3.2 service資源限制
對于那些不是通過PAM認(rèn)證登錄的用戶,如mysql、nginx等,上述配置是不生效的;因?yàn)樵贑entOS 7/RHEL 7的系統(tǒng)中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf文件的配置作用域縮小了一些,limits.conf這里的配置,只適用于通過PAM認(rèn)證登錄用戶的資源限制,它對systemd的service的資源限制不生效。需要通過文件/etc/systemd/system.conf和/etc/systemd/user.conf配置, 同樣,也會加載兩個對應(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中配置會覆蓋system.conf。示例1:docker容器的進(jìn)程數(shù)限制
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 #修改容器的進(jìn)程數(shù)限制,只能在docker服務(wù)的docker.service文件里修改 TimeoutStartSec=16665 #修改容器的句柄數(shù)限制,只能在docker服務(wù)的docker.service文件里修改 TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s[Install] WantedBy=multi-user.target注明:查看某個服務(wù)的資源限制 (cat /proc/pid/limits)。
3.3 系統(tǒng)資源限制
每個用戶設(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方法: 方法1: cat /proc/sys/kernel/pid_max 方法2: cat /etc/sysctl.conf kernel.pid_max = 32768修改全局pid_max方法 臨時(shí)修改:echo 65535 > /proc/sys/kernel/pid_max 永久修改:echo "kernel.pid_max = 65535" >> /etc/sysctl.conf && sysctl -p3.4 查看進(jìn)程數(shù)
1.查看系統(tǒng)下所有進(jìn)程 ps -eFH | wc -l ps aux | wc -l2.查看系統(tǒng)當(dāng)前所有線程 ps -eLf | wc -l3.查看一個進(jìn)程下有多少個線程 pstack pid top -H -p pid ps hH p pid | wc -l cat /proc/pid/status | grep Threads4.查看系統(tǒng)當(dāng)前允許最大線程數(shù) cat /proc/sys/kernel/threads-max4.句柄數(shù)限制
4.1 用戶句柄數(shù)限制
登錄用戶的限制,可通過/etc/security/limits.conf或 /etc/security/limits.d/下的子配置文件來配置。
修改root用戶的句柄數(shù)限制 vim /etc/security/limits.conf #該文件只影響通過PAM登錄的用戶,不影響系統(tǒng)服務(wù)的資源限制 root soft nofile 65535 root hard nofile 65535修改tomcat用戶句柄數(shù)限制 方法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注明:如果需要單獨(dú)對某一用戶的文件句柄數(shù)進(jìn)行限制,如tomcat,則如上述方法,如果對所有用戶的文件句柄數(shù)進(jìn)行限制,則為 * hard nofile 99999和* soft nofile 99999。4.2 service句柄數(shù)限制
示例1:docker容器的進(jìn)程數(shù)限制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 #修改容器的進(jìn)程數(shù)限制,只能在docker服務(wù)的docker.service文件里修改 TimeoutStartSec=16665 #修改容器的句柄數(shù)限制,只能在docker服務(wù)的docker.service文件里修改 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s[Install] WantedBy=multi-user.target4.3 系統(tǒng)句柄數(shù)限制
查看系統(tǒng)允許最大句柄數(shù) cat /proc/sys/fs/file-max查看系統(tǒng)當(dāng)前使用的總句柄數(shù) cat /proc/sys/fs/file-nr 1408 0 95852 #1408為使用數(shù),95852為總數(shù)臨時(shí)修改 echo 6553560 > /proc/sys/fs/file-max永久修改 echo "fs.file-max=655350" >> /etc/sysctl.conf && sysctl -p5.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) unlimited5.1 命令參數(shù)
命令參數(shù) -H 設(shè)置硬資源限制,一旦設(shè)置不能增加。 -S 設(shè)置軟資源限制,設(shè)置后可以增加,但是不能超過硬資源設(shè)置。 -a 顯示當(dāng)前所有的 limit 信息。 -c 最大的 core 文件的大小, 以 blocks 為單位。 -d 進(jìn)程最大的數(shù)據(jù)段的大小,以 Kbytes 為單位。 -f 進(jìn)程可以創(chuàng)建文件的最大值,以 blocks 為單位。 -l 最大可加鎖內(nèi)存大小,以 Kbytes 為單位。 -m 最大內(nèi)存大小,以 Kbytes 為單位。 -n Linux操作系統(tǒng)對一個進(jìn)程可以打開最大文件描述符的數(shù)量。 -p 管道緩沖區(qū)的大小,以 Kbytes 為單位。 -s 線程棧大小,以 Kbytes 為單位。 -t 最大的 CPU 占用時(shí)間,以秒為單位。 -u 用戶最大可用的進(jìn)程數(shù)。 -v 進(jìn)程最大可用的虛擬內(nèi)存,以 Kbytes 為單位。resource: core - 限制內(nèi)核文件的大小 date - 最大數(shù)據(jù)大小 fsize - 最大文件大小 memlock - 最大鎖定內(nèi)存地址空間 nofile - 打開文件的最大數(shù)目 rss - 最大持久設(shè)置大小 stack - 最大棧大小 cpu - 以分鐘為單位的最多 CPU 時(shí)間 noproc - 進(jìn)程的最大數(shù)目 as - 地址空間限制 maxlogins - 此用戶允許登錄的最大數(shù)目5.2 查看句柄數(shù)
查看系統(tǒng)用戶所有限制值:ulimit -a 設(shè)置用戶open files(用戶可以打開文件的最大數(shù)目):ulimit -n 4096。執(zhí)行該命令非root用戶只能設(shè)置到4096。想要設(shè)置到8192需要sudo權(quán)限或者root用戶。 查看當(dāng)前系統(tǒng)打開的文件數(shù)量: lsof | wc -l ? 查看當(dāng)前進(jìn)程的打開文件數(shù)量:lsof -p pid | wc -l? ? ? (lsof -p 1234 | wc -l? ) 查看當(dāng)前進(jìn)程的最大可以打開的文件數(shù):cat /proc/PID/limits? (如果通過ulimit -n 設(shè)置或者修改/etc/security/limits.conf,看看進(jìn)程是否生效)?? 查看系統(tǒng)總限制打開文件的最大數(shù)量:cat /proc/sys/fs/file-max注明:lsof只能以root權(quán)限執(zhí)行。在終端下輸入lsof即可顯示系統(tǒng)打開的文件,因?yàn)?lsof 需要訪問核心內(nèi)存和各種文件,所以必須以 root 用戶的身份運(yùn)行它才能夠充分地發(fā)揮其功能。
總結(jié)
以上是生活随笔為你收集整理的Linux之进程数和句柄数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018互联网女皇报告发布:中国正成为全
- 下一篇: linux中apache无法启动,Apa