CentOS 7 systemd的坑


一、概述

 在從 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目錄中的配置覆蓋了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM