python - 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 个子进程都出现并开始处理工作。
有谁知道还有什么问题?据我所知,操作系统有足够的空间来打开文件。
解决方案
显然,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
推荐阅读
- python - 从 unyt 包导入类时 PyCharm 找不到引用
- linux - 在 CentOS 7 上无法从 Docker 容器内访问网络
- python - 带有补充自定义词典的拼写校正器
- matlab - 使用有限差分的二阶 ODE 近似
- vue.js - 将 b 表的每个单元格中的文本切换到输入框并返回
- php - 仅来自特定日期的日期时间值不正确 1292 Laravel 5.7
- html - 如何使用 Media Queria 隐藏显示网格中的列并调整剩余列中的间距?
- angular - 带有标签/路由器插座的子路由不起作用。“错误:无法匹配任何路由。URL 段”
- javascript - 如何在 created() 挂钩期间使用数据初始化 Vue-CLI 应用程序?
- eclipse - 在 Eclipse 2019-09 上安装 Subversion