• 如何知道你的Linux内核占用的内存大小?


    1、代码段等

    内核所需的代码段、bss段,内核栈等。

    / #  dmesg  | grep Memory
    Memory policy: Data cache writealloc
    Memory: 180784K/524288K available (6912K kernel code, 327K rwdata, 2380K rodata, 400K init, 424K bss, 15824K reserved, 327680K cma-reserved, 0K highmem)
    
    • 1
    • 2
    • 3

    从dmesg信息中我们了解到各个部分的使用情况:

    描述含义
    空闲内存大小180784K
    所有物理内存大小524288K(我这边是512M的内存)
    kernel code6912K
    rwdata327K
    rodata2380K
    init(临时区域,后续会释放)400K
    bss424K
    reserved(内核保留,后续回释放)15824K
    cma-reserved327680K

    所以我们得到这些乱七八糟的段使用的内存大小为(也就是内核保留的内存):15824K

    2、kernel heap

    在内核中动态申请的内存分为两种:kmalloc和vmalloc。

    2.1、kmalloc

    kmalloc申请的内存在物理上是连续的。并且是通过slab分配的内存,所以知道slab的内存大小就知道了kmalloc的大小。

    如何查看kmalloc申请的内存?

    / # cat /proc/meminfo
    Slab:               6060 kB
    SReclaimable:       1848 kB		//可释放的slab
    SUnreclaim:         4212 kB		//不可释放的slab
    
    • 1
    • 2
    • 3
    • 4

    故kmalloc所占的内存大小为:6060 kB

    2.2、vmalloc

    vmalloc可以通过命令cat /proc/vmallocinfo查看:

    / #  cat /proc/vmallocinfo
    0x8c000000-0xa0000000 335544320 iotable_init+0x0/0xb4 phys=8c000000 ioremap
    0xa0800000-0xa0802000    8192 of_iomap+0x2c/0x34 phys=a01000 ioremap
    0xa0806000-0xa0808000    8192 bpf_prog_alloc+0x34/0xa4 pages=1 vmalloc
    0xa0808000-0xa080d000   20480 of_iomap+0x2c/0x34 phys=2098000 ioremap
    0xa080e000-0xa0810000    8192 devm_ioremap_nocache+0x38/0x74 phys=20c9000 ioremap
    0xa0810000-0xa0815000   20480 devm_ioremap_nocache+0x38/0x74 phys=209c000 ioremap
    0xa0816000-0xa0818000    8192 devm_ioremap_nocache+0x38/0x74 phys=20ca000 ioremap
    0xa0818000-0xa081d000   20480 devm_ioremap_nocache+0x38/0x74 phys=20a0000 ioremap
    0xa081e000-0xa0820000    8192 devm_ioremap_nocache+0x38/0x74 phys=2184000 ioremap
    0xa0820000-0xa083c000  114688 devm_ioremap_wc+0x38/0x74 phys=905000 ioremap
    0xa083c000-0xa083f000   12288 devm_ioremap_nocache+0x38/0x74 phys=1804000 ioremap
    0xa0840000-0xa0845000   20480 devm_ioremap_nocache+0x38/0x74 phys=20a4000 ioremap
    0xa0846000-0xa0848000    8192 devm_ioremap_nocache+0x38/0x74 phys=2184000 ioremap
    0xa0848000-0xa084d000   20480 devm_ioremap_nocache+0x38/0x74 phys=20a8000 ioremap
    0xa084e000-0xa0850000    8192 devm_ioremap_nocache+0x38/0x74 phys=2184000 ioremap
    0xa0850000-0xa0855000   20480 devm_ioremap_nocache+0x38/0x74 phys=20ac000 ioremap
    0xa0858000-0xa085d000   20480 of_iomap+0x2c/0x34 phys=20e4000 ioremap
    0xa0860000-0xa0865000   20480 of_iomap+0x2c/0x34 phys=21bc000 ioremap
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    其中每个字段的含义可以在内核的文档中找到,路径如下:/Documentation/filesystems/proc.txt
    在这里插入图片描述
    这里有很多其他函数申请的内存,我们可以过滤一下vmalloc:

    / # cat /proc/vmallocinfo | grep vmalloc
    0xa0806000-0xa0808000    8192 bpf_prog_alloc+0x34/0xa4 pages=1 vmalloc
    0xa0891000-0xa08d4000  274432 jffs2_zlib_init+0x14/0x74 pages=66 vmalloc
    0xa08d4000-0xa08e0000   49152 jffs2_zlib_init+0x2c/0x74 pages=11 vmalloc
    0xa0945000-0xa094a000   20480 drm_ht_create+0x4c/0x70 pages=4 vmalloc
    0xa09da000-0xa09de000   16384 n_tty_open+0x10/0xc8 pages=3 vmalloc
    0xa0a3d000-0xa0a62000  151552 deflate_init+0x1c/0xc4 pages=36 vmalloc
    0xa0a62000-0xa0a6e000   49152 deflate_init+0x58/0xc4 pages=11 vmalloc
    0xa0a6e000-0xa0a72000   16384 n_tty_open+0x10/0xc8 pages=3 vmalloc
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    其中的第二列就是vmalloc的大小,我们把所有的大小加起来就可以得到其总和:

    / # grep vmalloc /proc/vmallocinfo  |awk '{total+=$2};END {print total}'
    585728
    
    • 1
    • 2

    我们将其转换为KB: 585728= 572 KB

    故内核堆内存为: 6060 kB + 572 KB = 6632KB

    3、进程的页表

    进程的页表可以通过/proc/meminfo得到:

    / # cat /proc/meminfo | grep Table
    PageTables:          104 kB
    
    • 1
    • 2

    可以看到进程的页表大小为:104 kB

    4、内核占用内存大小总和

    综上所述,当前内核所占用的内存大小为:15824K + 6632KB + 104KB = 22M

  • 相关阅读:
    经纬恒润再次荣获PACCAR集团 10PPM 质量奖
    甲氧基PEG多巴胺DPA-mPEG,Dopamine-mPEG,PEG化的多巴胺具有良好的水溶性
    js 连接快手打印组件并实现打印
    部署OKR需要克服的四大难关
    后端开发进阶之路:后端开发核心竞争力之一抽象建模能力
    tailwindcss安装完插件代码不提示
    tinymce prism代码高亮图文详解
    java实现前后端分离文件下载
    LVGL界面卡顿优化总结
    算法2:链表的逆转
  • 原文地址:https://blog.csdn.net/weixin_45309916/article/details/128076625