使用示例
以treeline为例,在treeline/scripts/ycsb_v2/run.sh中将
1../../build/bench/run_custom \
修改为
1LD_PRELOAD="/usr/local/lib/libtcmalloc.so" env HEAPPROFILE=amzn_64B_a_heapprofile.hprof ../../build/bench/run_custom \
并在COND文件中修改实验配置:工作负载为A、记录大小为64B,线程数为16
在treeline目录下,运行
1cond run //scripts/ycsb_v2:amzn
单独分析一个.heap文件
程序运行过程中,生成了11个.heap文件,分别记录了在运行过程中的十一个时刻的内存使用情况,将其移动到treeline/scripts/ycsb_v2/heapprofile文件夹下
以pdf的形式分析第十个生成文件amzn_64B_a_heapprofile.hprof.0010.heap
1pprof build/bench/run_custom scripts/ycsb_v2/heapprofile/amzn_64B_a_heapprofile.hprof.0011.heap --pdf >amzn_64B_a_heapprofile.hprof.0010.heap.pdf
生成amzn_64B_a_heapprofile.hprof.0010.heap.pdf文件在treeline/下,可以看到内存消耗较多的函数为LoadDatasetFromTextFile,ExtractDirty,Put,_M_default_append,优化程序使用内存时可以重点关注这几个函数
左上角显示元信息:
可执行程序的名称为run_custom,在生成amzn_64B_a_heapprofile.hprof.0010.heap文件的这一时刻,程序总共使用了1773.9MB内存,被关注的函数所占内存为1773.9MB(没有使用--foucs关注特定函数则默认全部关注),此外,一些不重要的节点和边被丢弃以减少混乱。
有向图所含信息:
图中的每个方框代表一个函数,有向边表示调用关系,有向边旁边的数字代表被其直接和间接调用的函数所使用的所有内存,方框中的信息从上到下依次是:
Class Name
Method Name
local (percentage) //此函数本身所使用的内存大小(及其占比)
of cumulative (percentage) //此函数本身和其直接及间接调用的所有函数所使用的内存大小(及其占比)
以下面的amzn_64B_a_heapprofile.hprof.0010.heap.pdf的局部有向图为例:
Manager函数自身使用15.8MB内存,占比为0.9%,此函数本身和其直接及间接调用的所有函数所使用的内存大小为23.8MB,占比为1.3%,其调用的函数所使用的内存为23.8MB-15.8MB=8.0MB;
RecordCache函数自身使用0MB内存,占比为0.0%,此函数本身和其直接及间接调用的所有函数所使用的内存大小为687.8MB,占比为38.8%,其调用的函数所使用的内存为687.8MB-0MB=687.8MB;
这两个函数都调用了_M_default_append函数,将两个有向边上的数字相加,得到_M_default_append函数使用8.0MB+685.8MB=693.8MB内存,占比为39.1%;
将两个.heap文件相比较
1pprof --base=scripts/ycsb_v2/heapprofile/amzn_64B_a_heapprofile.hprof.0011.heap build/bench/run_custom scripts/ycsb_v2/heapprofile/amzn_64B_a_heapprofile.hprof.0010.heap
此时会进入交互窗口,输入top20,显示前20个内存大小变化最大的函数
记生成amzn_64B_a_heapprofile.hprof.0010.heap的时刻为t10,生成amzn_64B_a_heapprofile.hprof.0011.heap的时刻为t11,程序在t10比在t11多使用1613.7MB内存
函数_M_default_append在t10比在t11多使用693.8MB内存,占1613.7MB的43%
函数Put在t10比在t11多使用299.6MB内存,占1613.7MB的18.6%
……
可在交互窗口输入help查看更多信息