CentOS/RedHat7系统中设置Systemd Service的Ulimit资源限制
在CentOS/RHEL中,有个ulimit命令,提供了对Shell及该Shell启动的进程的可用资源控制。主要包括打开文件描述符数量、用户的最大进程数量、coredump文件的大小等。
在CentOS/RedHat的5和6版本中,资源限制的配置可以在/etc/security/limits.conf设置,针对root/user等各个用户或者*代表所有用户来设置。 当然,/etc/security/limits.d/中也可以配置,系统是先加载limits.conf然后按照英文字母顺序读取limits.d目录下的配置文件,加载配置覆盖之前的配置。 以下是一个配置示例:
1 | * soft nofile 100000 |
不过,在CentOS7/RedHat7的系统中,使用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。同时,也会加载/etc/systemd/system.conf.d/*.conf和/etc/systemd/user.conf.d/*.conf目录中的所有.conf文件
其中,system.conf是系统实例使用的,user.conf用户实例使用的。一般的Service,使用system.conf中的配置即可,在[Service]模块下添加如下内容。systemd.conf.d/*.conf中的配置会覆盖system.conf。
1 | DefaultLimitCORE=infinity |
说明
修改system.conf文件配置后,需要重启系统才会生效。
也可以针对单个Service进行设置,以nginx为例。
编辑/usr/lib/systemd/system/nginx.service文件,或者/usr/lib/systemd/system/nginx.service.d/my-limit.conf文件,在[Service]模块下添加如下内容:
1 | LimitCORE=infinity |
然后执行以下命令使配置生效。
1 | systemctl daemon-reload |
如何查看某个进程的Limit配置呢?
如果要查看某个进程的Limit配置,命令如下:
1 | cat /proc/YOUR-PID/limits |
以下为一个Nginx服务的Limit配置:
1 | # cat /proc/$(cat /var/run/nginx.pid)/limits |
说明
CentOS7自带的/etc/security/limits.d/20-nproc.conf文件里面默认设置了非root用户的最大进程数为4096,因此如果只在limits.conf中做配置并没有效果,会被limit.d目录中的配置所覆盖。