在bash中,有個ulimit命令,提供了對shell及該shell啓動的進程的可用資源控制。主要包括打開文件描述符數量、用戶的最大進程數量、coredump文件的大小等。
在centos 5/6 等版本中,資源限制的配置可以在 /etc/security/limits.conf 設置,針對root/user等各個用戶或者*代表所有用戶來設置。 當然,/etc/security/limits.d/ 中可以配置,系統是先加載limits.conf然後按照英文字母順序加載limits.d目錄下的配置文件,後加載配置覆蓋之前的配置。 一個配置示例如下:、
不過,在CentOS 7 / RHEL 7的系統中,使用Systemd替代了之前的SysV,因此 /etc/security/limits.conf 文件的配置作用域縮小了一些。limits.conf這裏的配置,只適用於通過PAM認證登錄用戶的資源限制,它對systemd的service的資源限制不生效。登錄用戶的限制,與上面講的一樣,通過 /etc/security/limits.conf 和 limits.d 來配置即可。
對於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中的配置即可。systemd.conf.d/*.conf中配置會覆蓋system.conf。
1 2 3 |
DefaultLimitCORE=infinity DefaultLimitNOFILE=100000 DefaultLimitNPROC=100000 |
注意:修改了system.conf後,需要重啓系統纔會生效。
針對單個Service,也可以設置,以nginx爲例。
編輯 /usr/lib/systemd/system/nginx.service 文件,或者 /usr/lib/systemd/system/nginx.service.d/my-limit.conf 文件,做如下配置:
1 2 3 4 |
[Service] LimitCORE=infinity LimitNOFILE=100000 LimitNPROC=100000 |
然後運行如下命令,才能生效。
1 2 |
sudo systemctl daemon-reload sudo systemctl restart nginx.service |
查看一個進程的limit設置:cat /proc/YOUR-PID/limits
例如我的一個nginx service的配置效果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$cat /proc/$(cat /var/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 |
順便提一下,我還被CentOS7自帶的/etc/security/limits.d/20-nproc.conf文件坑過,裏面默認設置了非root用戶的最大進程數爲4096,難怪我上次在limits.conf中設置了沒啥效果,原來被limit.d目錄中的配置覆蓋了。
問題簡述:Centos7下修改系統的最大文件打開數的時候,對系統啓動的進程不生效
問題詳述:Centos7下需修改系統最大文件打開數爲100000,進程數爲50000,於是做了如下操作
說 明:此問題只出現在centos7下,centos6版本不存在此問題
1:記錄未修改之前的ulimit值
2:修改配置文件
vim /etc/security/limits.conf 在後面添加
* soft nofile 100000 * hard nofile 100000 * soft nproc 65535 * hard nproc 65535
重啓機器,修改 /etc/security/limits.conf 裏的配置後,需重啓機器才能生效
3:查看修改後的ulimit值
4:在這裏看起來一切都很正常,也許一不小心就入坑了。爲了對比現象,需要安裝兩個nginx,一個源碼安裝,一個yum安裝
源碼安裝:(簡單安裝,只是爲了驗證和測試,不指定安裝路徑,默認是在/usr/local/nginx下)
wget http://nginx.org/download/nginx-1.8.1.tar.gz tar -zxvf nginx-1.8.1.tar.gz cd nginx-1.8.1 ./configure make && make install
yum安裝
yum -y install nginx
5:現象
1)先啓動源碼編譯的nginx,並查看進程號及limit值,如下
啓動nginx: /usr/local/nginx/sbin/nginx
查看進程: ps -ef |grep nginx
查看某個進程的limit值: cat /proc/進程號/limits
2)yum安裝nginx啓動
啓動方法:systemctl start nginx.service ,然後查看進程號及其limit值,如下:
到這裏問題就來了,爲什麼通過systemctl啓動的nginx對limit的設置不生效 ?????
然後查看了1號進程的limit值( cat /proc/1/limits ),發現也是對修改/etc/security/limits.conf文件裏的最大文件打開數和最大進程數沒有生效
6:原因
仔細查看/etc/security/limits.conf文件的註釋,說明了對系統服務不生效
7:解決辦法
在Centos7系統中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域縮小了。/etc/security/limits.conf的配置,只適用於通過PAM認證登錄用戶的資源限制,它對systemd的service的資源限制不生效。因此登錄用戶的限制,通過/etc/security/limits.conf與/etc/security/limits.d下的文件設置即可。
對於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是用戶實例使用的。
vim /etc/systemd/system.conf
DefaultLimitNOFILE=100000 DefaultLimitNPROC=65535
重啓後,systemctl start nginx啓動,然後根號進程號查看資源限制,得到
8:用到的相關命令
1)查看當前進程的最大可以打開的文件數
cat /proc/進程ID/limits
2)查看當前進程實時打開的文件數
lsof -p PID |wc -l
3)查看系統總限制打開文件的最大數量
cat /proc/sys/fs/file-max
注:若設置不生效,查看包含的目錄下的配置文件是否覆蓋,如/etc/security/limits.d/下的文件是否覆蓋了/etc/security/limits.conf設置的值