python - celery 任务分析

标签 python profiling celery django-celery

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

相关文章:

python - 如何在 Python 中编码这个 "strange"排序

python - 如何在计划任务的情况下从 celery 获取任务 ID (beat)

python - 使用来自 Celery tasks.py 的 Django Channels 向客户端发送消息

python - 如何从 Google Cloud Function 的代码更改环境变量的值?

Python - diruplicates in dir() 这是一个错误吗?

c# - 我如何获得包含 child 的包容性样本?

ubuntu - VTUNE : Cannot display data

python - 本地网络中 Python 中的 RabbitMQ、ZMQ 和 Celery 之间的最佳选择是什么?

python - 如何安装 PyInstaller?

Java任务控制: Flight Recorder throws: javax.命名.ServiceUnavailableException