php Allocator Jemalloc TCMalloc那个内存分配器比较好?

php一键安装脚本可以选择是否安装内存优化

You have 3 options for your Memory Allocator install.
1: Don't install Memory Allocator. (Default)
2: Install Jemalloc
3: Install TCMalloc

----------------------------------------

ptmalloc 是glibc的内存分配管理

tcmalloc 是google的内存分配管理模块

jemalloc 是BSD的提供的内存分配管理

三者的性能对比参考从网上的一个图如下:

测试代码如下:

   1: #include <iostream>                                                                                                      
   2: #include <map>
   3:  
   4: using namespace std;
   5: int main(int argc, char**argv) {
   6:   cout << "Hello world" << endl;
   7:   std::map<int,int> int_map;
   8:   for (int i = 0; i < 10000000; ++i) {
   9:     int_map.insert(std::map<int,int>::value_type(i,i));
  10:   }
  11:   return 0;
  12: }

都是执行一个map insert 100W次操作。

为了测试方便,我们生成了3个binary,分别链接使用jemalloc和tcmalloc 和ptmalloc的库做对比:

ldd jemalloc_test 
    linux-vdso.so.1 =>  (0x00007fffc6fc3000) 
    libjemalloc.so.1 => /usr/local/lib/libjemalloc.so.1 (0x00007f45181aa000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f4517ea4000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4517c1e000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f4517a08000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4517673000) 
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f4517454000) 
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4517250000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f45183f2000)

ldd tcmalloc_test 
    linux-vdso.so.1 =>  (0x00007fff94160000) 
    libtcmalloc.so.0 => /usr/lib/libtcmalloc.so.0 (0x00007f20107dc000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f20104d6000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2010250000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f201003a000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f200fca5000) 
    libunwind.so.7 => /usr/lib/libunwind.so.7 (0x00007f200fa8b000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f2010a68000)

ldd ptmalloc_test 
    linux-vdso.so.1 =>  (0x00007fff08501000) 
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f7e6c156000) 
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7e6bed1000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7e6bcba000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7e6b925000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007f7e6c483000)

然后分别执行各程序,使用time统计时间如下:

time./jemalloc_test 
Hello world

real    0m9.927s 
user    0m9.650s 
sys    0m0.250s

time ./tcmalloc_test 
Hello world

real    0m9.836s 
user    0m9.410s 
sys    0m0.410s

time ./ptmalloc_test 
Hello world

real    0m11.890s 
user    0m11.520s 
sys    0m0.360s

jemalloc和tcmalloc的性能不分伯仲,而ptmalloc则要低一些。

===========================

lnmp中的内存管理库TCMalloc和Jemalloc比较
lnmp一键安装包安装系统的时候一般用Jemalloc

TCMalloc
优点:很多系统都可以用源来安装 TCMalloc ,而且支持的 gcc 编译库比较新。
缺点:软件是在 Google Perftools 下的,安装的时候如果不编译好可能会安装到我们不需要的其他软件,而且 Google Perftools 安装过程比较复杂还需要安装相应的库。

Jemalloc
优点:目前是 Maridab 、Tengine、Redis 中默认推荐的内存优化工具,所以使用 Jemalloc 对这些程序的兼容度还是比较高的。而且经过测试高负载情况下 Jemalloc 更加优秀。安装过程方便,不用安装额外的库。
缺点:对使用最新的gcc编译不友好。
---------------------

Redis在编译时,会先判断是否使用tcmalloc,如果是,会用tcmalloc对应的函数替换掉标准的libc中的函数实现。其次会判断jemalloc是否使得,最后如果都没有使用才会用标准的libc中的内存管理函数。而在最新的Redis2.4.4版本中,jemalloc已经作为源码包的一部分包含在源码包中,所以可以直接被使用。而如果你要使用tcmalloc的话,是需要自己安装的。

