Python 程序如何定位到 cpu 占用过高的代码呢

2022-01-21 16:20:00 +08:00
 IurNusRay

假如有一个 web 后台服务 cpu/内存占用过高,是否有类似 jstack 的工具,可以定位到具体的代码呢

4375 次点击
所在节点    Python
16 条回复
Latin
2022-01-21 16:24:16 +08:00
ChrisFreeMan
2022-01-21 16:28:09 +08:00
<amp-youtube data-videoid="m_a0fN48Alw" layout="responsive" width="480" height="270"></amp-youtube>&t=524s
IurNusRay
2022-01-21 17:08:19 +08:00
@Latin 这个包似乎依赖了另一个 python2 的包 pynvml.py,运行会报错诶
huangz003
2022-01-21 17:17:25 +08:00
阿里的 arthas 应该可以吧
wynemo
2022-01-21 17:37:36 +08:00
chevalier
2022-01-21 17:50:19 +08:00
CPU 过高,perf top
anonymous256
2022-01-21 19:52:47 +08:00
一般说来,web 服务不涉及 CPU 密集型的任务。比较依赖 CPU 资源的主要在于解码或数学计算类的任务。所以即便你找到了好工具,很可能也解决和发现什么问题。

大多数程序性能的障碍在于:内存数据的写读依赖,不必要的计算和循环,算法的选择,不必要的 I/O 操作,多进程的数据竞争。你可以在程序内用通过日志输出高精度的时间,直接来捕捉到影响性能关键的代码区域,重新看代码逻辑分析具体是什么原因。

以「不必要的计算和循环」为例,我就遇到这样的代码,比如明明一个 for 循环就可以直接完成 AB 操作。但是有的程序员,会先写一个 for 循环执行 A 操作,再来一次 for 循环执行 B 操作。就导致了无谓的双倍内存访问。在比如明明一次 SQL 查询就能解决问题,他要查询两次,然后对数据进行关联和处理。就是不必要的操作和计算。

通常情况,性能的问题是人的问题。
anonymous256
2022-01-21 19:54:20 +08:00
错误:“很可能也解决和发现什么问题”
修正:“很可能也发现和解决不了什么问题。”
zhoudaiyu
2022-01-21 20:16:17 +08:00
@wynemo #5 +1 很好用
lululau
2022-01-21 20:24:45 +08:00
dtrace/ bpftrace
guyskk0x0
2022-01-21 20:31:37 +08:00
pyinstrument, py-spy
0x0208v0
2022-01-22 09:14:21 +08:00
同问楼主,找到相关工具没有
IurNusRay
2022-01-24 10:05:17 +08:00
@anonymous256 恩,这确实是比较实用常见的处理方式,不过偶尔碰到不知道是哪个请求或者哪个任务导致了 cpu/内存占用过高的情况,所以想知道是否有一种监控的工具可以协助定位
IurNusRay
2022-01-24 10:05:40 +08:00
@v2exblog 正在按照楼上的推荐尝试,哈哈
DeanThompson
2022-01-24 15:21:15 +08:00
@guyskk0x0 +1 ,两个都用过,再稍微补充一点内容:

- pyinstrument 需要埋点(植入代码),适合线下做 profile
- py-spy 可以对运行中的进程进行采样,适合线上。有个 top 命令可以实时展示当前忙碌的代码
zky001
2022-01-24 17:50:47 +08:00
dis+cProfile

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829743

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX