首页 > 解决方案 > Celery:打开的文件太多 - 如果操作系统有大量可用的描述符,如何解决?

问题描述

我有一个 celery 应用程序,在 Ubuntu 18.04 上的 systemd 中配置如下:

[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 个子进程都出现并开始处理工作。

有谁知道还有什么问题?据我所知,操作系统有足够的空间来打开文件。

标签: pythonubuntuoperating-systemcelery

解决方案


显然,systemd 不会继承用户的限制。我用少量工人推出了 celery,然后检查/proc/<main_celery_pid>/limits并发现了这一点:

Max open files            1024                4096                files

换句话说,它仍然使用默认值。通过将此添加到[Service]我的 celery 的 systemd conf 文件部分,一切都按预期工作:

LimitNOFILE=10000

进行编辑并重新启动后再次检查进程限制文件:

Max open files            10000                10000                files

推荐阅读