錯誤日志:
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,查看配置是否生效。