linux 内核OOM问题定位-SLAB_DEBUG

news/2025/1/14 3:59:03/

1,配置menuconfig

Kernel hacking > Memory Debugging 

配置 config=y

[*] SLUB debugging on by default                                                                 
[*] Enable SLUB performance statistics 

配置之前

lark@ubuntu:~/Public/rk356x-linux/rk356x-linux/kernel$ cat .config | grep "CONFIG_SLUB"
CONFIG_SLUB_SYSFS=y
CONFIG_SLUB_DEBUG=y
# CONFIG_SLUB_MEMCG_SYSFS_ON is not set
CONFIG_SLUB=y
CONFIG_SLUB_CPU_PARTIAL=y
# CONFIG_SLUB_DEBUG_ON is not set
# CONFIG_SLUB_STATS is not set
.

配置之后看.config

 lark@ubuntu:~/Public/rk356x-linux/rk356x-linux/kernel$ cat .config | grep "CONFIG_SLUB"
CONFIG_SLUB_SYSFS=y
CONFIG_SLUB_DEBUG=y
# CONFIG_SLUB_MEMCG_SYSFS_ON is not set
CONFIG_SLUB=y
CONFIG_SLUB_CPU_PARTIAL=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_SLUB_STATS=y

或者配置defconfig,配置完之后需要clean后再编译

Public\rk356x-linux\rk356x-linux\kernel\arch\arm64\configs\rockchip_linux_defconfig

 改后的代码路径rk356x-linux\kernel\mm\Makefile

obj-$(CONFIG_KSM) += ksm.o
obj-$(CONFIG_PAGE_POISONING) += page_poison.o
obj-$(CONFIG_SLAB) += slab.o
obj-$(CONFIG_SLUB) += slub.o
obj-$(CONFIG_KASAN)    += kasan/
obj-$(CONFIG_KFENCE) += kfence/
obj-$(CONFIG_FAILSLAB) += failslab.o

SLAB或者SLUB有一个用就可以,改menuconfig没有clean会覆盖之前的更改,现在看一下编译的过程。编译的流程

 make -C /home/lark/Public/rk356x-linux/rk356x-linux/kernel/ -j5 CROSS_COMPILE=/home/lark/Public/rk356x-linux/rk356x-linux/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu- ARCH=arm64 rockchip_linux_defconfig

更改slab除了menuconfig之外可以在 rockchip_linux_defconfig中更改,配置完重新编译之后:

lark@ubuntu:~/Public/rk356x-linux/rk356x-linux/kernel$ cat .config | grep "SLUB"
CONFIG_SLUB_SYSFS=y
CONFIG_SLUB_DEBUG=y
# CONFIG_SLUB_MEMCG_SYSFS_ON is not set
CONFIG_SLUB=y
CONFIG_SLUB_CPU_PARTIAL=y
CONFIG_SLUB_DEBUG_ON=y
CONFIG_SLUB_STATS=y

当slab_unreclamiable一直增加时我们怀疑是内核态内存泄漏,这个时候我们可以看是哪个kmalloc申请的内存多。

首先看slabinfo按的size排序查看 slub object,可以查看 space 总占用大小,及objects个数判断泄漏点 为kmalloc-128。

当没看到/sys/kernel/debug或者没有权限或者打开失败后:

umount /sys/fs/bpf /sys/kernel/debug/

mount -t debugfs none /sys/kernel/debug

那个泄露多看/sys/kernel/debug的slab/kmalloc*-的alloc-traces和free-traces。

root@ubuntu2004:/sys/kernel/debug/slab/kmalloc-128# ls
alloc_traces  free_traces 

root@ubuntu2004:#cat alloc_traces

root@ubuntu2004:#cat free_traces

主动去触发slub debug检查 

echo 1 > /sys/kernel/slab/kmalloc-128/validate 

