一、概述
在從 CentOS 6 遷移到 CentOS 7 的過程中,可能有一些地方需要調整,最顯著的地方莫過於 systemd 帶來的改變,不同的管理服務的方式,不同的日志方式,設置時區,時間等等。 當然,除了這些顯而易見的改變之外,有些變化並不是那么引人注目,例如這里要介紹的你可能發現曾經配置了正確的 /etc/security/limits.conf 在 CentOS 7 中卻沒有生效了。
如果遇到上面的問題,很可能已經導致了你的應用異常了,例如:以前配置了服務的 nproc
為一個非常大的數值, 結果現在發現服務不能打開更多的文件。
驚訝之余,查看服務的 /proc/<pid>/limits
卻發現:
1 Max open files 1024 1024 files
那么,為什么服務使用 systemd 啟動就沒有生效呢?
根據 redhat bugzilla 754285, systemd 實際上是會忽略 /etc/security/limits.conf
,下面是 systemd 2 號人物的回答:
而這個 bug 也標記為已解決,在 pam 包中解決,這個包包含了 /etc/security/limits.conf
, 在這個文件中加入了如下注釋:
# /etc/security/limits.conf # #This file sets the resource limits for the users logged in via PAM. #It does not affect resource limits of the system services. #
注意,這里的 system services 指的是 system wide service,對於 CentOS 7 來說也就是系統的 service。
systemd 還可以對普通用戶啟動,使用 --user
參數。
二、解決之道
在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 DefaultLimitCORE=infinity 2 DefaultLimitNOFILE=100000 3 DefaultLimitNPROC=100000
然后運行如下命令,才能生效。
1 sudo systemctl daemon-reload 2 sudo systemctl restart nginx.service
查看一個進程的limit設置:cat /proc/YOUR-PID/limits
例如我的一個nginx service的配置效果:
1 $cat /proc/$(cat /var/run/nginx.pid)/limits 2 Limit Soft Limit Hard Limit Units 3 Max cpu time unlimited unlimited seconds 4 Max file size unlimited unlimited bytes 5 Max data size unlimited unlimited bytes 6 Max stack size 8388608 unlimited bytes 7 Max core file size unlimited unlimited bytes 8 Max resident set unlimited unlimited bytes 9 Max processes 100000 100000 processes 10 Max open files 100000 100000 files 11 Max locked memory 65536 65536 bytes 12 Max address space unlimited unlimited bytes 13 Max file locks unlimited unlimited locks 14 Max pending signals 1030606 1030606 signals 15 Max msgqueue size 819200 819200 bytes 16 Max nice priority 0 0 17 Max realtime priority 0 0 18 Max realtime timeout unlimited unlimited us
順便提一下,我還被CentOS7自帶的/etc/security/limits.d/20-nproc.conf文件坑過,里面默認設置了非root用戶的最大進程數為4096,難怪我上次在limits.conf中設置了沒啥效果,原來被limit.d目錄中的配置覆蓋了。