今天线上出现了open files too many的问题,查看问题:
1. ulimit -a查看系统最大值发现可以开启的文件句柄只有1024个
果断修复:
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
重新登录终端,查看系统参数已经修改过来:
现在只是系统的限制更改了,进程在启动的时候已经分配了一个最大的可开启文件句柄数,可以通过cat /proc/{PID}/limits查看。因为使用的supervisor管理进程,查看进程PID,并且查看限制数量:
[root@main-ctrl01 ~]# supervisorctl status
controller RUNNING pid 9411, uptime 6 days, 22:12:31
最大值为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
还是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
果然修改了过来:
然后夜深人静的夜晚凌晨00:30,把进程启动方式改回supervisor。这都是默认安装的坑啊。