CENTOS/RHEL 7 系統中設置SYSTEMD SERVICE的ULIMIT資源限制

在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設置的值 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章