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

2023-05-16

跟踪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即可打印跟踪堆栈和分配计数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • java中list.add添加元素覆盖之前的问题

    1 在码代码时 xff0c 发现一个问题 xff1a 使用 list lt object gt list 61 new Arraylist lt object gt list add object xff1b 出现之前添加的元素被最后的元素
  • 线性最优解java实现+Cplex java调用

    一 xff1a cplex的使用 xff1a 1 1 导入cplex jar 包的地址 xff1a https pan baidu com s 1Q0Bv24EQdelV2rY IrLoZQ 提取码 xff1a xn14 1 2 将cple
  • KNN算法(K临近算法)及使用KNN算法实现手写数字0-9识别

    首先感谢博主倔强的小彬雅 xff0c 本文使用的素材及部分代码来源其博文机器学习入门 用KNN实现手写数字图片识别 xff08 包含自己图片转化 xff09 xff0c 需要下载素材的可以到其博文最后进行下载 关于KNN算法 knn算法也叫
  • 如何学习开源飞控

    前言 有一段时间没有更新文章了 新的一年新气象 xff0c 因此还是要抽出时间 xff0c 写点总结与思考 xff0c 对自己的成长也是很有帮助 今天主要想聊一下开源飞控的学习 本人在5年前 xff0c 在知乎下写过一篇回答 xff0c 如
  • 控制系统的观测器基础知识

    1 为什么需要用到观测器 控制原理中的系统框图 xff0c 往往都是假设反馈状态为理想值 但在工程实践中 xff0c 这个是做不到的 一般我们采用传感器测量控制的反馈状态 xff0c 而传感器的测量值 xff0c 存在几个问题 xff1a
  • 浅谈飞控的软件设计

    写在前面 开这个专栏的目的主要是深感自己对飞控软件 算法的知识点过于杂乱 xff0c 很久没有进行系统的总结了 xff0c 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 xff0c 如内容有错误 xf
  • 飞控IMU数据进阶处理(FFT,滤波器)

    前面的文章 xff08 知乎专栏 https zhuanlan zhihu com c 60591778 xff09 曾简单讲过IMU数据 xff08 陀螺仪 加速度数据 xff09 的校准以及一阶低通滤波 本文在此基础上更进一步讲一下数据
  • (5)py接口自动化之配置文件&数据库连接详解

    目录 一 配置文件 ini amp yaml 1 作用 2 ini A 语法 B 特点 C 操作方法 3 yaml A 安装第三方库 B 支持的数据类型 C 特性 D 语法 E 数据读取 二 数据库连接与pytho配置文件 1 安装数据库
  • 再谈IMU数据处理(滤波器)

    本文开始前 xff0c 先回答一个问题 上一篇文章最后提到了卡尔曼滤波器用来做一维数据的数字滤波处理 xff0c 最终的实验结果说 xff1a 该模型下的卡尔曼滤波处理与二阶IIR低通滤波处理效果几乎一致 有网友指出是错误的 xff0c 卡
  • s3操作ceph 创建bucket 报错 命名 错误 botocore.exceptions.ClientError: An error occurred (InvalidBucketName)

    报错信息 Traceback span class token punctuation span most recent call last span class token punctuation span s3 create bucke
  • windows 10 上传文件夹到 Linux服务器 压缩文件夹 到tar.gz格式

    有时候需要把win10上的一个文件夹传到Linux服务器上 简洁的做法是先压缩成 tar gz 再用xftp上传 其中win端的压缩软件一般无法直接压缩成tar gz格式 可用在cmd中 用命令压缩 xff1a span class tok
  • NS3 socket 发送 packet因Tag值过大发送失败

    NS3使用中遇到一个问题 xff1a NS3中当Tag内值过大 xff08 没有超过数据结构可用大小 xff09 的时候 出现socket Send xff08 packet xff09 失败的情况 现在有三个节点 结构如下 span cl
  • 一行代码安装Tensorflow GPU Ubuntu20.04 Windows

    本文内容 xff1a Ubuntu20 04下使用Anaconda 配置Tensorflow GPU环境 Windows操作系统也可行 xff0c 换成Win下的anaconda安装方法即可 Why conda xff1f 使用conda安
  • python无法引用另一个python文件问题 文件名命名问题

    问题 xff1a python的from xxxx py import 语句无法获取另一个python文件 例子 xff1a 在A py的同级目录下有另一个文件xxx xxx py xff08 文件无错 xff0c 可运行 xff09 在A
  • Ubuntu20.04 安装显卡驱动 安装pytorch

    1 查看推荐的驱动 ubuntu span class token operator span drivers devices driver span class token operator span nvidia span class
  • Ubuntu LVM 逻辑卷操作 创建 删除

    先检查新硬盘是否插入 xff1a fdisk l 或者 df h 或者 lsblk 创建LVM 1 将物理磁盘设备初始化为物理卷 pvcreate dev sdb dev sdc 查看物理卷信息 xff1a pvdispaly 或者 pvs
  • Ubuntu20.04 Server 安装NS3 速通版

    官网内容 xff1a https www nsnam org wiki Installation 目录如下 xff1a 官网内容 第一章内容基本可以跳过在第二章中可以查看对应OS需要的安装环境 xff0c 当然我尝试过Ubuntu20 04
  • Ubuntu20 修改系统时区为 国内时间

    问题 xff1a 一般情况下 xff0c Ubuntu时间与实际时间相差8小时 xff0c 因为他的时区设置为0时区 xff0c 而我们想让他为北京时间 校正方法如下 xff1a 运行tzselect xff0c 选择Asia xff08
  • (7)http请求、https请求详解

    一 基础知识 1 OSI七层模型 xff1a 参考 xff1a OSI七层模型详解 小鹏 加油的博客 CSDN博客 osi七层模型 这个博主说的很详细 xff0c 感兴趣的可以去学习一下 如果不感兴趣的话记住tcp ip协议是在传输层就好了
  • 回归问题的评价指标 MAE MSE RMSE R2 score Adjusted R2 score 和 重要知识点总结

    除了MSE 和MAE外回归还有什么重要的指标吗 xff1f R2 score amp Adjusted R2 score 我们用一个回归问题来介绍这些指标 xff0c 我们的其中输入是工作经验 xff0c 输出是薪水 下图显示了为预测薪水而