php Allocator Jemalloc TCMalloc那个内存分配器比较好?的更多相关文章

  1. 内存分配器 (Memory Allocator)

    对于大多数开发人员而言,系统的内存分配就是一个黑盒子,就是几个API的调用.有你就给我,没有我就想别的办法. 来UC前,我就是这样觉得的.实际深入进去时,才发现这个领域里也是百家争鸣.非常热闹.有操作 ...

  2. 14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器

    14.4.4 Configuring the Memory Allocator for InnoDB InnoDB 配置内存分配器 当InnoDB 被开发, 内分配齐 提供了与操作系统和运行库往往缺乏 ...

  3. 14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器

    14.6.4 Configuring the Memory Allocator for InnoDB 配置InnoDB 内存分配器 当InnoDB 被开发时,内存分配提供了操作系统和 run-time ...

  4. 从零开始写STL-内存部分-内存分配器allocator

    从零开始写STL-内存部分-内存分配器allocator 内存分配器是什么? 一般而言,c++的内存分配和释放是这样操作的 >>class Foo{ //...}; >>Foo ...

  5. jemalloc内存分配器详解

    前言 C 中动态内存分配malloc 函数的背后实现有诸派:dlmalloc 之于 bionic:ptmalloc 之于 glibc:allocation zones 之于 mac os x/ios: ...

  6. Nah Lock: 一个无锁的内存分配器

    概述 我实现了两个完全无锁的内存分配器:_nalloc 和 nalloc.  我用benchmark工具对它们进行了一组综合性测试,并比较了它们的指标值. 与libc(glibc malloc)相比, ...

  7. 理解 glibc malloc:主流用户态内存分配器实现原理

    https://blog.csdn.net/maokelong95/article/details/51989081 Understanding glibc malloc 修订日志: 2017-03- ...

  8. Go内存分配器可视化指南【译】【精】

    当我第一次开始尝试理解 Go 语言的内存分配器时,整个过程让我抓狂.一切看起来都像一个神秘的黑盒子.因为几乎所有技术魔法(technical wizardry)都隐藏在抽象之下,所以你需要一层一层的剥 ...

  9. [转]STL的内存分配器

    题记:内存管理一直是C/C++程序的红灯区.关于内存管理的话题,大致有两类侧重点,一类是内存的正确使用,例如C++中new和delete应该成对出现,用RAII技巧管理内存资源,auto_ptr等方面 ...

随机推荐

  1. wordpress用Elementor拖拽生成酷炫页面

    很多朋友看到wordpress网站做得很高大上,想知道是怎么做到的,其实很简单,用Elementor就能拖拽生成酷炫页面,ytkah就直接上干货了. 1.安装Elementor,到wordpress后 ...

  2. Delphi启动数据库连接属性对话框

    有时候需要客户端进行服务器连接配置,自己写配置窗体,总不如直接使用系统提供的使用方便快捷 例子一: //此例子有个坏处不管用户点了确定还是取消,均返回值 procedure TForm1.Button ...

  3. 【LeetCode每天一题】Longest Common Prefix(最长前缀)

    Write a function to find the longest common prefix string amongst an array of strings. If there is n ...

  4. 9.C# 类

    1.类定义格式 [访问修饰符]class 类名 [:父类名,接口名,接口名] { //类成员 } 类的访问修饰符有public.internal两个,没有标明访问修饰符默认为internal,被int ...

  5. jmeter BeanShell断言(一)

    原文地址https://blog.csdn.net/lijing742180/article/details/81157947 原文地址https://blog.csdn.net/zailushang ...

  6. 微信公众号支付(JSAPI)对接备忘

    0 说明 本文里说的微信公众号支付对接指的是对接第三方支付平台的微信公众号支付接口. 非微信支付官方文档里的公众号支付开发者文档那样的对接.不过,毕竟腾讯会把一部分渠道放给银行或有支付牌照的支付机构, ...

  7. 网络编程之Socket的TCP协议实现客户端与客户端之间的通信

    我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...

  8. 使用SQL语句如何实现条件判断

    客户需求是咨询如何用SQL结合decode函数实现条件判断,比如当某一列数值大于500,对应类型"大于500":当某一列数值小于500,对应类型"小于500". ...

  9. spark 关联source

    IDEA就自动把jar包中的字节码反编译为Java源码,并且,我们可以直接下个断点调试程序,但是对于Scala,IDEA的反编译效果并不是很好,如下图所示: 2)提示“Source not found ...

  10. idea软件上设置爱彼迎字体