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设置的值 

猜你喜欢

转载自blog.csdn.net/yujia_666/article/details/107113319
今日推荐