欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

slab 内存泄漏

程序员文章站 2022-04-18 22:55:41
...

kernel log 出现 lowmemorykiller 判断 kernel 出现了内存泄漏

  1. 多次测试后对比 procrank 数据 寻找内存泄漏可能的原因
    adb shell procrank > C:\procrank.txt
    测试前:
    RAM: 1814588K total, 359780K free, 7372K buffers, 701496K cached, 964K shmem, 138804K slab
    测试后:
    RAM: 1814588K total, 229016K free, 10204K buffers, 710408K cached, 1056K shmem, 146024K slab
    发现 slab 明显的增大。
  2. 查看slabinfo 确定泄漏地方
    adb shell pcat /proc/slabinfo > C:\slabinfo.txt
    测试前:
kmalloc-8192         180    180   8192    4    8 : tunables    0    0    0 : slabdata     45     45      0
kmalloc-4096         203    232   4096    8    8 : tunables    0    0    0 : slabdata     29     29      0
kmalloc-2048         576    576   2048   16    8 : tunables    0    0    0 : slabdata     36     36      0
kmalloc-1024        1072   1072   1024   16    4 : tunables    0    0    0 : slabdata     67     67      0
kmalloc-512         1534   1568    512   16    2 : tunables    0    0    0 : slabdata     98     98      0
kmalloc-256        12937  13104    256   16    1 : tunables    0    0    0 : slabdata    819    819      0
kmalloc-128        50144  50144    128   32    1 : tunables    0    0    0 : slabdata   1567   1567      0

测试后:

kmalloc-8192         181    184   8192    4    8 : tunables    0    0    0 : slabdata     46     46      0
kmalloc-4096         232    232   4096    8    8 : tunables    0    0    0 : slabdata     29     29      0
kmalloc-2048         608    608   2048   16    8 : tunables    0    0    0 : slabdata     38     38      0
kmalloc-1024        1082   1104   1024   16    4 : tunables    0    0    0 : slabdata     69     69      0
kmalloc-512         3856   3856    512   16    2 : tunables    0    0    0 : slabdata    241    241      0
kmalloc-256        14447  14992    256   16    1 : tunables    0    0    0 : slabdata    937    937      0
kmalloc-128        48967  49888    128   32    1 : tunables    0    0    0 : slabdata   1559   1559      0

发现明显的增大。

  1. 打开kernel 调试功能
    重新配置kernel选项,打开如下选项即可。
    CONFIG_SLUB=y
    CONFIG_SLUB_DEBUG=y
    CONFIG_SLUB_DEBUG_ON=y
    之后进行测试:
  2. 查看异常kmem_cache 的统计信息
    cat > /sys/kernel/slab/kmalloc-256/alloc_calls 或者free_calls
  3. 查看每次的申请或释放的调用栈
    echo 1 > /sys/kernel/slab/kmalloc-256/trace

通过上述 log 进一步分析出错的地方

相关标签: linux驱动