【发布时间】: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_open或mkfifo。 -
我自己不会在任何地方调用这些函数。如果它们正在被使用,那是因为 Laravel 本身正在使用它们。
-
发布 webhook 的代码
标签: php laravel supervisord beanstalkd