jemalloc 内存分配管理

今天在安装mariaDB的时候发现编译一直提示一个错误/usr/bin/ld: cannot find -ljemalloc_pic

后来发现是因为没有用这个jemalloc 可能是mariaDB数据库默认就使用这种方式管理多线程内存分配

一、首先这个jemalloc是什么

jemalloc源于Jason Evans 2006年在BSDcan conference发表的论文:《A Scalable Concurrent malloc Implementation for FreeBSD》。
jason认为phkmalloc(FreeBSD’s previous malloc implementation by Kamp
(1998))没有考虑多处理器的情况,因此在多线程并发下性能低下(事实如此),而jemalloc适合多线程下内存分配管理。从2007年开始以
FreeBSD标准引进来。软件技术革新很多是FreeBSD发起,在FreeBSD应用广泛的技术会慢慢导入到Linux中。

Redis 2.4版本之后,默认使用jemalloc来做内存管理;tengine也整合jemalloc。jemalloc从各方评测的结果可见与google tcmalloc都不相伯仲,皆为内存管理器领域最高水平。如下图:


左边的就是glibc的malloc,最右边的就是jemalloc。从图表上可以看出,jemalloc的性能有glibc的两倍以上。非常压倒性的性
能差异。因此,使用了jemalloc的应用程序自然会快很多。Jemalloc旁边的就是tcmalloc。Tcmalloc的性能与其相差甚微,低
jemalloc2.1.0慢4.5%。图上和tcmalloc的1.4版本,而现在已经到2.1版本,因此实际上这两者应该是不相仲伯的。
Jemalloc的创始人jason evans也意识到这一点,说在cpu core 8以上的计算机上jemalloc效率更高

二、使用

安装jemalloc

cd lnmp/src
wget http://www.canonware.com/download/jemalloc/jemalloc-3.4.0.tar.bz2
tar xjf jemalloc-3.4.0.tar.bz2
cd jemalloc-3.4.0./configure
make && make install
echo ‘/usr/local/lib‘ > /etc/ld.so.conf.d/local.conf
ldconfig

使用jemalloc优化MySQL
MySQL/MaridDB 5.5编译方法,cmake预编译时加上下面参数

-DCMAKE_EXE_LINKER_FLAGS="-ljemalloc" -DWITH_SAFEMALLOC=OFF

或者直接加载,修改mysqld_safe

sed -i ‘[email protected] [email protected] mysqld_safe\nexport LD_PRELOAD=/usr/local/lib/[email protected]‘ /usr/local/mysql/bin/mysqld_safe
service mysqld restart

三、验证是否生效

lsof -n | grep jemalloc
时间: 2024-11-06 19:18:21

jemalloc 内存分配管理的相关文章

dlmalloc和jemalloc内存分配流程总结

dlmalloc和jemalloc内存分配流程总结 下图是dlmalloc的实现流程图,请仔细阅读,内含一些设计的思考. 更具体的总结,欢迎查看:链接: https://pan.baidu.com/s/1N7eoibYGNEqc9Uf67f0kOg 提取码: 6cz2 另外关于jemalloc的原理分析和思想,欢迎查看:链接: https://pan.baidu.com/s/10eD1dHW5tu-Yrq-k0Zap5w 提取码: 31jm 另外我的相关培训视频请看:欢迎观看我发布的各个课程:

redis内存分配管理

1.Redis的内存管理 1.与memcache不同,没有实现自己的内存池 2.在2.4.4以前,默认使用标准的内存分配函数(libc),可以选择tcmalloc 3.在2.4.4以后,jemalloc成为代码一部分 2.从实验的各个角度出发,发现对于大量数据的内存管理,使用jemolloc效果比较好,而对于少量数据,使用libc即可. 原文地址:https://www.cnblogs.com/ywjfx/p/10263120.html

C/C++语言学习——内存分配管理

1.一个由C编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放. 2.堆区(heap) — 在内存开辟另一块存储区域.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 3.全局区(静态区)(static)—编译器编译时即分配内存.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态

spark的内存分配管理

SPARK的内存管理器 StaticMemoryManager,UnifiedMemoryManager 1.6以后默认是UnifiedMemoryManager. 这个内存管理器在sparkContext中通过SparnEnv.create函数来创建SparkEnv的实例时,会生成. 通过spark.memory.useLegacyMode配置,能够控制选择的内存管理器实例. 假设设置为true时,选择的实例为StaticMemoryManager实例,否则选择UnifiedMemoryMan

Yarn 内存分配管理机制及相关参数配置

理解Yarn的内存管理与分配机制,对于我们搭建.部署集群,开发维护应用都是尤为重要的,对于这方面我做了一些调研供大家参考. 一.相关配置情况 关于Yarn内存分配与管理,主要涉及到了ResourceManage.ApplicationMatser.NodeManager这几个概念,相关的优化也要紧紧围绕着这几方面来开展.这里还有一个Container的概念,现在可以先把它理解为运行map/reduce task的容器,后面有详细介绍. 1.1  RM的内存资源配置, 配置的是资源调度相关 RM1

内存分配管理

伟大的Bill Gates 曾经说过: 640K ought to be enough for everybody — Bill Gates 1981 程序员们经常编写内存管理程序,往往提心吊胆.如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的.本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理. 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量

linux内核内存分配(三、虚拟内存管理)

在分析虚拟内存管理前要先看下linux内核内存的详细分配我开始就是困在这个地方,对内核内存的分类不是很清晰.我摘录其中的一段: 内核内存地址 =========================================================================================================== 在linux的内存管理中,用户使用0-3GB的地址空间,而内核只是用了3GB-4GB区间的地址空间,共1GB:非连 续空间的物理映射就位于3G

垃圾回收GC:.Net自动内存管理 上(一)内存分配

垃圾回收GC:.Net自动内存管理 上(一)内存分配 前言 .Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态.然而,你或许想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述.同时,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 引子 为你的应用程序实现合理的资源管理是一件困难的,乏味的工作.这可能会把你的注意力从你当前正在解决的实际问题中转移到它身上.那么,如果有一个现有的机制为开发者管理令人厌恶的内存管理,会

Cocos2d-x 3.x:如何进行合理的内存分配(使用AutoreleasePool 来合理的管理内存)

Cocos2d-x 3.x:如何进行合理的内存分配(使用AutoreleasePool 来合理的管理内存) 本文转载至深入理解Cocos2d-x 3.x:如何进行合理的内存分配 设想如下场景,这是一个典型的内存合理分配的场景:在一帧内,有若干个函数,每个函数都会创建一系列的精灵,每个精灵都不同,都会占用一定的内存,精灵的总数可能会有1000个,而一个函数只会创建10个精灵这样,创建的精灵只会在这个函数中使用,大致代码如下: 1 2 3 4 5 for(int i = 0; i < 10; i++