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