跟踪slab分配堆栈流程的方法(perf、systemtap)
内存泄露是在解决内核故障会遇到的棘手情况,根据具体的内存使用情况,追踪相应slab cache的分配堆栈流程,是追踪泄露原因的第一步,接下来根据内核版本的不同,介绍二种跟踪slab分配的方法;
1.在perf支持probe功能的情况下(内核版本高于3.10内核),可以使用perf probe追踪相应slab cache的分配堆栈流程;
参考:https://access.redhat.com/solutions/2850631   
脚本如下:vim trace_slab_cache.sh
#!usr/bin/bash
[ $# -eq 0 ] && {
    echo "Usage: $0 <slab_cache_name> <timer>

Note, the cache names can be found in '\proc\slabinfo'"
    exit 1
}

SLAB="$1"
TIMER=30

[ $# -eq 2 ] && { TIMER=$2; }

grep -q ^"$SLAB" /proc/slabinfo || {
    echo "error: no '$SLAB' slab cache exists"; exit 2
    exit 2
}

UNAME_R=$(uname -r)
echo "$UNAME_R" | grep -q el5 && { RHEL_VER=el5; }
echo "$UNAME_R" | grep -q el6 && { RHEL_VER=el6; }
echo "$UNAME_R" | grep -q el7 && { RHEL_VER=el7; }
echo "$UNAME_R" | grep -q el8 && { RHEL_VER=el8; }

perf probe -d kmem_cache_alloc* 2>/dev/null

case $RHEL_VER in
    el5)
        perf probe kmem_cache_alloc 'cachep->name:string' 2>/dev/null    # RHEL 5
        ;;
    el6)
        perf probe kmem_cache_alloc 'cachep->name:string' 2>/dev/null    # RHEL 6
        ;;
    el7)
        perf probe kmem_cache_alloc      's->name:string' 2>/dev/null    # RHEL 7
        ;;
    el8)
        perf probe kmem_cache_alloc      's->name:string' 2>/dev/null    # RHEL 8
        ;;
    *)
        ;;
esac

grep -q 'probe/kmem_cache_alloc' /sys/kernel/debug/tracing/kprobe_events || {
    echo "error: failed to add the probe"
    exit 3
}

echo "collecting the data for $TIMER seconds, stand by..."
perf record -a -g -e probe:kmem_cache_alloc --filter 'name == "'$SLAB'"' sleep "$TIMER"
perf probe -d kmem_cache_alloc* 2>/dev/null

echo "creating the archive with debugging symbols..."
rpm -q kernel-debuginfo-* >/dev/null \
|| echo "warning: package kernel-debuginfo-$UNAME_R is not installed"
perf archive >/dev/null

echo "done: please share both perf.data and" perf.data.tar.* "with Red Hat support for analysis"
echo "note: if there is no perf.data.tar.* generated, $SLAB might not be in use during $TIMER seconds
      or $SLAB might not be used by kmem_cache_alloc function"
    1)执行以上脚本可以收集对应slab cache的堆栈数据到perf.data文件中;使用方法:sh trace_slab_cache.sh kmalloc-512 20(其中kmalloc-512是slab cache名称,可以通过slabtop -o s c结果的NAME字段设置;20是收集的时长);
    2)执行命令perf scripts查看数据perf.data即可查询slab cache分配kmalloc-512的所有函数调用堆栈。
2.在perf不支持probe功能的情况下(内核版本低于3.10内核,高版本内核也可用),只能使用systemtap(依赖 kernel-debuginfo kernel-debuginfo-common kernel-devel包)打点跟踪,下面可以举个简单例子
vim trace_slab_cache.stp
#/usr/sbin/stap
global count
probe kernel.function("kmem_cache_alloc")
{
        if( kernel_string($cachep->name) == "scsi_data_buffer"){ #scsi_data_buffer是我们要追踪的slab cache名称
          count++;//分配时+1;
                printf("======execname:%s======cache name:%s======\n",execname(),kernel_string($cachep->name));(高版本cachep为s)
          printf("=================alloc strace====================\n");
                print_backtrace();
        }
}

probe kernel.function("kmem_cache_free")
{
        if( kernel_string($cachep->name) == "scsi_data_buffer"){ #scsi_data_buffer是我们要追踪的slab cache名称
          count--;//释放时-1
                printf("======execname:%s======cache name:%s======\n",execname(),kernel_string($cachep->name));(高版本cachep为s)
          printf("=================free strace====================\n");
                print_backtrace();
        }
}

probe timer.s(10)
{
        printf("====================count:%d===============\n",count);//打印内存分配次数,粗略的打印,需要先确保流程单一,结果为正值可能存在泄漏
}
执行stap --all-modules trace_slab_cache.stp即可打印跟踪堆栈和分配计数。

