Laravel队列与supervisord打开太多的FIFO文件

fly*_*123 8 php beanstalkd supervisord laravel

我在我的Ubuntu服务器上使用beanstalkd和supervisord运行一个名为"webhooks"的Laravel队列作业.我可以看到正确运行进程ID为4403的作业:

webhooks                         RUNNING    pid 4403, uptime 4 days, 19:47:01
Run Code Online (Sandbox Code Playgroud)

如您所见,这项工作已经运行了4天.在我的错误日志中,我开始注意到出现以下错误:

error:02001018:system library:fopen:Too many open files
Run Code Online (Sandbox Code Playgroud)

当我跑去lsof | php查看哪些文件是打开的时,我注意到有大量打开的文件有类型FIFO.这是输出专家:

COMMAND     PID   TID       USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME     
php        4403             root    0r     FIFO                0,8      0t0    9215811 pipe
php        4403             root    1w     FIFO                0,8      0t0    9215812 pipe
php        4403             root    2w     FIFO                0,8      0t0    9215812 pipe
php        4403             root    3w     FIFO                0,8      0t0    9215812 pipe
php        4403             root    4w     FIFO                0,8      0t0    9215812 pipe
php        4403             root    8r     FIFO                0,8      0t0    9215811 pipe
php        4403             root    9r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   10r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   11r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   12r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   13r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   14r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   15r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   16r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   17r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   18r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   19r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   20r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   21r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   22r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   23r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   24r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   25r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   26r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   27r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   28r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   29r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   30r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   31r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   32r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   33r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   34r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   35r     FIFO                0,8      0t0    9215811 pipe
php        4403             root   36r     FIFO                0,8      0t0    9215811 pipe
Run Code Online (Sandbox Code Playgroud)

这只是一个摘录.实际上大约有1200个这样的FIFO文件打开了.

有谁知道导致文件创建的原因是什么?什么类型的代码会导致系统打开新的FIFO文件?这些文件用于什么?

fly*_*123 1

我最终增加了系统上的文件打开限制,这似乎解决了问题。主管文档说:

Supervisord 大量使用文件描述符,当无法从操作系统获取文件描述符时将进入故障模式

将文件打开限制增加到 10,000 后,我不再看到该错误。我定期检查打开的 FIFO 文件的数量,有时它非常高(数千个),有时则低得多(数百个)。所以看起来主管不断地打开和关闭这些文件,我只需要确保系统为主管提供足够的空间来完成其工作。

如果有人想知道,我通过将以下两行添加到/etc/security/limits.conf.

root             soft    nofile          10000
root             hard    nofile          10000
Run Code Online (Sandbox Code Playgroud)

在新限制生效之前,我不得不重新启动主管并登录和退出系统几次,但最终它起作用了。