Python 程序如何定位到 cpu 占用过高的代码呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
IurNusRay
0.54D
V2EX    Python

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

  •  
  •   IurNusRay 2022-01-21 16:20:00 +08:00 5220 次点击
    这是一个创建于 1371 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    - pyinstrument 需要埋点(植入代码),适合线下做 profile
    - py-spy 可以对运行中的进程进行采样,适合线上。有个 top 命令可以实时展示当前忙碌的代码
    zky001
        16
    zky001  
       2022-01-24 17:50:47 +08:00
    dis+cProfile
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3875 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 10:15 PVG 18:15 LAX 03:15 JFK 06:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86