跟踪slab分配堆栈流程的方法(perf、systemtap)相关推荐

  1. ccot 目标跟踪全称_一种焊缝跟踪系统的实时姿态估计方法与流程

    本发明属于焊接机器人焊缝跟踪领域,特别涉及一种焊缝跟踪系统的实时姿态估计方法. 背景技术: 现在的焊接机器人基本上都是在焊接之前先进行示教,让机器人每次都走一个固定的轨迹,这种方式有一个好处就是重复精 ...

  2. Kylin RT OLAP reassign流程即重新分配replica_set 流程

    本文将通过页面操作入口和程序代码进行reassign流程分析.reassign的大致流程为页面操作触发coordinator调用相应的receiver进行处理:reassign分为3个部分,preAs ...

  3. 数学建模中数据处理类型题目的主要处理流程与方法

    本文首发于zhengfei.xin 文章目录 曲线插值与拟合 一维插值 例题1 二维插值 例题2 曲线拟合 多项式拟合 最小二乘拟合 数值微分与积分 数值积分 数值微分 求解常微分方程 标准形式 sc ...

  4. 基于电子病历的临床医疗大数据挖掘流程与方法

    基于电子病历的临床医疗大数据挖掘流程与方法 阮彤1, 高炬2, 冯东雷3, 钱夕元1, 王婷1, 孙程琳1 1. 华东理工大学,上海 200237 2. 上海曙光医院,上海 200025 3. 万达信 ...

  5. 计算机视觉检测 白皓月,基于视线跟踪的操作界面的人机交互方法研究

    摘要: 人机交互主要是研究人与计算机之间的信息交换,是与人机工程学,认知心理学,虚拟现实技术,多媒体技术等密切相关的综合学科.本文研究的基于视线跟踪的操作界面的人机交互方法采用桌面式双目立体视觉实时跟 ...

  6. [4G5G专题-80]:流程 - 4G LTE 跟踪区TA以及跟踪区位置更新流程TAU

    目录 第1章 跟踪区与跟踪区列表 1.1 什么是跟踪区TA 1.2 什么是跟踪区列表TAL 第2章 跟踪区位置更新流程TAU 2.1 TAU的触发流程 2.2 TAU的目标和作用 2.3 TU更新的场 ...

  7. PrimeTime 时序分析流程和方法

    PrimeTime是Synopsys的一个单点的全芯片.门级静态时序分析器.它能分析大规模.同步.数字ASICS的时序.PrimeTime工作在设计的门级层次,并且和Synopsys其它工具整合得很紧 ...

  8. Fortran的堆栈溢出解决方法

    Fortran的堆栈溢出解决方法 每个线程都有自己的堆栈用来保存局部变量和函数调用信息,根据编译器不同,通常大小1~4MB之间,如果用完了就会出现stack overflow exception.此外 ...

  9. 业务层战略制定的思路和方法_企业战略规划制定流程及方法

    中略咨询 广州市天河区马场路庆亿街 1 号珠光新城国际中心 A 座 8 楼 企业战略规划制定流程及方法 战略不等于目标. 为了实现这一目标,我们可以设计各种战略,每种战略 都会遇到不同的困难, 需要调 ...

  10. 常规项目风险识别的规范流程和方法

    一.识别风险输入 识别项目风险,首先需要对项目管理计划.项目文件.协议.采购文档.事业环境因素.组织过程资产等进行风险识别. 项目管理计划是指:需求.进度.成本.质量.资源.风险等管理计划以及范围基准 ...

最新文章

  1. matlab矢量相乘并打印显示
  2. 使用Lubuntu开发Android应用
  3. 本地开发环境与生产环境布局有偏差问题
  4. python3程序转python2_python2到python3代码转化:2to3
  5. SpringBoot Idea快速创建工程
  6. python迭代器是什么意思_理解Python的迭代器
  7. 致敬ATSS | Dynamic ATSS再造ATSS辉煌!!!
  8. 软件测试用例关键要素,软件测试用例的设计
  9. 使用WireShark协议分析仪来分析ICMP与FTP协议
  10. mysql安装出现change_mysql-5.msi安装出现change,repaire,or remove installation
  11. 下行法求最小割集案例_故障树分析方法(FTA)
  12. 转型不忘初心,决定一个高端存储厂商的未来
  13. Java实现等额本息
  14. 网站增加百度收录最有效的方法!!!!!!
  15. MVC搭建webAPI服务
  16. java ca 验证失败,Apache CURL错误SSL:CA证书集,但禁用证书验证
  17. 超融合与传统架构特性及收益详细对比
  18. html分享到微信朋友圈代码,微信分享给朋友及朋友圈JS代码
  19. 机器学习 TOP 10 必读论文
  20. computehash在php怎么实现,卓象程序员:PHP实现基础区块链

热门文章

  1. 洛谷——P2656 采蘑菇
  2. Throwable类
  3. HDU 2444 The Accomodation of Students (二分图最大匹配+二分图染色)
  4. caffe的Matlab接口的使用方法
  5. [原]Linux 命令行浏览器
  6. db2:根据TABLEID找table
  7. excel甘特图模板_不做规范!收数就是个灾难!Excel收集数据套路了解一下
  8. MySQL中的四种Key
  9. java spring maven excel 导出
  10. 如何学习angular.js