如果在 Swoole 的日志中遇到了 Too many open files
这种报错,不要慌,在开发 TCP 网络应用的过程中,常常会遇到 Too many open files
这个问题。
这阐明你的程序以达到 Linux 所容许的关上文件数下限。须要批改 ulimit
设置
能够应用 lsof
查看过程关上的文件句柄数:
# 将 PID 批改为你要查看的过程 ID
lsof -p PID | wc -l
也能够去掉 | wc -l
来查看服务关上了那些文件句柄,未进行敞开。
能够应用 ulimit -n
查看以后设置为多少
[root@shenyan ~]# ulimit -n
100001
如果过小,须要进行调整,Swoole 文档中举荐 ulimit -n
要调整为 100000
甚至更大。
那么如何批改呢?
命令行下执行 ulimit -n 100000
即可批改。
然而须要留神,有时候这种批改办法仅以后终端无效,敞开或者从新开个一个终端就会复原之前的设置。
这时就须要批改 /etc/security/limits.conf
,退出
* soft nofile 262140
* hard nofile 262140
root soft nofile 262140
root hard nofile 262140
* soft core unlimited
* hard core unlimited
root soft core unlimited
root hard core unlimited
批改 limits.conf
文件后,须要重启零碎失效。
这样操作实现当前,如果还是报错 Too many open files
,那么就能够试试查看运行中的过程限度:
# 将 PID 批改为你要查看的过程 ID
cat /proc/PID/limits
如果这里的 Max open files
过小,也是须要进行批改的。
这种状况大多数呈现于应用 supervisor
等工具进行治理的时候,supervisor
启动服务默认的 minfds
配置是1024
,所以会呈现 Too many open files
。
应用 systemd
的话,也是同样的情理,须要批改LimitNOFILE
。如果不设置或者设置为LimitNOFILE=unlimited
(不辨认),则默认为1024
。
而这里也要留神设置 LimitNOFILE=infinity
就等于LimitNOFILE=65536
,对于需要 10 万以上文件关上数的人,肯定要自行设定。
综上所述,遇到 Too many open files
时的解决办法:
ulimit -n
supervisor
:minfds
systemd
:LimitNOFILE