K230 内存分析指南
1.小核内存占用分析
1.1 linux内核静态占用
1.1.1 size工具
使用size工具可以查看内核镜像的text、data、bss等大小,vmlinux所在位置为 k230_sdk/output/k230_evb_defconfig/little/linux 进入该目录使用size工具查看vmlinux
$ size -G vmlinux
text data bss total filename
9550790 5033374 375793 14959957 vmlinux
1.1.2 ksize.py脚本
在linux源码的tools目录内有一个ksize.py脚本,可以对内核目录下的built-in.a做解析,并将解析内容按照尺寸排序显示。
$ ./source/tools/ksize.py vmlinux
Linux Kernel total | text data bss
--------------------------------------------------------------------------------
vmlinux 14959957 | 10010970 4573194 375793
--------------------------------------------------------------------------------
drivers/built-in.a 4060898 | 3757793 257384 45721
fs/built-in.a 3450902 | 2984349 439120 27433
net/built-in.a 3103220 | 2635627 392278 75315
kernel/built-in.a 2258370 | 1402705 668085 187580
mm/built-in.a 581664 | 480740 94560 6364
lib/built-in.a 494079 | 488689 3038 2352
block/built-in.a 242212 | 219496 20060 2656
crypto/built-in.a 165559 | 151371 14113 75
arch/riscv/built-in.a 117201 | 46516 43788 26897
ipc/built-in.a 60699 | 57375 3296 28
security/built-in.a 45740 | 43716 1944 80
init/built-in.a 31148 | 20394 10617 137
certs/built-in.a 1241 | 1217 16 8
usr/built-in.a 520 | 520 0 0
--------------------------------------------------------------------------------
sum 14613453 | 12290508 1948299 374646
delta 346504 | -2279538 2624895 1147
drivers total | text data bss
--------------------------------------------------------------------------------
drivers/built-in.a 4060898 | 3757793 257384 45721
--------------------------------------------------------------------------------
drivers/net/built-in.a 620309 | 589318 30918 73
drivers/usb/built-in.a 531811 | 500758 27947 3106
drivers/gpu/built-in.a 436282 | 426932 9262 88
drivers/media/built-in.a 305133 | 282425 12048 10660
drivers/mtd/built-in.a 287895 | 272626 12317 2952
drivers/tty/built-in.a 256154 | 225035 21385 9734
drivers/base/built-in.a 206309 | 191470 13710 1129
drivers/mmc/built-in.a 178193 | 168267 9882 44
drivers/scsi/built-in.a 150154 | 124680 24788 686
drivers/hid/built-in.a 106225 | 97793 8360 72
drivers/clk/built-in.a 90344 | 83123 7141 80
drivers/video/built-in.a 83938 | 76886 3240 3812
drivers/gpio/built-in.a 77888 | 74920 2920 48
drivers/i2c/built-in.a 73855 | 61913 8438 3504
drivers/input/built-in.a 71037 | 68181 2836 20
drivers/of/built-in.a 64023 | 58745 602 4676
drivers/spi/built-in.a 56824 | 50320 6480 24
drivers/char/built-in.a 45568 | 34511 10265 792
drivers/dma/built-in.a 37291 | 35993 1062 236
drivers/firmware/built-in.a 36744 | 33437 2477 830
drivers/crypto/built-in.a 31999 | 27463 3292 1244
drivers/thermal/built-in.a 30926 | 27157 3752 17
drivers/dma-buf/built-in.a 29547 | 26747 2668 132
drivers/virtio/built-in.a 27405 | 25984 1413 8
drivers/iio/built-in.a 27146 | 26470 664 12
drivers/block/built-in.a 25557 | 24084 1393 80
drivers/power/built-in.a 22133 | 14605 6848 680
drivers/soc/built-in.a 19576 | 10632 8912 32
drivers/leds/built-in.a 14605 | 13945 636 24
drivers/pwm/built-in.a 13628 | 11708 1792 128
drivers/watchdog/built-in.a 13598 | 13067 501 30
drivers/ras/built-in.a 12633 | 8089 4528 16
drivers/nvmem/built-in.a 11866 | 10962 904 0
drivers/misc/built-in.a 10180 | 9916 264 0
drivers/perf/built-in.a 8979 | 7839 488 652
drivers/reset/built-in.a 8579 | 8095 484 0
drivers/phy/built-in.a 7297 | 7138 151 8
drivers/irqchip/built-in.a 5992 | 5248 728 16
drivers/clocksource/built-in.a 3633 | 3229 400 4
drivers/canaan-hwtimer/built-in.a 3553 | 3273 224 56
drivers/mfd/built-in.a 2350 | 2122 224 4
drivers/canaan-hardlock/built-in.a 1312 | 1096 208 8
drivers/pci/built-in.a 164 | 164 0 0
--------------------------------------------------------------------------------
sum 4048635 | 3746366 256552 45717
delta 12263 | 11427 832 4
fs total | text data bss
--------------------------------------------------------------------------------
fs/built-in.a 3450902 | 2984349 439120 27433
--------------------------------------------------------------------------------
fs/nfs/built-in.a 831393 | 586545 243616 1232
fs/*.o 605562 | 543984 44914 16664
fs/ext4/built-in.a 535651 | 439889 94598 1164
fs/ubifs/built-in.a 233606 | 232778 704 124
fs/ntfs/built-in.a 178875 | 175071 3724 80
fs/nls/built-in.a 147032 | 146220 552 260
fs/proc/built-in.a 103930 | 102710 1140 80
fs/jffs2/built-in.a 89382 | 88050 1032 300
fs/hfsplus/built-in.a 89010 | 66622 22372 16
fs/fuse/built-in.a 83342 | 82094 1192 56
fs/jbd2/built-in.a 79685 | 67144 12421 120
fs/fat/built-in.a 62368 | 61689 627 52
fs/lockd/built-in.a 56531 | 52860 1415 2256
fs/ext2/built-in.a 51552 | 51288 256 8
fs/exfat/built-in.a 50232 | 49891 293 48
fs/hfs/built-in.a 44570 | 44342 220 8
fs/9p/built-in.a 38537 | 37968 541 28
fs/iomap/built-in.a 29506 | 23726 5556 224
fs/kernfs/built-in.a 24668 | 20038 494 4136
fs/debugfs/built-in.a 24646 | 24342 288 16
fs/configfs/built-in.a 23513 | 22733 752 28
fs/autofs/built-in.a 21641 | 21433 208 0
fs/notify/built-in.a 20350 | 18913 972 465
fs/sysfs/built-in.a 11121 | 10825 276 20
fs/devpts/built-in.a 4019 | 3383 628 8
fs/tracefs/built-in.a 3327 | 3191 120 16
fs/exportfs/built-in.a 2512 | 2488 24 0
fs/ramfs/built-in.a 2379 | 2299 80 0
fs/nfs_common/built-in.a 1962 | 1833 105 24
--------------------------------------------------------------------------------
sum 3450902 | 2984349 439120 27433
delta 0 | 0 0 0
net total | text data bss
--------------------------------------------------------------------------------
net/built-in.a 3103220 | 2635627 392278 75315
--------------------------------------------------------------------------------
net/wireless/built-in.a 537167 | 416358 118041 2768
net/mac80211/built-in.a 530597 | 448777 81720 100
net/core/built-in.a 496384 | 441682 49334 5368
net/ipv4/built-in.a 490329 | 455868 21793 12668
net/sunrpc/built-in.a 424309 | 301164 86725 36420
net/ipv6/built-in.a 330602 | 305628 12017 12957
net/9p/built-in.a 74446 | 59002 15140 304
net/ethtool/built-in.a 65232 | 64314 831 87
net/netlink/built-in.a 37972 | 36352 1584 36
net/unix/built-in.a 31131 | 26138 876 4117
net/packet/built-in.a 29875 | 29087 786 2
net/*.o 26420 | 24930 1014 476
net/sched/built-in.a 14230 | 12813 1417 0
net/bpf/built-in.a 6775 | 6211 564 0
net/dns_resolver/built-in.a 4191 | 3835 344 12
net/ethernet/built-in.a 3560 | 3468 92 0
--------------------------------------------------------------------------------
sum 3103220 | 2635627 392278 75315
delta 0 | 0 0 0
kernel total | text data bss
--------------------------------------------------------------------------------
kernel/built-in.a 2258370 | 1402705 668085 187580
--------------------------------------------------------------------------------
kernel/printk/built-in.a 639702 | 28763 469075 141864
kernel/*.o 395328 | 331882 45935 17511
kernel/bpf/built-in.a 301274 | 289172 11737 365
kernel/trace/built-in.a 291112 | 215997 64131 10984
kernel/sched/built-in.a 196488 | 162431 27197 6860
kernel/time/built-in.a 106971 | 81903 19636 5432
kernel/events/built-in.a 92144 | 85731 5349 1064
kernel/cgroup/built-in.a 81197 | 61877 17188 2132
kernel/rcu/built-in.a 59568 | 54698 4731 139
kernel/irq/built-in.a 54302 | 50862 2300 1140
kernel/locking/built-in.a 24859 | 24667 188 4
kernel/dma/built-in.a 12733 | 12246 422 65
kernel/power/built-in.a 2692 | 2476 196 20
--------------------------------------------------------------------------------
sum 2258370 | 1402705 668085 187580
delta 0 | 0 0 0
lib total | text data bss
--------------------------------------------------------------------------------
lib/built-in.a 494079 | 488689 3038 2352
--------------------------------------------------------------------------------
lib/*.o 283551 | 279738 3605 208
lib/zstd/built-in.a 217655 | 217655 0 0
lib/mpi/built-in.a 38286 | 38206 32 48
lib/crypto/built-in.a 19029 | 18505 524 0
lib/zlib_deflate/built-in.a 17786 | 15394 108 2284
lib/lz4/built-in.a 17757 | 17757 0 0
lib/zlib_inflate/built-in.a 11310 | 11310 0 0
lib/xz/built-in.a 10127 | 10055 72 0
lib/fonts/built-in.a 4597 | 4597 0 0
lib/lzo/built-in.a 4048 | 4048 0 0
lib/math/built-in.a 2111 | 2099 12 0
--------------------------------------------------------------------------------
sum 626257 | 619364 4353 2540
delta -132178 | -130675 -1315 -188
block total | text data bss
--------------------------------------------------------------------------------
block/built-in.a 242212 | 219496 20060 2656
--------------------------------------------------------------------------------
block/*.o 198068 | 176004 19428 2636
block/partitions/built-in.a 44144 | 43492 632 20
--------------------------------------------------------------------------------
sum 242212 | 219496 20060 2656
delta 0 | 0 0 0
crypto total | text data bss
--------------------------------------------------------------------------------
crypto/built-in.a 165559 | 151371 14113 75
--------------------------------------------------------------------------------
crypto/*.o 145243 | 131544 13645 54
crypto/asymmetric_keys/built-in.a 20316 | 19827 468 21
--------------------------------------------------------------------------------
sum 165559 | 151371 14113 75
delta 0 | 0 0 0
arch/riscv total | text data bss
--------------------------------------------------------------------------------
arch/riscv/built-in.a 117201 | 46516 43788 26897
--------------------------------------------------------------------------------
arch/riscv/kernel/built-in.a 67393 | 38009 27176 2208
arch/riscv/mm/built-in.a 49808 | 8507 16612 24689
arch/riscv/lib/built-in.a 24 | 16 8 0
--------------------------------------------------------------------------------
sum 117225 | 46532 43796 26897
delta -24 | -16 -8 0
security total | text data bss
--------------------------------------------------------------------------------
security/built-in.a 45740 | 43716 1944 80
--------------------------------------------------------------------------------
security/keys/built-in.a 40288 | 38340 1880 68
security/*.o 5452 | 5376 64 12
--------------------------------------------------------------------------------
sum 45740 | 43716 1944 80
delta
1.1.3 nm命令
nm命令可以查看内核模块中各个符号的尺寸。例如
$ nm --size -r vmlinux | head -10
0000000000058000 d _printk_rb_static_infos
0000000000020000 b __log_buf
0000000000018000 d _printk_rb_static_descs
0000000000008000 b write_buf.0
0000000000008000 d ftrace_stacks
0000000000003b88 r edid_cea_modes_1
0000000000003b2e T hidinput_connect
00000000000039c0 R v4l2_dv_timings_presets
0000000000002b4e t ntfs_fill_super
0000000000002b4c t ext4_fill_super
输出的结果共有三列数据,分别标识大小、符号类型、符号名。对于符号类型
- b/B - 符号位于bss段
- t/T - 符号位于text段
- d/D - 符号位于data段
- r/R - 符号位于rodata段
1.2 linux动态占用分析
1.2.1 free
在linux用户态命令行中,执行free命令即可获得当前系统的内存使用情况
[root@canaan ~ ]#free
total used free shared buff/cache available
Mem: 106028 28260 39824 84 37944 57024
Swap: 0 0 0
- total:Linux内核可支配的内存
- used:系统已使用的内存
- free:系统空闲的内存
- shared:共享内存
- buff/cache:被 buffer 和 cache 使用的物理内存大小
- available:还可以被应用程序使用的物理内存大小
1.2.2 /proc/meminfo节点
可通过cat /proc/meminfo进一步观察linux的内存使用情况
[root@canaan ~ ]#cat /proc/meminfo
MemTotal: 106028 kB
MemFree: 39744 kB
MemAvailable: 56976 kB
Buffers: 356 kB
Cached: 10052 kB
SwapCached: 0 kB
Active: 5024 kB
Inactive: 7008 kB
Active(anon): 84 kB
Inactive(anon): 1624 kB
Active(file): 4940 kB
Inactive(file): 5384 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 1660 kB
Mapped: 3520 kB
Shmem: 84 kB
KReclaimable: 27600 kB
Slab: 39244 kB
SReclaimable: 27600 kB
SUnreclaim: 11644 kB
KernelStack: 912 kB
PageTables: 240 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 53012 kB
Committed_AS: 14572 kB
VmallocTotal: 67108863 kB
VmallocUsed: 2440 kB
VmallocChunk: 0 kB
Percpu: 136 kB
- MemTotal、MemFree、Buffers、Cached、SwapCached参考free的说明
- MemAvailable:使用MemFree、Active(file)、Inactive(file)、SReclaimable和/proc/zoneinfo中的low watermark根据特定算法计算得出,是一个估值,并不准确。可用来评估应用程序层面可用的内存。
- Active/Inactive: Active表示最近使用的内存,回收的优先级低;Inactive表示最近较少使用的内存,回收的优先极高。
- AnonPages 匿名页
- Mapped:设备或文件映射的大小。比如共享内存、动态库、mmap的文件等都统计在该内存中。
- slab/SReclaimable/SUnreclaim:内核slab使用的内存,包括可回收与不可回收部分。
- KernelStack:内核栈大小
- PageTables:页表的大小(用于将虚拟地址翻译为物理地址),内存分配越多,此块儿内存就会增大。
- CommitLimit/Committed_AS: overcommit 的阈值/已经申请的内存大小(不是已分配)。Overcommit是Linux一种内存申请处理方式,为了跑更多更大的程序,大部分申请内存的请求都回复”yes”, 总申请的内存大于总物理内存。
- VmallocTotal/VmallocUsed/VmallocChunk: vmalloc区域大小/vmalloc区域使用大小/vmalloc区域中最大可用的连续区块大小。