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
2
3
4
5
6
*     soft   nofile    100000
* hard nofile 100000
* soft nproc 100000
* hard nproc 100000
* soft core 100000
* hard core 100000

不过,在CentOS7/RedHat7的系统中,使用Systemd替代了之前的SysV,因此/etc/security/limits.conf文件的配置作用域缩小了。limits.conf里的配置,只适用于通过PAM认证登录用户的资源限制,对SystemdService的资源限制不生效。登录用户的限制配置方法与上面讲的一样,通过/etc/security/limits.conflimits.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
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文件,在[Service]模块下添加如下内容:

1
2
3
LimitCORE=infinity
LimitNOFILE=100000
LimitNPROC=100000

然后执行以下命令使配置生效。

1
2
systemctl daemon-reload
systemctl restart nginx.service

如何查看某个进程的Limit配置呢?

如果要查看某个进程的Limit配置,命令如下:

1
cat /proc/YOUR-PID/limits

以下为一个Nginx服务的Limit配置:

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目录中的配置所覆盖。