本文主要介绍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) help

Documented commands (type help <topic>):
========================================
EOF c d h list q rv undisplay
a cl debug help ll quit s unt
alias clear disable ignore longlist r source until
args commands display interact n restart step up
b condition down j next return tbreak w
break cont enable jump p retval u whatis
bt continue exit l pp run unalias where Miscellaneous help topics:
==========================
exec pdb

2.objgraph

安装objgraph

pip install objgraph

查看最常用的类型

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

感觉这个函数没什么用。

查看增长最快的类型

(Pdb) objgraph.show_growth(limit=10)
function 22749 +22749
dict 15515 +15515
tuple 12332 +12332
weakref 6680 +6680
list 5517 +5517
type 3449 +3449
getset_descriptor 3408 +3408
cell 2565 +2565
set 2496 +2496
ModuleSpec 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')

这个可能会打印一堆。

3.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)

tracker对象初始化的时候会创建一个summary,每次调用tracker.print_diff()的时候又会创建一个summary,当前的summary与上次的summary做比较,并打印两者之间的不同。

4.参考

pdb

objgraph

pympler

pympler muppy

Python内存泄露调试指导思想

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

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

排查python内存泄露中几个工具的使用的更多相关文章

  1. 关于排查python内存泄露的简单总结

    这次的内存泄露问题是发生在多线程场景下的. 各种工具都试过了,gc,objgraph, pdb,pympler等,仍然没有找到问题所在. pdb感觉用起来很方便,可以调试代码,对原来的代码无侵入性. ...

  2. python内存泄露memory leak排查记录

    问题描述 A服务,是一个检测MGR集群主节点是否发生变化的服务,使用python语言实现的. 针对每个集群,主线程会创建一个子线程,并由子线程去检测.子线程会频繁的创建和销毁. 上线以后,由于经常会有 ...

  3. python 内存泄露的诊断 - 独立思考 - ITeye技术网站

    python 内存泄露的诊断 - 独立思考 - ITeye技术网站 python 内存泄露的诊断 博客分类: 编程语言: Python Python多线程Blog.net  对于一个用 python ...

  4. 记一次调试python内存泄露的问题

    转载:http://www.jianshu.com/p/2d06a1a01cc3 这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-de ...

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

    Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...

  6. python内存泄露的诊断(转)

    本篇文章非原创,转载自:http://rstevens.iteye.com/blog/828565 . 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了 ...

  7. python 内存泄露的诊断

    对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了"内存泄露" 一.内存泄露的原因 对于 python 这种支持垃圾回收的语言来说,怎 ...

  8. python内存泄露查找

    1 前言: 1.1 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题 1.2 在Python程序里,内存泄漏是由于一个长期持有的对象不断的往一个dict或者l ...

  9. python内存泄露诊断过程记录pyrasite

    工具:pyrasite;包含三个命令行 pyrasite / pyrasite-shell / pyrasite-memory-viewer 安装:gdb meliae urwid 说明:Pyrasi ...

随机推荐

  1. JavaWeb【过滤器】

    定义: 服务器端组件,可以截取用户端的请求和响应,并对这些信息做过滤. 课程概要: 1.工作原理 2.生命周期 1.web.xml配置 注意:url-pattern配置路径前面需要加"/&q ...

  2. LNMP安装与配置之MySQL

    MySQL 是最流行的关系型数据库管理系统之一,今天的安装是在CentOS7环境下进行安装,安装的版本是MySQL5.7,有需要别的版本可点击  官网. 一.安装 1.配置YUM源 # 下载mysql ...

  3. cubase 反向音频处理

  4. Python中关于csv的简单操作

    Python中关于csv的简单操作 CSV操作简单,直接import csv即可, 主要使用reader和pandas 1 reader的简单使用 csv.reader("1.csv&quo ...

  5. 数据库允许空值(null),往往是悲剧的开始(1分钟系列)

    数据库字段允许空值,会遇到一些问题,此处包含的一些知识点,和大家聊一聊. 数据准备: create table user ( id int, name varchar(20), index(id) ) ...

  6. 逻辑卷管理(LVM)

    LVM:Logical Volume Management 逻辑卷管理 LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性. 传统磁盘管理:我们上层是直接访问文件系统,从而对底层的物 ...

  7. 给零基础的小白从0到1的react-naitve电商app——简单易学!

    先上链接https://github.com/duf1991/DY...我的第一个react-native学习成果,欢迎各位大佬star和issue!

  8. Winforms界面开发DevExpress v19.2:Map、Pivot Grid等功能增强

    DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpr ...

  9. 记录微信小程序里自带 时间格式 工具

    微信小程序里面自己给了一个时间工具,是用来记录log日志,感觉可以记录下来,所以拿来自己用,以此记录: 直接传入 日期对象 进入 formatTime //得到下面格式的时间格式2017/07/22 ...

  10. vue基本知识点概括

    目录 Vue 渐进式 JavaScript 框架 一.走进Vue 1.what -- 什么是Vue 2.why -- 为什么要学习Vue 3.special -- 特点 4.how -- 如何使用Vu ...