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