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

Laravel queue with supervisord opening too many FIFO files

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

webhooks                         RUNNING    pid 4403, uptime 4 days, 19:47:01

如您所见,此作业已 运行 4 天。在我的错误日志中,我开始注意到出现以下错误:

error:02001018:system library:fopen:Too many open files

当我 运行 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

这只是一个节选。这些 FIFO 个文件实际上大约有 1200 个打开。

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

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

supervisord uses file descriptors liberally, and will enter a failure mode when one cannot be obtained from the OS

将我的文件打开限制增加到 10,000 后,我不再看到错误。我定期检查打开的 FIFO 文件的数量,有时它非常高(数千),有时它非常低(数百)。所以看起来 supervisor 不断地打开和关闭这些文件,我只需要确保系统允许 supervisor 足够 space 来完成它的工作。

如果有人想知道,我通过将以下两行添加到 /etc/security/limits.conf 的底部来增加文件限制。

root             soft    nofile          10000
root             hard    nofile          10000

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