我需要从 Rabbitmq 读取并在单个系统中使用 Celery 并行执行任务。
[2014-12-30 15:54:22,374: INFO/Worker-1] ...
[2014-12-30 15:54:23,401: INFO/Worker-1] ...
[2014-12-30 15:54:30,878: INFO/Worker-1] ...
[2014-12-30 15:54:32,209: INFO/Worker-1] ...
[2014-12-30 15:54:33,255: INFO/Worker-1] ...
[2014-12-30 15:54:48,445: INFO/Worker-1] ...
[2014-12-30 15:54:49,811: INFO/Worker-1] ...
[2014-12-30 15:54:50,903: INFO/Worker-1] ...
[2014-12-30 15:55:39,674: INFO/Worker-1] ...
[2014-12-30 15:55:41,024: INFO/Worker-1] ...
[2014-12-30 15:55:42,147: INFO/Worker-1] ...
Run Code Online (Sandbox Code Playgroud)
它接缝只有 1 个工人一直在运行 .. 即按顺序一个接一个。如何将 Celery 配置为运行多个 worker 以并行运行?
我按照官方教程/文档的说明为我的 Django 项目安装了 Celery。当我在命令行启动 celery 时它工作正常,我可以看到它接收任务并执行它们。但是一旦一切正常,我决定更多地遵循文档来守护芹菜并让它一直运行。因此,我也使用 /etc/default/celeryd 脚本在 Ubuntu 系统上尝试了提供的 celeryd init 脚本。我相应地更改了值并正确启动,但是当它收到任务时,日志显示:
ERROR/MainProcess] Received unregistered task of type 'likes.tasks.test'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.
Run Code Online (Sandbox Code Playgroud)
然后我得到了任务要求的细节。同样,当我在没有任何配置的情况下在命令行上启动 celery 时,此任务可以完美运行。那时可能出了什么问题?我使用虚拟环境以防万一它会改变任何东西,但我也在配置文件中指定了它。
我有一台服务器运行由 Gunicorn 和 Celery 任务队列提供服务的 Django 应用程序。
Gunicorn文档建议(2 x $num_cores) + 1 作为默认的工作线程数。
Celery 文档显示 Celery 工作线程的数量默认为 1 x $num_cores。
两者都建议尝试找到合适的数字。
我的问题是,在同一台机器上运行 Gunicorn 和 Celery 的良好经验法则是什么?在八核机器上,我应该从 17 个 Gunicorn 和 8 个 Celery 工人开始吗?或者从 9 个 Gunicorn 和 4 个 Celery 工人开始有意义吗?
系统受 CPU 限制,如果有帮助的话。
我有基于 django 和 celery 的 python 服务器。每次计算机重新启动时,apache2 都会启动,因此我的服务器正在运行,但我必须手动重新启动 celery(转到我的项目目录并执行“python manage.py celeryd”)。生产的正确解决方案是什么?我的意思是,是否有可能将 celery 作为守护进程启动?
在这里http://github.com/ask/celery/tree/master/contrib/debian/init.d/我发现了两个脚本,它们看起来应该在 /etc/init.d/ 中,就像启动 apache2 的 apache2 脚本一样。但是我把它们放在 /etc/init.d/ 中,我看没有任何变化。
当队列长度超过阈值时,Celery 有没有办法发出事件?我想使用该事件来启动 EC2 实例。
我们有两个队列用于 Celery 中的两个不同任务。这些队列之一具有需要在自动缩放组中启动实例的任务。在处理一种任务的第一个自动缩放组中,我们总是有一个实例在运行。然后可以轻松地使用 Amazon CloudWatch 启动另一个实例。但是对于另一个自动缩放组,如果没有任务,我们不希望它有任何实例,因为很多时候该组可能没有要执行的任务。因此,只有当此任务的 Celery 队列长度超过给定阈值时,我们才希望在此自动缩放组中启动一个实例。这样做的好方法是什么?
我正在使用 systemd 在 Ubuntu 18.04 LTS 服务器上运行 Celery,这是一个 python 分布式任务调度程序。
我必须安排大部分长时间运行的任务(需要几分钟才能执行),根据数据,这些任务最终可能会消耗大量 RAM。我想采取某种安全措施来控制内存使用。
我在这里读到,您可以使用MemoryHigh和MemoryMax选项控制 systemd 服务使用的 RAM 量
我在我的 Celery 服务设置中使用了这些选项,并且我观察了当 celery 服务达到给定限制时会发生什么情况htop。
该服务停止执行并置于“D”状态,但保持该状态并且分配的内存未释放。
systemd 是否有可能终止占用内存的进程?
更新
正如下面的评论中所建议的,我已经尝试了一些诊断,并且我将添加其他问题详细信息。
Linux 服务器运行在 Virtual Box 托管的开发虚拟机上,仅运行资源消耗任务。
该MemoryMax设置设为百分比 (35%)。
下图中可以看到htop中的进程状态
正如这个问题的答案中所建议的,以下是挂起的进程堆栈的内容。
[<0>] __lock_page_or_retry+0x19b/0x2e0
[<0>] do_swap_page+0x5b4/0x960
[<0>] __handle_mm_fault+0x7a3/0x1290
[<0>] handle_mm_fault+0xb1/0x210
[<0>] __do_page_fault+0x281/0x4b0
[<0>] do_page_fault+0x2e/0xe0
[<0>] page_fault+0x45/0x50
[<0>] 0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud) 只是为了澄清一些事情 - 我正在开发一个 systemd 服务文件celerybeat.service,它应该处理 Celery 的节拍。我现在正在做的是调用一个脚本/var/run/celery/celerybeat.pid,该脚本读取 、使用该 PID 杀死进程,然后再次启动 Celerybeat 进程。
有更好的方法来实现这一点吗?
When I'm running Celery with Upstart, after a while, the child processes or the main processes die without any trace.
The Upstart script I'm using (/etc/init/celery):
description "celery"
start on runlevel [2345]
stop on runlevel [!2345]
kill timeout 20
# console log
setuid ***
setgid ***
script
chdir /opt/***/project/
exec /opt/***/virtualenvs/***/bin/python manage.py celery worker --settings=settings.staging -B -c 4 -l DEBUG
end script
respawn
Run Code Online (Sandbox Code Playgroud)
When running exectly the same command without upstart (manually running the exec part), everything works …
这能正常工作吗?
CELERYBEAT_SCHEDULE = {
'task-number-one': {
'task': 'project.users.tasks.send_something',
'schedule': crontab(minute='*/2880'),
}
}
Run Code Online (Sandbox Code Playgroud) celery ×9
django ×4
python ×2
systemd ×2
ubuntu ×2
amazon-ec2 ×1
autoscaling ×1
gunicorn ×1
linux ×1
multi-core ×1
rabbitmq ×1
upstart ×1