分析长期运行的 Python 服务器
Posted
技术标签:
【中文标题】分析长期运行的 Python 服务器【英文标题】:Profiling a long-running Python Server 【发布时间】:2012-03-22 09:07:47 【问题描述】:我有一个长期运行的twisted 服务器。
在大型系统测试中,在测试开始几分钟的某个特定点,当一些客户端进入特定状态并发生特定外部事件时,然后此服务器需要几分钟的 100% CPU并且工作非常缓慢。我想知道它在做什么。
如何在长时间运行的服务器中获取特定时间跨度的配置文件?
如果有办法在运行时启用或注入分析器,我可以轻松地通过 HTTP 发送服务器启动和停止消息?
如果可以选择,我希望stack-based/call-graph 分析,但即使是叶子采样也可能提供洞察力。
【问题讨论】:
【参考方案1】:yappi profiler 可以在运行时启动和停止。
【讨论】:
现在是here,一个简短的使用示例是here,它也可以在命令中使用,例如python3 -m yappi -o myprofile.cprof script.py
【参考方案2】:
出现了两个有趣的工具来尝试解决该特定问题,您可能不一定事先在代码中进行了分析,但希望在紧要关头分析生产代码。
pyflame 将使用ptrace(2) 系统调用附加到现有进程并创建进程的“火焰图”。它是用 Python 编写的。
py-spy 通过读取进程内存并找出 Python 调用堆栈来工作。它还提供了一个火焰图,还提供了一个“类似顶部”的界面,以显示哪个函数花费的时间最多。它是用 Rust 和 Python 编写的。
【讨论】:
【参考方案3】:不是一个非常 Pythonic 的答案,但也许 strace
ing 这个过程可以提供一些见解(假设您使用的是 Linux 或类似设备)。
严格使用 Python,对于此类事情,我使用跟踪所有调用,将它们的结果存储在环形缓冲区中并使用信号(也许您可以通过 HTTP 消息执行此操作)转储该环形缓冲区。当然,跟踪会减慢一切,但在您的场景中,您也可以通过 HTTP 消息打开跟踪,因此只有在您的问题也处于活动状态时才会启用它。
【讨论】:
你可以对正在运行的 python 进程执行这些操作而不停止它吗? 当然。不过,它必须为此做好准备。在 Python 中,只需调用sys.settrace(bla)
并且函数 bla()
将被调用以处理几乎所有发生的事情(调用函数、执行一行等)。调试器和分析器通常依赖于该机制。但是在此基础上构建一些东西然后准备在接收到特殊的 HTTP 消息时打开它是相当简单的。【参考方案4】:
Pyliveupdate 是一个为以下目的而设计的工具:分析长时间运行的程序而无需重新启动它们。它允许您动态选择特定函数进行分析或停止分析,而无需提前检测您的代码——它可以动态检测代码以进行分析。
Pyliveupdate 具有三个主要功能:
配置文件特定的 Python 函数(按函数名称或模块名称)调用时间。 无需重新启动程序即可添加/删除配置文件。 使用调用摘要和火焰图显示分析结果。在此处查看演示:https://asciinema.org/a/304465。
【讨论】:
以上是关于分析长期运行的 Python 服务器的主要内容,如果未能解决你的问题,请参考以下文章