linux 内核OOM问题定位-SLAB_DEBUG

news/2025/1/13 15:27:49 标签: linux, 运维, 服务器

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.niftyadmin.cn/n/5821993.html

相关文章

C语言之旅5--分支与循环【2】

本章概述 while循环for循环do-while循环break和continue语句循环嵌套goto语句彩蛋时刻!!! while循环 概述:C语言提供了3种循环语句,while就是其中一种。另外2种分别是for和do-while。接下来介绍while语句。while语句和…

Web基础之什么是HTTP协议

Q:什么是HTTP协议? 概念:Hyper Text Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。 特点: 1.基于TCP协议:面向连接,安全 2.基…

ip属地什么条件会改变?多角度深入探讨

IP属地,即IP地址的归属地,是互联网上设备连接时的一个关键信息,它通常反映了设备连接互联网时的地理位置。随着社交软件及各大平台推出IP归属地显示功能,IP属地的变化问题逐渐受到广大用户的关注。那么,IP属地在什么条…

书说 MySQL 的悲观锁和乐观锁

什么是乐观锁?什么是悲观锁? 悲观锁: 悲观锁是一种基于悲观态度的控制机制(最坏的程度想,每次并发一定会造成阻塞),用于防止数据冲突。它采取预防性措施,在修改数据之前将其锁定&a…

Python----Python基础(元组 tuple,元组的创建,基本操作:访问,连接,索引,计数,长度,最大值,最小值,求和,判断,排序)

一、元组tuple 列表属于可变序列,可以任意修改列表中的元素。 元组属于不可变序列,不能修改元组中的元素。 因此,元组没有增加元素、修改元素、删除元素相关的方法。 二、元组的创建 2.1、使用()方式创建元组 使用圆括号 () 可以创建一个…

深度学习的加速器:Horovod,让分布式训练更简单高效!

什么是 Horovod? Horovod 是 Uber 开发的一个专注于深度学习分布式训练的开源框架,旨在简化和加速多 GPU、多节点环境下的训练过程。它以轻量级、易用、高性能著称,特别适合需要快速部署分布式训练的场景。Horovod 的名字来源于俄罗斯传统舞…

【Java回顾】Day6 JUC锁

JUC锁 AQS(AbstractQueuedSynchronizer)&condition AQS(AbstractQueuedSynchronizer) 队列同步器,以模板方式模式,构建锁或其他同步组件的基础框架,如ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch等。具体的同步逻…

django在线考试系统

Django在线考试系统是一种基于Django框架开发的在线考试平台,它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境,满足教育机构、企业、个人等不同场景下的考试需求。通过该系统,用…