现在的位置: 首页 > 综合 > 正文

jemalloc: another option

2013年03月01日 ⁄ 综合 ⁄ 共 1483字 ⁄ 字号 评论关闭

1. 概述
jemalloc起源于Jason Evans 2006年在BSDcan conference发表的论文:A Scalable Concurrent malloc Implementation for FreeBSD
jason认为phkmalloc(FreeBSD’s previous malloc implementation by Kamp (1998))没有考虑多处理器的情况,因此在多线程并发下性能低下(事实如此),而jemalloc适合多线程下内存分配管理。

2. jason在多处理器下的一个实验


x轴是线程数,y轴是性能。
在单线程下,彼此相差不多,dlmalloc(Doug Lea’s malloc, been around forever)稍占优势。
在多线程下,dlmalloc和pkgmalloc性能急剧下降,而jemalloc在线程数和处理器数一致的时候,性能达到最高,线程数继续增加能保持稳定。

3. 原理
arena+TLS
arena即小块内存,指将大内存划分成多个小内存来管理
TLS(Thread-local storage),即线程局部缓存
回过头来看看tcmalloc,惊人的一致。
经过测试,tcmalloc和jemalloc在实际应用中不相伯仲,一个比较早的测试结果:

valgrind检测不出tcmalloc和jemalloc的内存泄露,但是tcmalloc有gprof可以使用,还不清楚jemalloc有没有什么可用的检测工具

4. 安装使用(jemalloc当前版本2.2.5)
安装:
wget http://www.canonware.com/download/jemalloc/jemalloc-2.2.5.tar.bz2 .
tar -jxvf jemalloc-2.2.5.tar.bz2
cd jemalloc-2.2.5/ && ./configure && make && make install
ldconfig
使用:链接即可使用
写一个简单的测试程序client.cpp
g++ -o client client.cpp -ljemalloc

使用ldd查看程序所需的共享库
$ ldd client
    linux-gate.so.1 =>  (0x00e18000)
    libjemalloc.so.1 => /usr/local/lib/libjemalloc.so.1 (0x00110000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00322000)
    libm.so.6 => /lib/libm.so.6 (0x0012d000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x002ed000)
    libc.so.6 => /lib/libc.so.6 (0x00153000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x0080f000)
    libdl.so.2 => /lib/libdl.so.2 (0x0069e000)
    /lib/ld-linux.so.2 (0x008ab000)

以上方式是使用动态库,不推荐,更好地方式是使用静态库libjemalloc.a*

5. 其它
还有宣称比tcmalloc和jemalloc更快的内存管理库,eg:nedmalloc,有时间了再做了解~

references:
paper:A Scalable Concurrent malloc Implementation for FreeBSD
www.canonware.com/jemalloc/index.html

抱歉!评论已关闭.