排查python内存泄露中几个工具的使用

排查python内存泄露中几个工具的使用,第1张

概述本文主要介绍3个工具:pdb,objgraph,以及pympler。 1.pdb pdb是专门用于python代码调试,模仿gdb。 使用pdb可以查看堆栈,打印变量等。 这里介绍的是命令行下的pdb。 命令行下使用pdb,代码侵入小,调试方便。 本例中,python安装在当前目录下.venv 使用pdb加载python程序 .venv/bin/python -m pdb orange.py>

本文主要介绍3个工具:pdb,objgraph,以及pympler。

1.pdb

pdb是专门用于python代码调试,模仿gdb。
使用pdb可以查看堆栈,打印变量等。

这里介绍的是命令行下的pdb。
命令行下使用pdb,代码侵入小,调试方便。

本例中,python安装在当前目录下.venv

使用pdb加载python程序

.venv/bin/python -m pdb  orange.py> /Users/lanyang/workspace/orange/orange.py(3)<module>()-> import inspect(Pdb)

启动程序

(Pdb)c

这样,python代码就开始执行了。

相关的命令有

bt 打印堆栈 q 退出 pp 打印变量 c(ont(inue)) 继续执行

更多命令可参考:

(Pdb) helpdocumented commands (type help <topic>):========================================EOF    c          d        h         List      q        rv       undisplaya      cl         deBUG    help      ll        quit     s        untalias  clear      disable  ignore    longList  r        source   untilargs   commands   display  interact  n         restart  step     upb      condition  down     j         next      return   tbreak   wbreak  cont       enable   jump      p         retval   u        whatisbt     continue   exit     l         pp        run      unalias  whereMiscellaneous help topics:==========================exec  pdb
objgraph

安装objgraph

pip install objgraph

查看最常用的类型

(Pdb) import objgraph(Pdb) objgraph.show_most_common_types(limit=20)function                   22750dict                       15520tuple                      12536weakref                    6679List                       5516type                       3449getset_descriptor          3408cell                       2566set                        2496ModuleSpec                 1588module                     1582SourcefileLoader           1502wrapper_descriptor         1332builtin_function_or_method 1241method_descriptor          1219property                   1171member_descriptor          822classmethod                697WeakSet                    571MovedAttribute             501

感觉这个函数没什么用。

查看增长最快的类型

(Pdb) objgraph.show_growth(limit=10)function             22749    +22749dict                 15515    +15515tuple                12332    +12332weakref               6680     +6680List                  5517     +5517type                  3449     +3449getset_descriptor     3408     +3408cell                  2565     +2565set                   2496     +2496ModuleSpec            1588     +1588

show_growth()打印两次调用之间增加的类型。如果这其中有自己定义的类型,很可能就是问题所在。如果都是python内置类型,可能要花费更多功夫了。

一般排查问题时,在程序开始执行时,调用show_growth(),程序跑一段时间后,再次调用show_growth(),查看哪些对象增长最快。

如果使用pdb在命令行下调试,ctrl+c停止程序的时候,注意观察上下文,保证跟上次import objgraph时一样,否则,会出现:

(Pdb) objgraph.show_growth(limit=10)*** nameError: name 'objgraph' is not defined(Pdb)

如果出现这个问题,可以继续让程序执行,再ctrl+c停止程序。

查看某个类型

(Pdb) objgraph.by_type('List')

这个可能会打印一堆。

pympler

使用objgraph时,虽然可以看到增长最快的对象,但是无法得知占用内存最多的是哪个。

下面我们就使用pympler,查看内存占用。

(Pdb) from pympler import tracker(Pdb) tr = tracker.SummaryTracker()(Pdb) tr.print_diff()                  types |   # objects |   total size======================= | =========== | ============           <class 'List |       12769 |      1.18 MB            <class 'str |       12769 |    950.47 KB            <class 'int |        2513 |     68.71 KB           <class 'code |           1 |    144     B  function (store_info) |           1 |    136     B           <class 'cell |           2 |     96     B          <class 'tuple |           1 |     64     B         <class 'method |          -1 |    -64     B           <class 'dict |           0 |   -128     B(Pdb) tr.print_diff()         types |   # objects |   total size============== | =========== | ============  <class 'List |           1 |     88     B   <class 'str |           1 |     70     B(Pdb) tr.print_diff()  types |   # objects |   total size======= | =========== | ============(Pdb)
参考

pdb

objgraph

pympler

Python内存泄露调试指导思想

使用gc、objgraph干掉python内存泄露与循环引用!

python 进程内存增长问题,解决方法和工具

总结

以上是内存溢出为你收集整理的排查python内存泄露中几个工具的使用全部内容,希望文章能够帮你解决排查python内存泄露中几个工具的使用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

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

原文地址: http://outofmemory.cn/langs/1191360.html

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

发表评论

登录后才能评论

评论列表(0条)

保存