jemalloc是一个内存分配器,最开始出现在FreeBSD上的libc中,FreeBSD最早使用phkmalloc,但它不是在多处理器系统且支持多线程的情况下设计的,为了解决多处理器系统和多线程应用程序的可扩展性瓶颈,由此诞生jemalloc,它是Jason Evans 2005年进行开发的,因此叫"je"。在2007年的时候为了改善Firefox在3.0版中的内存使用情况,使用jemalloc解决了在Windows平台上的碎片问题,同时也给jemalloc带来了许多通用的增强功能。
jemalloc在多处理器和多线程系统中具有很强的可扩展的并发支持,部分是通过使用多个arenas 来实现(从中进行分配原始内存块),并且以循环方式将线程分配给arenas。这意味着可以减少锁竞争,因为尽管多个线程可以并发调用malloc或free,但只有在它们共享相同的arenas时才会竞争。jemalloc强调避免碎片,它会尝试连续分配内存并且最大程度地减少内存使用总量。
由于CPU缓存,RAM和虚拟内存分页的影响,内存布局可能会对应用程序其余部分的运行速度产生重大影响。
接下来我们看看如果使用,首先下载jemalloc
wget -c http://www.canonware.com/download/jemalloc/jemalloc-4.2.1.tar.bz2 tar jxvf jemalloc-4.2.1.tar.bz2 cd jemalloc-4.2.1 ./configure make make install echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf ldconfig
MySQL/MaridDB 5.5编译方法,cmake预编译时加上下面参数
-DCMAKE_EXE_LINKER_FLAGS="-ljemalloc" -DWITH_SAFEMALLOC=OFF
或者直接加载,修改mysqld_safe
sed -i 's@executing mysqld_safe@executing mysqld_safe\nexport LD_PRELOAD=/usr/local/lib/libjemalloc.so@' /usr/local/mysql/bin/mysqld_safe service mysqld restart
使用jemalloc优化Nginx
cd lnmp/src/nginx-1.4.2 make clean ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-ld-opt="-ljemalloc" make make install
验证jemalloc优化Nginx是否生效,如下
lsof -n | grep jemalloc