zoukankan      html  css  js  c++  java
  • php Allocator Jemalloc TCMalloc那个内存分配器比较好?

    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的提供的内存分配管理

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

    image

    测试代码如下:

       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的话,是需要自己安装的。

  • 相关阅读:
    webFlux&Reactor
    Docker镜像使用
    Docker的使用
    Docker的容器使用
    为什么样本方差除以(n-1)而不是n ?(自由度)
    机器学习(一)—— 线性回归
    线性、逻辑回归的java实现
    整合多个网络的拓扑结构并降维(Mashup)
    KS检验统计量的扩展应用(CMap)
    p-value
  • 原文地址:https://www.cnblogs.com/zdz8207/p/php-Allocator.html
Copyright © 2011-2022 走看看