Celery 任务分析

9 投票
1 回答
7504 浏览
提问于 2025-04-17 02:36

我注意到在 top 工具中,celery 这个进程消耗了很多 CPU 时间。所以我想对它进行性能分析。

我可以在开发机器上手动进行性能分析,方法如下:

python -m cProfile -o test-`date +%Y-%m-%d-%T`.prof ./manage.py celeryd -B

但是为了获得准确的时间数据,我需要在生产机器上进行性能分析。在那台机器上(Fedora 14),celery 是通过初始化脚本启动的。例如:

service celeryd start

我发现这些脚本最终会调用 manage.py celeryd_multi。所以我想知道如何让 celeryd_multi 启动 celery 时开启性能分析?在我的情况下,这意味着要在 python 后面加上 -m cProfile -o out.prof 这些选项。

任何帮助都非常感谢。

1 个回答

17

我觉得你可能把两个不同的问题搞混了。你可能是在处理太多的单独任务,或者某个单独任务本身效率不高。

你可能知道哪个是问题所在,但从你的提问中并不清楚。

为了追踪有多少任务正在被处理,我建议你看看 celerymon。如果某个特定的任务出现的频率比你预期的要高,那你可以调查一下这个任务是从哪里被调用的。

对整个celery进行性能分析可能没什么帮助,因为你会看到很多你无法控制的代码。正如你所说,这也意味着在生产环境中运行时会遇到问题。我建议你直接在任务定义中添加 性能分析代码

你可以使用 cProfile.run('func()') 在celery和你的代码之间加一层间接调用,这样每次任务运行时都会进行性能分析。如果你生成一个独特的文件名,并把它作为第二个参数传给 run,你就会得到一个包含性能数据的目录,可以逐个任务查看,或者使用 pstats.add 来合并多个任务的运行数据。

最后,逐个任务的性能分析意味着你可以通过项目代码中的设置来开启或关闭性能分析,无论是全局设置还是针对特定任务,而不需要修改服务器上的初始化脚本。

撰写回答