nproc、nofile 对于systemctl 服务设置不生效
背景
在一次mq集群运维过程中,broker不能正常启动,报错(Too many open files)
排查过程
看到这个错误首先想到的解决方法是修改系统文件最大连接数的限制,但是通过命令查看当前系统连接数已经为比较大的值(655350)。接着判断是不是配置没有生效,或者是当前进程的配置获取的并不是系统的全局配置,结合想到启动broker是通过linux server进行启动(systemctl),为了验证当前进程的文件连接现在,在broker启动脚本中,加入命令uname -a
。在通过启动服务时,输出为
这样确定是配置没有生效。
解决方法
- 修改broker服务的
LimitNOFILE
配置
vim /usr/lib/systemd/system/broker.service
[Service]
LimitNOFILE=100000
- 重启broker服务,解决问题
systemctl restart broker
扩展
nproc、nofile的含义
- nproc: 单个用户可用的最大进程数量
- nofile: 可打开的文件描述符的最大数
如果超过限制值,出现的错误描述
nproc
Cannot create GC thread. Out of system resources
java.lang.OutOfMemoryError: unable to create new native thread
nofile
Too many open files
配置并生效
- 修改系统配置 (需要重启)
vim /etc/security/limits.conf
# * 代表全部用户
* soft nofile 65536
* hard nofile 65536
baseuser hard nproc 65536
baseuser soft nproc 65536
- 控制台修改(不需要重启)
ulimit -u 655350
- 对于通过系统服务启动的程序(通过systemctl启动,修改配置后需求重启服务)
如果不进行设置,默认配置为1024,改配置不受 系统配置影响,因此会出现系统配置限制调大,但是通过服务启动的进程,依然报错
对特定服务进行控制
vim /usr/lib/systemd/system/xxx.service
[Service]
LimitNOFILE=655350
LimitNPROC=655350
配置查看命令
- 进程实时打开文件数
lsof -p {PID} |wc -l
- 进程最大可打开文件数
cat /proc/{PID}/limits
- 系统可打开文件数限制
cat /proc/sys/fs/file-max
- 查看当前限制配置
ulimit -u