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. 字符集更改步骤,mysql乱码

    关键字:Mysql乱码,mysql字符集修改 #字符集更改步骤~

  2. mysql 数据库操作 数据库的增删改查

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  3. 帝国cms如何调用指定id的文章到首页?

    小美女用帝国cms建了一个站,现在首页调出指定id为12的文章作为推荐,附带文章摘要,她想用代码的形式直接掉用,以后方便修改.那么,帝国cms如何调用指定id的文章呢?指定信息id,不是调用指定栏目i ...

  4. pycharm 运行py文件一直updating indexing

    1.解决一直索引python目录下的文件 File - Settings - Project: yourprojectname - Project Structure - Right click on ...

  5. ORACLE安装入门篇OEL5.4安装ORACLE11g

    一.安装ORACLE11g软件(11.2.0.0) (一)安装前的包支持 1.检测yum仓库是否已经配置好 yum list all 2.搭建yum仓库 1).挂载所需要的安装光盘 虚拟机挂载光盘: ...

  6. H5-FileReader实现图片预览&Ajax上传文件

    图片预览 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  7. js或jsp 获取项目路径常用方法

    可以引入一个jsp,这个jsp的内容如下: <%@page pageEncoding="UTF-8" contentType="text/javascript; c ...

  8. 微信小程序 - 表单验证插件WxValidate使用

    插件下载地址及官方文档:https://github.com/skyvow/wx-extend 具体的WxValidate.js文件的位置在wx-extend/src/assets/plugins/w ...

  9. 进程池线程池 协程 gvent 单线程实现并发套接字

    1.基于多线程实现套接字服务端支持并发 服务端 from socket import * from threading import Thread def comunicate(conn): whil ...

  10. Python 全栈开发十一 深浅拷贝

    深浅拷贝 深浅拷贝的前提: 相等和相同的关系 深浅拷贝针对的是列表等可变的数据类型. 深浅拷贝在普通的列表没有什么意义,只有在嵌套列表,或其他嵌套数据类型才有意义. a = "aaa&quo ...