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

  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/zdz8207/p/php-Allocator.html
Copyright © 2011-2022 走看看