排查python内存泄露中几个工具的使用
本文主要介绍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.参考
使用gc、objgraph干掉python内存泄露与循环引用!
排查python内存泄露中几个工具的使用的更多相关文章
- 关于排查python内存泄露的简单总结
这次的内存泄露问题是发生在多线程场景下的. 各种工具都试过了,gc,objgraph, pdb,pympler等,仍然没有找到问题所在. pdb感觉用起来很方便,可以调试代码,对原来的代码无侵入性. ...
- python内存泄露memory leak排查记录
问题描述 A服务,是一个检测MGR集群主节点是否发生变化的服务,使用python语言实现的. 针对每个集群,主线程会创建一个子线程,并由子线程去检测.子线程会频繁的创建和销毁. 上线以后,由于经常会有 ...
- python 内存泄露的诊断 - 独立思考 - ITeye技术网站
python 内存泄露的诊断 - 独立思考 - ITeye技术网站 python 内存泄露的诊断 博客分类: 编程语言: Python Python多线程Blog.net 对于一个用 python ...
- 记一次调试python内存泄露的问题
转载:http://www.jianshu.com/p/2d06a1a01cc3 这两天由于公司需要, 自己编写了一个用于接收dicom文件(医学图像文件)的server. 经过各种coding-de ...
- 使用gc、objgraph干掉python内存泄露与循环引用!
Python使用引用计数和垃圾回收来做内存管理,前面也写过一遍文章<Python内存优化>,介绍了在python中,如何profile内存使用情况,并做出相应的优化.本文介绍两个更致命的问 ...
- python内存泄露的诊断(转)
本篇文章非原创,转载自:http://rstevens.iteye.com/blog/828565 . 对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了 ...
- python 内存泄露的诊断
对于一个用 python 实现的,长期运行的后台服务进程来说,如果内存持续增长,那么很可能是有了"内存泄露" 一.内存泄露的原因 对于 python 这种支持垃圾回收的语言来说,怎 ...
- python内存泄露查找
1 前言: 1.1 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题 1.2 在Python程序里,内存泄漏是由于一个长期持有的对象不断的往一个dict或者l ...
- python内存泄露诊断过程记录pyrasite
工具:pyrasite;包含三个命令行 pyrasite / pyrasite-shell / pyrasite-memory-viewer 安装:gdb meliae urwid 说明:Pyrasi ...
随机推荐
- Delphi10.2.3利用THttpClient实现http异步下载
随着Delphi 10.2.3的发布,随之带来更稳定.更完善的版本.今天借官方的例子,解读一下如何实现Http异步下载并显示下载进度. 使用的核心组件是THttpClient,首先建立一个THttpC ...
- Beta冲刺——星期三
这个作业属于哪个课程 <课程的链接> 这个作业要求在哪里 <作业要求的链接> 团队名称 飞猪们 这个作业的目标 剩余任务预估,分配任务(开发,测试等).按要求提交当天冲刺报告. ...
- System.nanoTime与System.currentTimeMillis
System.nanoTime提供相对精确的计时,但是不能用他来计算当前日期.(系统计时器的当前值,以毫微秒为单位) System.currentTimeMillis返回的是从1970.1.1 UTC ...
- Apache代理技术
Apache代理技术 apache代理分为正向代理和反向代理. 正向代理是一个位于客户端和原始服务器之间的服务器, 客户端通过代理服务器访问外部的 web, 需要在客户端的浏览器中设置代理服务器. 反 ...
- 【模板】多标记 LCT
代码如下 #include <bits/stdc++.h> using namespace std; typedef long long LL; const int mod = 51061 ...
- Android WebView js混合cookie和localStorage存储
一.cookie存储和取出: (1)存储: ------------------- **在loadURL之前调用** -------------------- /** * 同步一下cookie */ ...
- 内置对象-Math
1.随机数 Math.random() 1)获得0-1之间的随机数 2)0到100:Math.round(Math.random()*100) 2.max:求最大值 ,,,) console.log( ...
- ACID理解
数据库事物的4个特性. A原子性:多次操作要么全部成功,要么全部失败.undo日志是在事务执行失败的时候撤销对数据库的操作,保证了事务的原子性(Atomicity) C一致性:一致性这个最不好理解.数 ...
- js特效 15个小demo
js特效和15个小demo 代码如下:images文件夹未上传 1.图片切换: <!DOCTYPE html> <html> <head> <title> ...
- 浅谈Spring @Order注解的使用(转)
注解@Order或者接口Ordered的作用是定义Spring IOC容器中Bean的执行顺序的优先级,而不是定义Bean的加载顺序,Bean的加载顺序不受@Order或Ordered接口的影响: 1 ...