1. 几种malloc对比:
ptmalloc: glibc的内存分配管理(linux默认)
内存容易产生碎片,ptmalloc在整理合并的时候也要对arena做加锁操作。在线程多的时候,锁的开销就会增大
tcmalloc: google的内存分配管理
tcmalloc在内存分配的时候使用自旋锁,在锁冲突严重的时候导致CPU飙升
jemalloc: BSD的内存分配管理 (facebook)
jemalloc最大的优势还是其强大的多核/多线程分配能力,多线程下加锁大大减少
2. 如何判断服务是否使用jemalloc
perf top -g -p 进程id
#
查看 malloc/free 来自于libc还是服务本身
注:jemalloc会替换malloc和free的函数 但是不会替换memcpy
3. 如何利用jemalloc-profile 来观测程序的内存分配行为
- 编译jemalloc静态库,编译条件中开启profile模块
- 设置环境变量,服务启动时默认不开启profile
export MALLOC_CONF=
"prof:true,prof_active:false"
- 当需要使用profile时,可以动态打开profile功能
mallctl("prof.active", nullptr, nullptr, (void *)&active, sizeof(active));
- 可以通过定时器或动态调用的方式生成内存堆栈文件
mallctl("prof.dump", nullptr, nullptr, &c_str, sizeof(const char *));
- 可以通过jeprof和图形化工具来分析heap文件
- 安装图形化工具:
yum install graphviz
yum install ghostscript
-
- 通过jeprof分析堆栈
jeprof MediaServer jemalloc2.heap
top
-
- 对比两个heap文件,并将分析结果导出为pdf文件
jeprof --show_bytes -pdf Server --base jeprof.
84552.2
.i2.heap jeprof.
84552.0
.i0.heap >result.pdf
-
更多格式: