乐趣区

关于php:解决-Swoole-服务报错-Too-many-open-files-文件句柄超出系统限制

如果在 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 时的解决办法:

  1. ulimit -n
  2. supervisorminfds
  3. systemdLimitNOFILE

退出移动版