【问题标题】:Laravel queue with supervisord opening too many FIFO files带有supervisord的Laravel队列打开了太多的FIFO文件
【发布时间】:2015-08-14 21:57:32
【问题描述】:

我正在我的 Ubuntu 服务器上使用 beanstalkd 和 supervisord 运行一个名为“webhooks”的 Laravel 队列作业。我可以看到使用进程 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

这只是摘录。实际上打开了大约 1200 个这些 FIFO 文件。

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

【问题讨论】:

  • 快速谷歌让您知道 FIFO 文件是命名管道。您的脚本或 supervisord 中的某些内容正在创建这些管道。查看 PHP 手册中的命名管道,看看是否无法追踪创建管道的代码。
  • 你知道哪些类型的代码会导致系统创建命名管道吗?我知道这是一个广泛的问题,但我不知道从哪里开始。正在运行的代码是在我的内部系统和使用 Bigcommerce API 的外部系统之间同步对象,使用他们的PHP SDK。因此,它不断地从 Bigcommerce 推送和提取信息。以前我打开了太多的连接,导致出现类似的太多文件打开错误,但现在已经解决,这个 FIFO 问题已经取而代之。
  • 对 beanstalkd 或 supervisord 都不熟悉,但我个人会从 searching your code base 开始 proc_openmkfifo
  • 我自己不会在任何地方调用这些函数。如果它们正在被使用,那是因为 Laravel 本身正在使用它们。
  • 发布 webhook 的代码

标签: php laravel supervisord beanstalkd


【解决方案1】:

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

supervisord 随意使用文件描述符,会进入失败 无法从操作系统获取的模式

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

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

root             soft    nofile          10000
root             hard    nofile          10000

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2011-08-15
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多