python 内存泄漏的排查

python 内存泄漏的排查,第1张

python 内存泄漏的排查 python 内存泄漏的排查
  1. 判断该次上线或发版的内容,排查到具体上线了那些接口或修改了那些接口

  2. 单起一个服务,使用ps -aux |grep pid 查看该进程占用的内存大小

    work@xxx:~$ ps -aux |grep 7197
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    work      7197  2.0  0.9 327900 76296 pts/3    S+   17:56   0:00 project_name
    work      7460  0.0  0.0 103324   908 pts/4    S+   17:56   0:00 grep 7197
    

    展示的信息:

    ​ 7197 进程ID

    ​ 2.0 cpu 占用百分比

    ​ 0.9 内存占用百分比

    ​ 327900 虚拟内存大小 kb

    ​ 76296 真实占用内存大小 kb

    work@ktv-web2:~$ cat /proc/7197/status
    Name:   python
    State:  S (sleeping)
    Tgid:   7197
    Pid:    7197
    PPid:   6709
    TracerPid:      0
    Uid:    504     504     504     504
    Gid:    504     504     504     504
    Utrace: 0
    FDSize: 256
    Groups: 504 
    VmPeak:   327904 kB
    VmSize:   327900 kB
    VmLck:         0 kB
    VmHWM:     76296 kB
    VmRSS:     76296 kB
    Vmdata:    69172 kB
    VmStk:       124 kB
    VmExe:      2260 kB
    VmLib:     10760 kB
    VmPTE:       468 kB
    VmSwap:        0 kB
    Threads:        1
    SigQ:   0/62295
    SigPnd: 0000000000000000
    ShdPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000001001000
    SigCgt: 0000000180000002
    CapInh: 0000000000000000
    CapPrm: 0000000000000000
    CapEff: 0000000000000000
    CapBnd: ffffffffffffffff
    Cpus_allowed:   f
    Cpus_allowed_list:      0-3
    Mems_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
    Mems_allowed_list:      0
    voluntary_ctxt_switches:        18
    nonvoluntary_ctxt_switches:     8
    

    VmRSS为进程所占用的内存

  3. 一个一个接口的排查,或者觉得可能是那个程序导致的内存泄漏,先去排查该接口,

    请求该接口,看一下内存占用是否增多,请求之后内存是否减少,多次请求重复实验

  4. 排查到接口之后再找是那些代码导致的内存增加,把可能会导致内存增加的代码注释掉

    看是否还增加

  5. 再排查是对象没有被释放掉,还是循环引用,还是第三方库的原因等等

第二种方式

使用tracemalloc 查看当前程序占用内存最大的代码行号

from aiohttp import web
import tracemalloc


async def get(request):
    tracemalloc.start()
    snapshot1 = tracemalloc.take_snapshot()
    # 代码块
    snapshot2 = tracemalloc.take_snapshot()
    top_stats = snapshot2.compare_to(snapshot1, 'lineno')
    print(top_stats)
    return web.Response(text="ok")
,)> size=116500672 (+116500672) count=300004 (+300004)>,


,)> size=11400000 (+11400000) count=200000 (+200000)>,


,)> size=8000000 (+8000000) count=100000 (+100000)>,

,)> size=5500000 (+5500000) count=100000 (+100000)>,


,)> size=5300608 (+5300608) count=100001 (+100001)>,

直接定位到哪个文件的哪行代码占用内存比较多

再去排查问题。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5690029.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存