jemalloc初体验
背景
jemalloc是一个内存分配 malloc 的实现,优点在于碎片管理和扩展性、并发性上。
一些常见的软件中已经使用了jemalloc,如:
- FreeBSD
- NetBSD
- Mozilla Firefox
- Cassandra
- Redis
- hhvm
- MariaDB
- Android
本文体验一下使用jemalloc来检测内存泄露,以及分析内存问题。
安装
$ wget https://github.com/jemalloc/jemalloc/archive/5.2.0.tar.gz
$ tar xf 5.2.0.tar.gz
$ cd jemalloc-5.2.0/
$sh autogen.sh --enable-prof
这里要确认开启了 prof 选项,结果如下:
prof : 1
接着
$ make
需要保留的文件为:
* ./lib/libjemalloc.so
* ./bin/jeprof
内存泄露分析
内存泄露分析,即检测程序退出时的内存分配状态。
准备活动
对于程序本身,可以不进行修改。
启动程序
sh run.sh
export MALLOC_CONF="prof_leak:true,lg_prof_sample:0,prof_final:true"
export LD_PRELOAD="/path/to/jemalloc-5.2.0/lib/libjemalloc.so"
./multi_demo
其中 LD_PRELOAD
中需要指向libjemalloc.so
文件,multi_demo
是本示例中被测试的程序。
查看结果
<jemalloc>: Leak approximation summary: ~217504 bytes, ~1242 objects, >= 1239 contexts
<jemalloc>: Run jeprof on "jeprof.32477.0.f.heap" for leak detail
泄露的详细信息
使用 jeprof
工具,可以查看 jeprof.32477.0.f.heap
文件。
示例如下:
$~/bin/jeprof multi_demo jeprof.32477.0.f.heap
Using local file multi_demo.
Using local file jeprof.32477.0.f.heap.
Welcome to jeprof! For help, type 'help'.
(jeprof) top
Total: 0.2 MB
…………
0.1 24.1% 77.3% 0.1 24.1% __new_exitfn
…………
0.0 0.0% 100.0% 0.0 0.0% __gnu_cxx::new_allocator::allocate (inline)
…………
泄露代码的调用路径
使用 jeprof
工具,可以生成heap文件的调用路径pdf图。
~/bin/jeprof --show_bytes --pdf multi_demo jeprof.32477.0.f.heap > 32477.0.pdf
Using local file multi_demo.
Using local file jeprof.32477.0.f.heap.
Dropping nodes with <= 1087 B; edges with <= 217 abs(B)
生成过程中依赖了 dot
和ps2pdf
两个命令,在CentOS下需要自己手动安装下包:
yum install ghostscript graphviz
内存运行时分析
更多的情况下,内存是在运行过程中缓慢增长的,并且不是内存泄露,而只是运行过程中没有及时的释放。
这种情况下,就希望可以在程序不退出的情况下,也可以不停的输出内存分配情况。
每128MB输出一次
如下所示,其中 lg_prof_interval = 2^27,即128MB。
export MALLOC_CONF="prof:true,lg_prof_interval:27"
export LD_PRELOAD="/path/to/jemalloc-5.2.0/lib/libjemalloc.so"
./multi_demo
这时,会发现磁盘中会不断的出来文件,如
* jeprof.39496.0.i0.heap
* jeprof.39496.1.i1.heap
直接看结果
可以直接用上面的方法来看结果。
基于base看结果
也可以看在两个heap文件之间,有哪些新的内存分配,如:
$~/bin/jeprof multi_demo --base=jeprof.39496.0.i0.heap jeprof.39496.1.i1.heap
Using local file multi_demo.
Using local file jeprof.39496.1.i1.heap.
Welcome to jeprof! For help, type 'help'.
(jeprof) top
Total: 0.0 MB
好吧,这个例子中没有结果。。
其它
- 这个方法也适合于分析Java应用中的native方法内存运行情况。