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
V2EX  ›  Python

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

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

    假如有一个 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  
       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   ·   实用小工具   ·   3385 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:14 · PVG 19:14 · LAX 03:14 · JFK 06:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.