用jemalloc优化nginx、mysql内存管理

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/241.html