随机推荐

  • Linux tar 压缩 解压

    tar 操作的参数 xff1a v xff1a 打印出命令执行过程 c xff1a 创建新归档 xff0c 即打包 x xff1a 提取归档文件 xff0c 即解包 z xff1a 使用 gzip 压缩格式 j xff1a 使用 bzip2
  • tmux 基础使用 xshell 远程连接服务器 断电 断网后保持程序运行

    应用场景 Xshell 远程连接服务器 xff0c 断电 or 断网等原因 xff0c 导致Xshell会话关闭 xff0c 然而 xff0c 此时如果有程序在运行也会被中断 xff0c 对于那些需要长时间运行的程序 xff0c 如何避免程
  • leetcode 3. 无重复字符的最长子串 优化代码效率

    标准解法 xff1a 滑动窗口 xff0c 可见官方题解 核心内容是使用一个set或者map维护当前窗口出现的字符 查看了一下别人运行速度最快的写法发现优化方法是 使用一个vector lt int gt cnt 128 来记录字符是否出现
  • C++ 演奏《起风了》

    来源 xff1a https www bilibili com video BV1tv4y1D7iW is story h5 61 false amp p 61 1 amp share from 61 ugc amp share mediu
  • c ++ Set存放自定义 结构体 类 重载比较运算符

    结构体 xff1a 结构体重载操作在结构体外实现 span class token macro property span class token directive hash span span class token directive
  • c++ 哈希map unorder map set 存放自定义结构体作为key

    c 43 43 中的哈希map xff0c 即unorder set与unorder map如何使用结构体作为key 示例代码如下 xff1a span class token macro property span class token
  • leetcode 5 回文子串

    题目 很明显暴力方法是n平方复杂度 xff0c 所以一直在想有没有不是n平方复杂度的方法 然后就掉坑里了 最后看了题解发现其实就是n平方复杂度 xff0c 所以就直接暴力了 附上一份随手暴力代码 xff0c 遍历对称中心 span clas
  • 【ceph】理解Ceph的三种存储接口:块设备、文件系统、对象存储

    Ceph是一个开源的 统一的 分布式的存储系统 xff0c 这是我们宣传Ceph时常说的一句话 xff0c 其中 统一 是说Ceph可以一套存储系统同时提供块设备存储 文件系统存储和对象存储三种存储功能 一听这句话 xff0c 具有一定存储
  • 二叉树的迭代遍历 前序 中序 后序 模板

    作为个人学习笔记 xff0c 原出处讲的很清楚 xff1a 代码随想录 非标记法 使用非标记法写的话 xff0c 中序的代码风格和前后序完全不同 中序 xff1a span class token keyword class span sp
  • (8)requests发起get/post请求

    一 基本概念 1 什么是接口 前后端数据传输的通道 2 http请求的接口 协议 43 域名 ip 43 接口地址 43 请求参数 3 http请求的要素 请求地址 43 请求方法 43 请求数据 二 request请求接口 1 安装 pi
  • 【面试必备】面向Android开发者的复习指南!最全的BAT大厂面试题整理

    近日一好友去阿里面试 xff0c 面试失败了 xff0c 分享了一个他最不擅长的算法面试题 题目是这样的 题目 xff1a 给定一个二叉搜索树 BST xff0c 找到树中第 K 小的节点 出题人 xff1a 阿里巴巴出题专家 xff1a
  • c memcpy 带重叠部分 实现

    主要是要注意当目标地址在源地址后面且存在重叠区域的时候 xff0c 需要从后往前复制 span class token macro property span class token directive hash span span cla
  • 主流PCB画图软件的对比区别(AD、Pads、Allegro)

    国内的EDA软件市场几乎被三家瓜分 xff0c 分别是Altium Mentor Pads Cadence xff0c 也是我们这次主要分析和比较的软件 本人用的多的是 Alitum 也用过allegro xff0c pads目前还没用过
  • 新书推荐 |《Prometheus监控实战》

    新书推荐 Prometheus监控实战 点击上图了解及购买 Docker公司前服务与支持副总裁 Kickstarter前首席技术官 Empatico首席技术官撰写 xff0c 全方位介绍继Kubernetes之后的第二个CNCF毕业项目 P
  • 腾讯大数据总体架构图,对外公开!

    导读 xff1a 腾讯作为国内体量最大的互联网公司之一 xff0c 业务涵盖用户日常生活的方方面面 xff0c 面对如此巨大业务数据量 xff0c 如果不能对数据进行专业化处理并高效有序地存 管 用 xff0c 如果不能使数据产生应有的价值
  • API安全实战

    一提起 信息安全 xff0c 不管是业内专家还是所谓的 吃瓜群众 xff0c 多半都会在脑海中浮现 网络安全 Web安全 软件安全 数据安全 等常见的词汇 市面上绝大多数安全类书籍也多集中在这几个领域 xff0c 而从API视角阐释信息安全
  • 【第115期】世界一流大学计算机专业,都在用哪些书当教材?

    导读 xff1a 转眼间离新学期开学又不远了 清华 北大 MIT CMU 斯坦福的学霸们在新学期里要学什么 xff1f 本文就带你盘点一下那些世界名校计算机专业采用的教材 不用多说 xff0c 每本都是经典的烧脑技术书 xff0c 建议配合
  • 什么是AB实验?能解决什么问题?终于有人讲明白了

    导读 xff1a 走向身边的AB实验 作者 xff1a 木羊同学 来源 xff1a 大数据DT xff08 ID xff1a hzdashuju xff09 AB实验 是一个从统计学中借来的工具 我和大家一样 xff0c 每次只要看到 统计
  • 树莓派3b引脚图

    如上图所示 xff0c 我们可以很清楚的看到各个引脚的功能 例如我们想使用pwm引脚来控制舵机 xff0c 则我们可以考虑使用其中的 BCM18 PWM0 和 BCM13 PWM1 在使用wiringPi库时 xff0c 我们定义的引脚即B
  • 跟踪slab分配堆栈流程的方法(perf、systemtap)

    跟踪slab分配堆栈流程的方法 xff08 perf systemtap xff09 内存泄露是在解决内核故障会遇到的棘手情况 xff0c 根据具体的内存使用情况 xff0c 追踪相应slab cache的分配堆栈流程 xff0c 是追踪泄