Я выполняю задание очереди Laravel под названием «webhooks», используя beanstalkd и supervisord на моем сервере Ubuntu. Я вижу, что задание работает правильно с идентификатором процесса 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? Для чего используются эти файлы?
В итоге я увеличил лимит открытия файлов в моей системе, и это, похоже, решило проблему. Документы руководителя говорят, что:
супервизор свободно использует файловые дескрипторы и вводит ошибку
режим, когда нельзя получить из ОС
После увеличения лимита открытия файлов до 10000 я перестал видеть ошибку. Я периодически проверяю количество открытых файлов FIFO, и иногда оно очень велико (в тысячах), а иногда гораздо меньше (в сотнях). Похоже, что супервизор постоянно открывает и закрывает эти файлы, и мне просто нужно было убедиться, что система позволяет супервизору достаточно места для своей работы.
Если кому-то интересно, я увеличил лимит файлов, добавив следующие две строки в конец /etc/security/limits.conf
,
root soft nofile 10000
root hard nofile 10000
Мне пришлось перезапустить супервизор, а также войти в систему и выйти из нее несколько раз, прежде чем новый лимит вступил в силу, но в конце концов он заработал.
Других решений пока нет …