jemalloc初体验

  |   0 评论   |   0 浏览

背景

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)

生成过程中依赖了 dotps2pdf两个命令,在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方法内存运行情况。

参考