9

正如我在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.

任何帮助深表感谢。

4

1 回答 1

17

我认为你混淆了两个不同的问题。您可能正在处理太多的单个任务,或者单个任务可能效率低下。

您可能知道其中哪一个是问题,但从您的问题中不清楚是哪一个。

要跟踪正在处理的任务数量,我建议您查看celerymon。如果某个特定任务的出现频率超出您的预期,那么您可以调查它是从哪里调用的。

分析整个 celery 可能没有帮助,因为你会得到很多你无法控制的代码。正如您所说,这也意味着您在生产中运行它时遇到问题。我建议您考虑将分析代码直接添加到您的任务定义中。

您可以cProfile.run('func()')用作 celery 和代码之间的间接层,以便对任务的每次运行进行分析。如果您生成一个唯一的文件名并将其作为第二个参数传递给run您,您将拥有一个充满配置文件数据的目录,您可以逐个任务检查该目录,或者使用pstats.add将多个任务运行组合在一起。

最后,按任务分析意味着您还可以使用项目代码中的设置全局或按任务打开或关闭分析,而无需修改服务器上的初始化脚本。

于 2011-09-19T16:04:26.663 回答