正如我在 top
实用程序 celery
中看到的那样,进程消耗了大量 CPU 时间。所以我想分析一下。
我可以像这样在开发机器上手动完成:
python -m cProfile -o test-`date +%Y-%m-%d-%T`.prof ./manage.py celeryd -B
但是为了获得准确的时间,我需要在生产机器上对其进行分析。在那台机器(Fedora 14)上,celery 由 init 脚本启动。例如
service celeryd start
我发现这些脚本最终会调用 manage.py celeryd_multi
。所以我的问题是如何告诉 celeryd_multi
在启用分析的情况下启动 celery?在我的例子中,这意味着将 -m cProfile -o out.prof
选项添加到 python
。
非常感谢任何帮助。
最佳答案
我认为您混淆了两个不同的问题。您可能正在处理过多的单个任务,或者单个任务可能效率低下。
您可能知道其中哪一个是问题所在,但从您的问题中并不清楚是哪个问题。
要跟踪正在处理的任务数量,我建议您查看 celerymon .如果某个特定任务出现的频率超出您的预期,那么您可以调查从哪里调用它。
分析整个 celery 可能没有帮助,因为您会得到很多您无法控制的代码。正如您所说,这也意味着您在生产中运行它时遇到问题。我建议你看看添加 profiling code直接进入您的任务定义。
您可以使用 cProfile.run('func()')
作为 celery 和您的代码之间的间接层,以便分析任务的每次运行。如果您生成一个唯一的文件名并将其作为第二个参数传递给 run
,您将拥有一个充满配置文件数据的目录,您可以逐个任务检查该目录,或使用 pstats.add将多个任务运行组合在一起。
最后,按任务分析意味着您还可以使用项目代码中的设置全局或按任务打开或关闭分析,而无需修改服务器上的初始化脚本。
关于python - celery 任务分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7473537/