Celery: слишком много открытых файлов - как решить, если в ОС достаточно дескрипторов? - PullRequest
0 голосов
/ 27 марта 2020

У меня есть приложение с сельдереем, настроенное так же в systemd в Ubuntu 18.04:

[Unit]
Description=My Celery Service
After=network.target
StartLimitIntervalSec=0

[Service]
SyslogIdentifier=workers.service
Type=simple
Restart=always
RestartSec=1
User=celery-user
Group=celery-user
WorkingDirectory=/home/celery-user/app
ExecStart=/home/celery-user/app_venv/bin/celery -A celery_worker.celery worker --concurrency=300 --soft-time-limit=15000 --loglevel=info --logfile=/var/log/celery/worker.log
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target

Однако, когда я пытаюсь запустить приложение с sudo systemctl start celery.service, служба запускается, но в логах Я сразу вижу это:

[2020-03-27 17:44:06,052] CRITICAL worker.start: Unrecoverable error: OSError(24, 'Too many open files')
Traceback (most recent call last):
  File "/home/celery-user/app_venv/lib/python3.6/site-packages/celery/worker/worker.py", line 205, in start
    --- snip ---
  File "/home/celery-user/app_venv/lib/python3.6/site-packages/billiard/connection.py", line 569, in Pipe
    fd1, fd2 = os.pipe()
OSError: [Errno 24] Too many open files

Я видел множество других с подобной проблемой, но пока что ничего не предполагалось, сработало. Я сделал стандартную проверку всех обычных подозреваемых открытых файлов, но ничего необычного для меня не выглядит. Я поднял некоторые из максимумов довольно высоко, просто чтобы убедиться, что они на самом деле не были проблемой, как вы можете видеть здесь:

$ ulimit -Hn
1000000
$ ulimit -Sn
1000000
$ sysctl fs.file-nr
fs.file-nr = 1536       0       3256496

Если я значительно уменьшу параллелизм, до 100, это не вызовет проблем и все 100 дочерних процессов запускаются и начинают обрабатывать работу.

Кто-нибудь знает, что еще может быть не так? Насколько я могу судить, в ОС достаточно места для открытых файлов.

1 Ответ

0 голосов
/ 27 марта 2020

Видимо, systemd не наследует ограничения пользователя. Я запустил сельдерей с небольшим количеством рабочих, затем осмотрел /proc/<main_celery_pid>/limits и обнаружил это:

Max open files            1024                4096                files

Другими словами, он все еще использовал значения по умолчанию. Добавив это в раздел [Service] моего системного conf-файла для сельдерея, все заработало, как и ожидалось:

LimitNOFILE=10000

Повторная проверка файла ограничений процессов после выполнения редактирования и перезапуска:

Max open files            10000                10000                files
...