问题描述
在高并发或者接口压测过程中常常会遇到的错误,这里并不是程序中打开文件过多,而是某个时间端服务打开的连接数超出服务器的句柄数限制所导致的报错。所以这里我们不要惊慌或者自己的代码出了bug,我的服务是使用supervisor进行管理的,在压测过程中出现了这个问题。
问题排查
-
通过 ps -ef 查看自己服务的进程ID,再通过lsof -p pid | wc -l 查看当前服务打开的句柄数,通过命令ulimit -a 查看当前设置的最大句柄数设置,如下图所示,我的服务的句柄数为1180,而系统的限制为65533,1180 < 65533 为什么会出现这样的情况,我刚开始也再质疑,蒙圈的去走读了几次代码。
-
如果你的服务是直接使用命令行启动的话别急,而且 服务句柄数 是大于服务器限制的话。通过一下方式配置的话即可解决。
修改系统配置文件,增大允许打开的文件数
vim /etc/security/limits.conf
#在最后加入
* soft nofile 65533
* hard nofile 65533
保存退出后重启系统
再通过ulimit -a 查看是否修改成功
-
通过命令 vi /proc/pid/limits 查看当前的句柄数限制,奇怪,为什么通过ulimit