1,查看slab 使用状态
cat /proc/slabinfo 
2,查看slab debug信息,统计状态等
/sys/kernel/slab/*

root@ubuntu2004:/sys/kernel/slab/kmalloc-128# echo 1 > validate

root@ubuntu2004:/sys/kernel/slab/kmalloc-128# echo 1 > trace

3,调试内存泄漏,踩踏等信息
/sys/kernel/debug/slab/* 

root@ubuntu2004:/sys/kernel/debug/slab/kmalloc-128#cat alloc_traces
 

对比alloc和free次数,找到比较多的。 

 跟踪代码

rk356x-linux\kernel\net\rfkill\rfkill-wlan.c

static int rfkill_wlan_remove(struct platform_device *pdev)
{
    struct rfkill_wlan_data *rfkill = platform_get_drvdata(pdev);

    LOG("Enter %s\n", __func__);

    wake_lock_destroy(&rfkill->wlan_irq_wl);

    fb_unregister_client(&rfkill_wlan_fb_notifier);

    if (gpio_is_valid(rfkill->pdata->power_n.io))
        gpio_free(rfkill->pdata->power_n.io);

    if (gpio_is_valid(rfkill->pdata->reset_n.io))
        gpio_free(rfkill->pdata->reset_n.io);

     //此处没有kfree

      // kfree(rfkill);
       //   g_rfkill = NULL;

    return 0;
}


http://www.ppmy.cn/news/1562954.html

相关文章

解决Oracle SQL语句性能问题——常用Hint及语法(查询转化相关Hint)

10.5.3. 常用Hint 10.5.3.5. 查询转化相关Hint 1)merge:显式的指示优化器合并SQL语句中的视图。该Hint具体语法如下所示。 SQL> select /*+ merge[(@qb)|([@qb] view)] */ ...; --注: 1)这里,参数(@qb|[@qb] view)为可选参数,指定查询语句块名和进行合并的视图。…

STM32: 输入捕获基本结构

输入捕获基本结构 1. GPIO GPIO: 通用输入输出引脚,用于接收外部信号。滤波器: 对GPIO接收到的信号进行滤波处理,以去除噪声干扰。 2. 边沿检测/极性选择 边沿检测: 检测GPIO信号的上升沿或下降沿。极性选择: 选择触发事件的边沿(上升沿、…

设计模式从入门到精通之(四)建造者模式

建造者模式:逐步构建复杂对象的艺术 在实际开发中,我们经常需要创建复杂对象,比如一份精美的菜单、一辆配置丰富的汽车,或者一套搭配完美的家居。而这些对象的构建往往需要分步骤进行,并且每一步都可能有不同的选择。 …

后端技术选型 sa-token校验学习 下 结合项目学习 后端鉴权

目录 后端注册拦截器 实现对 WebMvcConfigurer 接口的类实现 静态变量 方法重写 注册 Spring Framework拦截器 Sa-Token中SaServletFilter拦截器 思考 为什么使用两个拦截器 1. Spring Framework 拦截器 2. SaServletFilter 为什么要注册两个拦截器? 总结 …

Linux内核学习——数据结构

文章目录 链表双向链表哈希链表 红黑树无锁环形缓冲区映射参考 内核版本:linux-6.6.69 longterm 链表 双向链表 Linux内核实现了一套纯链表的封装,链表节点数据结构只有指针区而没有数据区,另外还封装了各种操作函数,如创建节点…

Linux一键安装Docker和Docker Compose

Centos docker安装脚本 #!/bin/bash# docker_manager.sh # 用于管理 Docker 和 Docker Compose 的交互脚本# # 配置变量 # # Docker 仓库地址 DOCKER_REPO"https://download.docker.com/linux/centos/docker-ce.repo"# # 函数定义 # # 安装 Docker 和 Docker Comp…

Android 判断RecyclerView是否滚动到底部

需求:列表滚动后,判断是否滚动到底部,展示加载更多的Loading文案和动画 binding.watchMoreRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {sup…

vue 打包部署后 无法找到 app.js 文件

资料 Vue报错:This dependency was not found_vue this dependency was not found:-CSDN博客 过程 大概原因和上面的一样, 在打包好的 文件目录里面出现了这样的 格式: 实际上不需要 最前面的斜杠 解决 加上,重新打包,部署就好了 publicPath: "…