由于FaceBook而火起来的Jemalloc广为人之,但殊不知,它在malloc界里面很早就出名了。Jemalloc的创始人 Jason Evans 也是在FreeBSD很有名的开发人员。此人就在2006年为提高低性能的malloc而写的Jemalloc。Jemalloc是从2007年开始以FreeBSD标准引进来的。软件技术革新很多是FreeBSD发起的。在FreeBSD应用广泛的技术会慢慢导入到linux。
Redis 2.4版本之后,默认使用Jemalloc来做内存管理;Tengine也整合Jemalloc。Jemalloc从各方评测的结果可见与google tcmalloc都不相伯仲,皆为内存管理器领域最高水平。如下图:
最左边的就是glibc的malloc,最右边的就是Jemalloc。从图表上可以看出,Jemalloc的性能有glibc的两倍以上。非常压倒性的性能差异。因此,使用了Jemalloc的应用程序自然会快很多。Jemalloc旁边的就是tcmalloc。Tcmalloc的性能与其相差甚微,低Jemalloc 2.1.0慢4.5%。图上和tcmalloc的1.4版本,而现在已经到2.1版本,因此实际上这两者应该是不相仲伯的。Jemalloc的创始人 jason evans 也意识到这一点,说在cpu core 8以上的计算机上Jemalloc效率更高。
LNMP一键安装包里面已经集成了Jemalloc,在首次安装LNMP的时候就会提示是否安装和使用内存优化管理程序的。
如果安装LNMP时没有安装Jemalloc的话,可以使用LNMP的扩展安装脚本来安装,如下:
./addons.sh jemalloc
Redis默认就是使用Jemalloc的
如果安装Redis的时候,LNMP环境没有集成Jemalloc的话,可以在安装完Jemalloc后重新安装、编译一下Redis即可自动重新编译加入Jemalloc的支持了,如下命令:
./addons.sh redis
使用Jemalloc优化MySQL
通过命令行修改mysqld_safe来让当前的MySQL来支持Jemalloc,如下命令:
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
LNMP下安装Jemalloc后,只需要重新编译一下Nginx即可,命令如下:
cd lnmp1.6
./upgrade.sh nginx
验证是否生效并工作
用如下命令查看(需装请losf,yum install losf -y 即可):
lsof -n | grep jemalloc
程序运行示例图
(类似即表明Jemalloc已经生效了):
nginx 5398 root mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
nginx 5401 newblog mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 6200 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 6245 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 6254 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 6584 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 6762 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 6773 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2
mysqld 6199 6774 mysql mem REG 8,1 2796824 152140 /usr/local/lib/libjemalloc.so.2