《1.基于 eBPF 的内存泄露(增长)通用分析方法.pptx》由会员分享,可在线阅读,更多相关《1.基于 eBPF 的内存泄露(增长)通用分析方法.pptx(16页珍藏版)》请在三个皮匠报告上搜索。
1、首届中国首届中国eBPFeBPF研讨会研讨会基于基于 eBPF 的的内存泄露(增长)通用分析方法内存泄露(增长)通用分析方法主讲人:邢孟棒主讲人:邢孟棒2022-11-12首届中国首届中国eBPFeBPF研讨会研讨会目录目录背景内存泄露(增长)的分类与误区传统分析工具 gdb、Valgrind基于 eBPF 的通用分析方法内存分配火焰图(改进版)缺页异常火焰图(改进版)首届中国首届中国eBPFeBPF研讨会研讨会背景背景问题:某私有化环境中 mysql-proxy 内存占用量持续增长,出现 OOM 现象,影响业务方正常使用痛点:传统分析工具(gdb、Valgrind 等)效率相对较低,投入 3
2、 人力超过一周时间后折中解决诉求:一种相对通用的内存泄露(增长)分析方法,更高效地定位发生泄露的代码路径,减少人力投入成本首届中国首届中国eBPFeBPF研讨会研讨会内存泄露的分类内存泄露的分类内核内存泄露应用程序内存泄露 堆内存(Heap)内存映射区(Mappings)虚拟内存泄露 持续分配虚拟内存,但未分配、映射实际的物理内存物理内存泄露 持续分配、映射实际的物理内存,且一直未释放首届中国首届中国eBPFeBPF研讨会研讨会内存泄露的误区内存泄露的误区混淆内存泄露与内存增长虚拟内存泄露未引起关注如果进程仅调用 malloc()或 mmap()而不去写入这些地址,即不去给它分配物理内存,是否
3、就不用担心内存泄漏了?首届中国首届中国eBPFeBPF研讨会研讨会传统分析工具传统分析工具 gdb&Valgrindgdb 干扰程序运行,不适合生产环境 直接定位比较困难,且要求对源码有一定了解Valgrind 需要重启程序,且作为 Valgrind 子进程运行 替代默认的 malloc/free 等分配函数,程序运行速度减慢 2030 倍 不能很好的支持 tcmalloc、jemalloc 分配器首届中国首届中国eBPFeBPF研讨会研讨会基于基于 eBPF 的通用分析方法的通用分析方法内存分配器行为分析(glibc、jemalloc 等)应用视角,重点关注应用程序内存分配的代码路径 动态追
4、踪内存分配相关函数,统计未释放内存分配的调用栈与总字节数量,形成 eBPF 分析工具 mallocstacks缺页异常事件分析 内核视角,关注的是首次写入触发缺页异常的代码路径,而不是触发内存分配的代码路径 追踪缺页异常事件,统计未释放物理内存的调用栈与总页面数量,形成 eBPF 分析工具 pgfaultstacks首届中国首届中国eBPFeBPF研讨会研讨会内存分配器行为分析内存分配器行为分析现有 eBPF 分析工具功能对比memleak不支持生成折叠栈,文本形式输出不太直观。可追踪 malloc 及其变体 cmalloc、realloc 等,且支持 malloc/free 抵消。mallo
5、cstacks现有 eBPF 工具仅追踪 malloc,不包括变体 cmalloc、realloc 等。可生成折叠栈,但不支持 malloc/free 抵消,全量 malloc 总量太大。首届中国首届中国eBPFeBPF研讨会研讨会内存分配器行为分析内存分配器行为分析定制内存泄露(增长)分析工具 mallocstacks借鉴现有 BCC 工具 memleak、mallocstacks,支持生成折叠栈,可生成全量内存分配火焰图、未释放内存分配火焰图借助 uprobes 动态追踪 malloc(以及变体 cmalloc、realloc)、free./mallocstacks.py-O/lib64/
6、libjemalloc.so.4.5.0-p$(pgrep-nx mysql-proxy)-f 60 unfreed_malloc.stacks./flamegraph.pl-color=mem-title=Malloc Flame Graph-countname=bytes unfreed_malloc.svg首届中国首届中国eBPFeBPF研讨会研讨会全量内存分配火焰图全量内存分配火焰图mallocstacks-p$(pgrep-nx mysql-proxy)-af 60追踪 mysql-proxy 进程所有 malloc 及其变体调用 60s,并生成全量内存分配火焰图,共计 1.64 G
7、B首届中国首届中国eBPFeBPF研讨会研讨会未释放内存分配火焰图未释放内存分配火焰图mallocstacks-p$(pgrep-nx mysql-proxy)-f 60追踪 mysql-proxy 进程未释放 malloc 及其变体调用 60s,并生成内存分配火焰图,共计 27.75 MB(与 mysql-proxy 进程 RSS 增量基本一致)已分配但未释放的代码路径主要有两处。其中,xxx:Item_param:set_str 正是导致 mysql-proxy 内存泄露发生的地方相比全量内存分配火焰图,数据量减少近 60 倍,需要重点关注的代码路径减少也比较明显首届中国首届中国eBPFe
8、BPF研讨会研讨会缺页异常事件分析缺页异常事件分析现有分析工具 传统工具 perf,基于软件事件 page-faults perf record-p$(pgrep-nx mysql-proxy)-e page-faults-c 1-g-sleep 60 BCC 工具 stackcount,基于追踪点 exceptions:page_fault_user stackcount-p$(pgrep-nx mysql-proxy)-U t:exceptions:page_fault_user首届中国首届中国eBPFeBPF研讨会研讨会定制工具定制工具 pgfaultstacks改进现有缺页事件统计方式
9、(过滤物理页面已存在的缺页事件、抵消已释放的物理页面),仅关注真正泄露的物理内存借助 tracepoint 或 kprobe 动态追踪 page faults 事件,一般情况下性能开销可忽略不计./pgfaultstacks.py-p$(pgrep-nx mysql-proxy)-f 60 pgfault.stacks./flamegraph.pl-color=mem-title=”Page Fault Flame Graph-countname=”pages pgfault.svg首届中国首届中国eBPFeBPF研讨会研讨会缺页异常火焰图(现有版)缺页异常火焰图(现有版)perf recor
10、d-p$(pgrep-nx mysql-proxy)-e page-faults-c 1-g-sleep 60 追踪 mysql-proxy 进程所有缺页事件 60s,共计 420,342 次(约 1.6 GB)不是每一次缺页事件都分配一个新的物理页面(大多数情况下未分配),RSS 实际增长量仅 60 多MB 首届中国首届中国eBPFeBPF研讨会研讨会缺页异常火焰图(改进版)缺页异常火焰图(改进版)pgfaultstacks-p$(pgrep-nx mysql-proxy)-f 60 追踪 mysql-proxy 进程满足过滤条件的缺页事件 60s,并生成缺页火焰图,共计增加 17801 个物理页面(与 mysql-proxy 进程 RSS 增量基本一致)重点关注函数 g_string_append_printf相比现有方式,改进版本的数据量减少 20 多倍,需要重点关注的代码路径减少也比较明显首届中国首届中国eBPFeBPF研讨会研讨会Thanks!5/9/