错误日志:
error_log(/www/wwwroot/xxxx.xxxxxxxx.com/php-server/runtime/log/20240502_info.log): failed to open stream: Too many open files/www/wwwroot/xxxxx.com/php-server/vendor/topthink/framework/src/think/log/driver/File.php126
原因分析:
这个错误信息说明在尝试写入日志文件时,因为达到了系统允许的最大文件描述符数量,导致无法打开新的文件流。
排查方法:
1:可以先使用ulimit -n命令查看一下当前操作系统的最大描述符数量。
2:使用lsof -p 1551 | wc -l,查看swoole进程当前已经创建的描述符数量。1551指的是swoole的进程id。
3:使用cat /proc/1551/limits ,查看swoole进程允许创建的最大文件句柄数量max open files
linux操作系统解决方法:
修复方案是增加操作系统配置文件中对最大描述符数量的限制,其实这个问题在swoole的官方文档中已经有修复方法了,采用swoole官方的方案修复即可。
随后重启操作系统,然后使用ulimit -n查看输出是否为修改后的2622140
继续使用命令cat /proc/9949/limits,9949为swoole的进程id,该命令查看到Max open files 为1024, 因为swoole是supervisor启动的,而1024为supervisor的minfds默认配置,不对劲。,为什么swoole进程允许的最大描述符数量没有遵循修改后的操作系统最大描述符文件数量。。
懒得深入研究了,直接修改supervisor的minfds,我改成了150000,重启supervisor。最后使用cat /proc/9949/limits,可以查看到swoole进程最大可创建的描述符文件数150000已生效。
总结:
1:先调整操作系统最大允许创建的描述符数量配置;
2:修改supervisor配置,保证supervisor启动的swoole进程拥有足够多的创建文件句柄的数量。
3:使用cat /proc/9949/limits,查看配置是否生效。