类linux平台上,用于替代默认的glibc库来管理内存分配的软件很多。其中比较出色的有google 的Tcmalloc ,该软件在mysql和nginx的安装中经常被提到。可以在编译时用指向该lib库,用于替代默认的glibc内存管理。今天在一台测试机上安装tengine时,偶然发现其配置参数里多了一个jemalloc检测项。网上查了下,发现是同Tcmalloc类似的内存管理工具。不过其性能要优于Tcmalloc 。

1、jemalloc安装及与tengine的整合

jemalloc目前的最新版是3.3 ,可以通过面的方式进行编译与下载安装:

1wget http://www.canonware.com/download/jemalloc/jemalloc-3.3.0.tar.bz2
2tar jxvf jemalloc-3.3.0.tar.bz2
3/usr/local/src/jemalloc-3.3.0
4./configure
5make && make install

这样就完成了安装,其默认程序的安装目录结构如下:

1XSLTPROC           : /usr/bin/xsltproc
2PREFIX             : /usr/local
3BINDIR             : /usr/local/bin
4INCLUDEDIR         : /usr/local/include
5LIBDIR             : /usr/local/lib
6DATADIR            : /usr/local/share
7MANDIR             : /usr/local/share/man

在这种情况下,tengine是无法直接检测到jemalloc的 。此可以可以通过将该lib库的路径导入ld文件并重新运行的方法实现,有点类似于tcmalloc的安装。操作如下:

1echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
2/sbin/ldconfig

不过上面的方法我并没有测试,我用的是类似于nginx编译时加载pcre包时的方法,通过–with-jemalloc 参数,指定其源文件路径的方法。具体是在tengine编译时,通过如下配置编译:

1./configure --prefix=/App/nginx --with-jemalloc=/usr/local/src/jemalloc-3.3.0

注:tengine官方给出的编译方法是后面这种通过指向源代码路径的方式。

2、性能测试

关于jemalloc的性能,我并没有进行测试,但网上早有人对其性能进行过测试。有兴趣的可以看下如下两个链接。

http://locklessinc.com/benchmarks_allocator.shtml

http://blog.csdn.net/yfkiss/article/details/7035579

从上面两个链接上看,jemalloc的性能确实要比tcmalloc和glibc性能要好。

3、 横向总结

jemalloc之前主要被firefox所使用,后来facebook也在其自己的应用上使用了jemalloc 。所以,在tengine的版本中之所以加了对jemalloc的支持,应该很大程序上是受了facebook的影响。除了jemalloc之外,还有几个同类产品,据说功能也不错。现列举出来,有兴趣者可以做一个横向对比。

1TLSF  Two-Level Segregate Fit, mainly on RTOS
2jemalloc  Jason Evans's malloc, used by firefox
3dlmalloc  Doug Lea’s malloc, been around forever
4ptmalloc2  Doug Lea’s malloc, extended to support per-thread arenas. Default allocator for glibc2.3
5TCMalloc  Google’s malloc, claims to be 6x faster than ptmalloc2
6nedmalloc  claims to be faster than tcmalloc
7Hoard  also claims to be very fast