分析长期运行的Python服务器

时间:2012-03-22 09:07:48

标签: python performance profiling

我有一个长期运行的twisted服务器。

在大型系统测试中,在测试几分钟的某个特定点,当某些客户端进入特定状态并发生特定的外部事件时,然后此服务器需要几分钟的100%CPU并且它的工作非常缓慢。我想知道它在做什么。

如何在长时间运行的服务器中获取特定时间段的配置文件?

如果有办法在运行时启用或注入探查器,我可以轻松地通过HTTP发送服务器启动和停止消息吗?

考虑到这一选择,我希望stack-based /调用图分析,但即使是叶片采样也可能提供见解。

4 个答案:

答案 0 :(得分:11)

yappi profiler可以在运行时启动和停止。

答案 1 :(得分:3)

不是一个非常Pythonic的答案,但也许strace这个过程提供了一些见解(假设您使用的是Linux或类似的)。

严格地使用Python,对于这样的事情,我正在使用跟踪所有调用,将结果存储在一个环形缓冲区中并使用一个信号(也许你可以通过HTTP消息这样做)来转储该环形缓冲区。当然,跟踪会降低所有内容的速度,但在您的方案中,您也可以通过HTTP消息切换跟踪,因此只有在您的问题处于活动状态时才会启用跟踪。

答案 2 :(得分:2)

Pyliveupdate是用于以下目的的工具:对长时间运行的程序进行概要分析,而无需重新启动它们。它允许您动态选择特定的功能来进行性能分析或停止性能分析,而无需提前对代码进行检测-它可以动态地对代码进行性能分析。

Pyliveupdate具有三个关键功能:

  • 配置文件特定的Python函数(按函数名称或模块名称)的调用时间。
  • 添加/删除配置文件,而无需重新启动程序。
  • 显示带有呼叫摘要和火焰图的分析结果。

在此处查看演示:https://asciinema.org/a/304465

答案 3 :(得分:1)

出现了两个有趣的工具来尝试解决该特定问题,您可能不一定要事先在代码中插入性能分析,而是想要在瞬间分析生产代码。

  • pyflame将使用ptrace(2) syscall附加到现有流程,并创建该流程的“火焰图”。它是用Python编写的。

  • py-spy的工作方式是读取进程内存,然后找出Python调用堆栈。它还提供了火焰图,还提供了“类似顶部”的界面,以显示哪个功能花费的时间最多。它是用Rust和Python编写的。