在bash中,有个ulimit命令,提供了对shell及该shell启动的进程的可用资源控制。主要包括打开文档描述符数量、用户的最大进程数量、coredump文档的大小等。
在centos 5/6 等版本中,资源限制的配置可以在 /etc/security/limits.conf 设置,针对root/user等各个用户或者*代表所有用户来设置。
当然,/etc/security/limits.d/ 中也可以配置,系统是先加载limits.conf然后按照英文字母顺序加载limits.d目录下的配置文档,
后加载配置覆盖之前的配置。
在centos7中/etc/security/limits.d/20-nproc.conf配置文件中默认设置了非root用户的最大进程数为4096,会覆盖/etc/security/limits.conf文件中的配置。
一个配置示例如下:
* soft core 100000
* hard core 100000
* soft nofile 100000
* hard nofile 100000
* soft nproc 100000
* hard nproc 100000
格式如下:
username|@groupname type resource limit
username|@groupname:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。
type:有 soft,hard 和 -,soft 指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft 的限制不能比har 限制高。用 - 就表明同时设置了 soft 和 hard 的值
resource:
core - 限制内核文件的大小
date - 最大数据大小
fsize - 最大文件大小
memlock - 最大锁定内存地址空间
nofile - 打开文件的最大数目
rss - 最大持久设置大小
stack - 最大栈大小
cpu - 以分钟为单位的最多 CPU 时间
noproc - 进程的最大数目
as - 地址空间限制
maxlogins - 此用户允许登录的最大数目
在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/
/etc/systemd/user.conf.d/
system.conf 是系统实例使用的
user.conf用户实例使用的
一般的sevice,使用system.conf中的配置即可,在[Service]模块下添加如下内容。
systemd.conf.d/*.conf中配置会覆盖system.conf的配置。
#生产环境一般处于禁用状态
#DefaultLimitCORE=infinity
#核心转储文件大小不限制,它是进程运行时突然崩溃的那一刻的内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里,可使用 gdb 工具来分析。core dump 生产环境一般处于禁用状态,对于内存消耗性的进程,core dump 时会占用很多系统资源,磁盘空间也可能被写满。
DefaultLimitNOFILE=1048576
#服务进程可以打开文件的最大数目为1048576
DefaultLimitNPROC=65535
#进程可以打开的最大线程数目为65535
# cat /etc/systemd/system.conf | grep -v '^#' | grep -v '^$'
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=65535
# cat /etc/systemd/user.conf | grep -v '^#' | grep -v '^$'
[Manager]
DefaultLimitCORE=infinity
DefaultLimitNOFILE=1048576
DefaultLimitNPROC=65535
注:修改了system.conf后,需要重启系统才会生效。
测试中发现执行以下命令也可以让 systemd 加载最新配置,不过官方文档说明该命令很少用,主要在 debugging 和 package upgrades 时使用。
systemctl daemon-reexec
之前启动的service服务也不会自动加载新的限制参数 ,需要重启对应的service服务才会变更限制。
daemon-reload重新加载的是所有单元文件,而不是systemd本身的配置。
Reexecute the systemd manager. This will serialize the manager state, reexecute the process and deserialize the state again. This command is of little use except for debugging and package upgrades. Sometimes, it might be helpful as a heavy-weight daemon-reload. While the daemon is being reexecuted, all sockets systemd listening on behalf of user configuration will stay accessible.
除了 LimitCORE,还可以在 service 文件中配置 LimitNOFILE、LimitSTACK、LimitNPROC 等资源限制,配置时请注意单位,详见:
https://www.freedesktop.org/software/systemd/man/systemd.exec.htmlsystemd.execsystemd.exec
针对单个Service,也可以设置,以nginx为例。
编辑 /usr/lib/systemd/system/nginx.service 文档在[Service]模块下添加如下内容:
[Service]
LimitCORE=infinity
LimitNOFILE=1048576
LimitNPROC=65535
然后运行如下命令,才能生效。
systemctl daemon-reload
systemctl restart nginx.service
查看一个进程的limit设置:cat /proc/YOUR-PID/limits
例如我的一个nginx service的配置效果:
$ cat /proc/$(cat /usr/local/nginx/logs/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 65535 65535 processes
Max open files 1048576 1048576 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
cat /proc/$(ps -ef | grep XXX.jar | grep -v grep | awk '{print $2}')/limits
cat /proc/$(ps -ef | grep jenkins.war | grep -v grep | awk '{print $2}')/limits
参考文献 systemd service 如何开启 core dump
https://zhuanlan.zhihu.com/p/41153588
https://www.wenjiangs.com/doc/systemd-systemd-system-conf#f0f093f535dca6ab3fc14deae410700b