使用supervisor启动进程open files too many问题

今天线上出现了open files too many的问题,查看问题:

1. ulimit -a查看系统最大值发现可以开启的文件句柄只有1024个

使用supervisor启动进程open files too many问题_第1张图片

 

果断修复:

 1. 查看全局配置文件
ls /etc/security/limits.d/

比如环境中有如下配置文件,20-nproc.conf名字可能每个机器不太一样:
/etc/security/limits.d/20-nproc.conf

运行以下命令:

cat > /etc/security/limits.d/20-nproc.conf << EOF
* soft nproc 655350
* hard nproc 655350
* soft nofile 655350
* hard nofile 655350
EOF

2. 查看sysctl.conf

ll -a /etc/sysctl.d/

看到有配置文件/etc/sysctl.d/99-sysctl.conf,更改配置文件内容:

cat > /etc/sysctl.d/99-sysctl.conf << EOF
fs.file-max = 655350
vm.swappiness = 0
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
EOF

启用配置

sysctl --system
sysctl -p /etc/sysctl.d/99-sysctl.conf

重新登录终端,查看系统参数已经修改过来:

使用supervisor启动进程open files too many问题_第2张图片

现在只是系统的限制更改了,进程在启动的时候已经分配了一个最大的可开启文件句柄数,可以通过cat /proc/{PID}/limits查看。因为使用的supervisor管理进程,查看进程PID,并且查看限制数量:

[root@main-ctrl01 ~]# supervisorctl status 
controller                 RUNNING   pid 9411, uptime 6 days, 22:12:31

使用supervisor启动进程open files too many问题_第3张图片 最大值为4096,此时我是有点迷惑的,因为原先系统限制只有1024,这个4096是从哪来的?

反正有问题,先不管了,先重启进程。考虑到supervisor启动的进程,其实父进程是supervisord进程,所以直接重启supervisord,由supervisord自己重启管理的进程,运行以下命令,然后看到进程重新起来了,查看进程的文件描述符限制:

[root@main-ctrl01 ~]# systemctl restart supervisord
[root@main-ctrl01 ~]# supervisorctl status 
controller                 RUNNING   pid 6045, uptime 0:00:17

cat /proc/{PID}/limits

使用supervisor启动进程open files too many问题_第4张图片

还是4096,不对劲。中间尝试不使用supervisor启动进程,直接java -jar启动,暂时恢复了线上业务。

然后找解决办法,基本定为就是supervisor问题,查看了一下解决方案,supervisor是使用systemctl管理的,更改配置文件:/usr/lib/systemd/system/supervisord.service

cat > /usr/lib/systemd/system/supervisord.service << EOF
[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
Type=forking
LimitNOFILE=infinity
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
EOF

 即添加:LimitNOFILE=infinity 参数

然后找了个测试环境重启systemctl restart supervisord:

[root@main-ctrl01 ~]# systemctl restart supervisord
[root@main-ctrl01 ~]# supervisorctl status 
controller                 RUNNING   pid 29646, uptime 0:00:11

果然修改了过来:

使用supervisor启动进程open files too many问题_第5张图片

然后夜深人静的夜晚凌晨00:30,把进程启动方式改回supervisor。这都是默认安装的坑啊。

 

你可能感兴趣的:(服务器,linux,运维)