Rockchip Linux Memory Debugging Common Commands
ID: RK-KF-YF-140
Release Version: V1.0.0
Date: 2021-01-06
Security Level: □Top Secret □Secret □Internal ■Public
DISCLAIMER
This document is provided "as is". Rockchip Electronics Co., Ltd. ("the Company") makes no express or implied representations or warranties regarding the accuracy, reliability, completeness, merchantability, fitness for a particular purpose, or non-infringement of any statements, information, or content in this document. This document is for reference as a usage guide only.
Due to product version upgrades or other reasons, this document may be updated or modified from time to time without any notice.
Trademark Statement
"Rockchip", "Rockchip", "Rockchip" are registered trademarks of the Company and belong to the Company.
All other registered trademarks or trademarks mentioned in this document are owned by their respective owners.
Copyright © 2021 Rockchip Electronics Co., Ltd.
Beyond the scope of fair use, without the written permission of the Company, no individual or entity may extract, copy, or distribute part or all of the content of this document in any form.
Rockchip Electronics Co., Ltd.
Address: No. 18, Area A, Software Park, Tongpan Road, Fuzhou, Fujian Province
Website: www.rock-chips.com
Customer Service Tel: +86-4007-700-590
Customer Service Fax: +86-591-83951833
Customer Service Email: fae@rock-chips.com
Preface
Overview
This document introduces common commands related to memory during Linux development, including viewing total memory size, usage, and reserved memory size.
Product Versions
| Chip Name | Kernel Version |
|---|---|
| ARM series chips | 4.19 |
Intended Audience
This document (guide) is mainly applicable to the following engineers:
Technical Support Engineers
Software Development Engineers
Revision History
| Version | Author | Date | Description |
|---|---|---|---|
| V1.0.0 | Xu Jianqun | 2021-01-06 | Initial version |
Table of Contents
[TOC]
Total Memory Info
meminfo
-
cat /proc/meminfo
MemTotal: 1497696 kBMemFree: 590524 kBMemAvailable: 773252 kBBuffers: 768 kBCached: 216892 kBSwapCached: 14204 kBActive: 260884 kBInactive: 176744 kBActive(anon): 120620 kBInactive(anon): 106688 kBActive(file): 140264 kBInactive(file): 70056 kBUnevictable: 3224 kBMlocked: 3224 kBSwapTotal: 748844 kBSwapFree: 346156 kBDirty: 776 kBWriteback: 0 kBAnonPages: 220804 kBMapped: 194276 kBShmem: 4968 kBKReclaimable: 43900 kBSlab: 111060 kBSReclaimable: 40648 kBSUnreclaim: 70412 kBKernelStack: 18496 kBPageTables: 42096 kBNFS_Unstable: 0 kBBounce: 0 kBWritebackTmp: 0 kBCommitLimit: 1497692 kBCommitted_AS: 41751048 kBVmallocTotal: 263061440 kBVmallocUsed: 30368 kBVmallocChunk: 0 kBPercpu: 2528 kBCmaTotal: 532480 kBCmaFree: 0 kB
MemTotal = MemFree + Buffers + Cached
Swap: SwapTotal/SwapFree, enabled and allocated by system scripts using the swap command
Swap partitions are special hard disk space. When actual memory is insufficient, the operating system takes temporarily unused data from memory and places it in the swap partition, freeing up enough memory space for currently running programs.
Slab: Current Slab usage size, including reclaimable SReclaimable and unreclaimable SUnreclaim. If it grows too large, there may be a memory leak.
Vmalloc: VmallocTotal is the total size, VmallocUsed is the used size.
Cma: CmaTotal is the total size, CmaFree is the free size.
When CMA is borrowed by the system, it is also considered used, and CmaFree decreases.
sysrq-trigger
-
echo m > /proc/sysrq-trigger
Mem-Info:active_anon:43194 inactive_anon:26284 isolated_anon:0active_file:35286 inactive_file:17959 isolated_file:0unevictable:806 dirty:0 writeback:0 unstable:0slab_reclaimable:10164 slab_unreclaimable:17630mapped:48836 shmem:1280 pagetables:10550 bounce:0free:134653 free_pcp:717 free_cma:0Node 0 active_anon:172776kB inactive_anon:105136kB active_file:141144kB inactive_file:71836kB unevictable:3224kB isolated(anon):0kB isolated(file):0kB mapped:195344kB dirty:0kB writeback:0kB shmeoDMA32 free:538612kB min:4884kB low:24024kB high:25520kB active_anon:172776kB inactive_anon:105136kB active_file:141144kB inactive_file:71836kB unevictable:3224kB writepending:0kB present:2095104kBlowmem_reserve[]: 0 0 0DMA32: 13625*4kB (UEH) 12210*8kB (UEH) 8286*16kB (UMEH) 4151*32kB (UMEH) 1157*64kB (UMEH) 223*128kB (UM) 46*256kB (U) 9*512kB (U) 2*1024kB (U) 0*2048kB 0*4096kB = 538612kB58687 total pagecache pages3564 pages in swap cacheSwap cache stats: add 155134, delete 151579, find 11930/52536Free swap = 346412kBTotal swap = 748844kB523776 pages RAM0 pages HighMem/MovableOnly149352 pages reserved133120 pages cma reserved
Kernel Memory Info
slab
Kernel memory debugging interface. Compiling requires enabling two macros:
CONFIG_SLUB_SYSFS=y
CONFIG_SLUB_DEBUG=y
Command to view total slab size:
echo `cat /proc/slabinfo |awk 'BEGIN{sum=0;}{sum=sum+$3*$4;}END{print sum/1024/1024}'` MB
kernfs_node_cache
The following command shows kernfs uses 2.5M, 655 pages = 2.55859375 MBytes
[root@RV1126_RV1109:/]# cat /proc/slabinfo |grep kernfs_node_cache
kernfs_node_cache 18319 18340 144 28 1 : tunables 0 0 0 : slabdata 655 655 0
Code location: fs/kernfs/mount.c
void __init kernfs_init(void)
{
/*
* the slab is freed in RCU context, so kernfs_find_and_get_node_by_ino
* can access the slab lock free. This could introduce stale nodes,
* please see how kernfs_find_and_get_node_by_ino filters out stale
* nodes.
*/
kernfs_node_cache = kmem_cache_create("kernfs_node_cache",
sizeof(struct kernfs_node),
0,
SLAB_PANIC | SLAB_TYPESAFE_BY_RCU,
NULL);
}
inode_cache
The following command shows inode cache uses 3.2M, 816 pages = 3.1875 MBytes
[root@RV1126_RV1109:/]# cat /proc/slabinfo |grep inode_cache
inode_cache 6282 6340 408 20 2 : tunables 0 0 0 : slabdata 317 317 0
Code location: fs/inode.c
void __init inode_init(void)
{
/* inode slab cache */
inode_cachep = kmem_cache_create("inode_cache",
sizeof(struct inode),
0,
(SLAB_RECLAIM_ACCOUNT|SLAB_PANIC|
SLAB_MEM_SPREAD|SLAB_ACCOUNT),
init_once);
}
memblock
System reserved memory debugging interface. Compiling requires adding memblock=debug to bootargs.
chosen {
bootargs = "earlycon=uart8250,mmio32,0xff570000 console=ttyFIQ0 memblock=debug";
};
[ 0.000000] MEMBLOCK configuration:
[ 0.000000] memory size = 0x3fdb8000 reserved size = 0x11706eb8
[ 0.000000] memory.cnt = 0x2
[ 0.000000] memory[0x0] [0x00000000-0x083fffff], 0x08400000 bytes flags: 0x0
[ 0.000000] memory[0x1] [0x08648000-0x3fffffff], 0x379b8000 bytes flags: 0x0
[ 0.000000] reserved.cnt = 0x7
[ 0.000000] reserved[0x0] [0x00004000-0x00007fff], 0x00004000 bytes flags: 0x0
[ 0.000000] reserved[0x1] [0x00100000-0x00e32b2f], 0x00d32b30 bytes flags: 0x0
[ 0.000000] reserved[0x2] [0x08000000-0x080fffff], 0x00100000 bytes flags: 0x0
[ 0.000000] reserved[0x3] [0x08300000-0x08318fff], 0x00019000 bytes flags: 0x0
[ 0.000000] reserved[0x4] [0x2dc00000-0x3dbfffff], 0x10000000 bytes flags: 0x0 CMA
[ 0.000000] reserved[0x5] [0x3df00000-0x3dfb7387], 0x000b7388 bytes flags: 0x0
[ 0.000000] reserved[0x6] [0x3f800000-0x3fffffff], 0x00800000 bytes flags: 0x0 CMA
Among them, the larger reserved areas include initrd (used for loading rootfs) and node memmap (used for page memory management).
initrd reserved 13 MBytes
void __init arm_memblock_init(const struct machine_desc *mdesc)
{
arm_initrd_init();
}
node memmap reserved 8 MBytes
[ 0.000000] On node 0 totalpages: 262006
[ 0.000000] memblock_reserve: [0x3ef75000-0x3f774fff] memblock_virt_alloc_internal+0x108/0x1a4
[ 0.000000] alloc_node_mem_map: node 0, pgdat b0d4bd00, node_mem_map eef75000
[ 0.000000] Normal zone: 2048 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 262006 pages, LIFO batch:63
Device memory info printed at boot:
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
[ 0.000000] vmalloc : 0xf0800000 - 0xff800000 ( 240 MB)
[ 0.000000] lowmem : 0xb0000000 - 0xf0000000 (1024 MB)
[ 0.000000] pkmap : 0xafe00000 - 0xb0000000 ( 2 MB)
[ 0.000000] modules : 0xaf000000 - 0xafe00000 ( 14 MB)
[ 0.000000] .text : 0x(ptrval) - 0x(ptrval) (9184 kB)
[ 0.000000] .init : 0x(ptrval) - 0x(ptrval) (1024 kB)
[ 0.000000] .data : 0x(ptrval) - 0x(ptrval) ( 332 kB)
[ 0.000000] .bss : 0x(ptrval) - 0x(ptrval) ( 896 kB)
[ 0.000000] Memory: 752320K/1048024K available (8192K kernel code, 331K rwdata, 1900K rodata, 1024K init, 895K bss, 25368K reserved, 270336K cma-reserved, 0K highmem)
752320K: Available free page memory, nr_free_pages() << (PAGE_SHIFT - 10)
1048024K: Total visible physical memory, physpages << (PAGE_SHIFT - 10)
kernel code: Kernel code, codesize = _etext - _stext
rwdata: Read-write data segment, datasize = _edata - _sdata
rodata: Read-only data segment, rosize = __end_rodata - __start_rodata
init: Includes init_data_size = __init_end - __init_begin and init_code_size = _einittext - _sinittext
bss: Memory area for uninitialized global variables, bss_size = __bss_stop - __bss_start
reserved: Memory reserved by memblock, physpages - totalram_pages - totalcma_pages
cma-reserved: CMA reserved memory, totalcma_pages
[ 0.000000] Reserved memory: created CMA memory pool at 0x3f800000, size 8 MiB
[ 0.000000] OF: reserved mem: initialized node linux,cma, compatible id shared-dma-pool
[ 0.000000] Reserved memory: created CMA memory pool at 0x2dc00000, size 256 MiB
[ 0.000000] OF: reserved mem: initialized node isp, compatible id shared-dma-pool
memory
The kernel's memory supports multiple blocks. On Rockchip platforms, before entering the kernel, some memory is used for special purposes, such as OPTEE/ATF code which needs to be placed in the 132M~135M range. The 0x248000 size memory block below is used for OPTEE code storage.
[root@RV1126_RV1109:/]# cat /sys/kernel/debug/memblock/memory
0: 0x00000000..0x083fffff
1: 0x08648000..0x3fffffff
reserved
[root@RV1126_RV1109:/]# cat /sys/kernel/debug/memblock/reserved
0: 0x00004000..0x00007fff
1: 0x00100000..0x00e32b2f
2: 0x08000000..0x080fffff
3: 0x08300000..0x08318fff
4: 0x083ff000..0x083fffff
5: 0x2dc00000..0x3dbfffff
6: 0x3df00000..0x3dfb7387
7: 0x3ee41000..0x3ef3cfff
8: 0x3ef3f480..0x3ef3f4f7
9: 0x3ef3f500..0x3ef3f803
10: 0x3ef3f834..0x3f7fefff
11: 0x3f7ff040..0x3f7ff384
12: 0x3f7ff3c0..0x3f7ff3fb
13: 0x3f7ff400..0x3f7ff583
14: 0x3f7ff5c0..0x3f7ff784
15: 0x3f7ff7c0..0x3f7ff837
16: 0x3f7ff840..0x3f7ff84f
17: 0x3f7ff880..0x3f7ff88f
18: 0x3f7ff8c0..0x3f7ff8c3
19: 0x3f7ff900..0x3f7ff903
20: 0x3f7ff940..0x3f7ffa4b
21: 0x3f7ffa80..0x3f7ffb8b
22: 0x3f7ffbc0..0x3f7ffccb
23: 0x3f7ffcf0..0x3f7ffd08
24: 0x3f7ffd0c..0x3f7ffd24
25: 0x3f7ffd28..0x3f7ffd72
26: 0x3f7ffd74..0x3f7ffd8e
27: 0x3f7ffd90..0x3f7ffdaa
28: 0x3f7ffdac..0x3f7ffdc6
29: 0x3f7ffdc8..0x3f7ffde2
30: 0x3f7ffde4..0x3f7ffdfe
31: 0x3f7ffe00..0x3f7ffedf
32: 0x3f7ffee8..0x3f7fff9f
33: 0x3f7fffb0..0x3fffffff
zoneinfo
-
cat /proc/zoneinfo
Node 0, zone DMA32per-node statsnr_inactive_anon 28250nr_active_anon 34245nr_inactive_file 29724nr_active_file 33943nr_unevictable 806nr_slab_reclaimable 10088nr_slab_unreclaimable 17495nr_isolated_anon 0nr_isolated_file 0workingset_refault 258089workingset_activate 54883workingset_restore 35120workingset_nodereclaim 4574nr_anon_pages 59384nr_mapped 65408nr_file_pages 70824nr_dirty 31nr_writeback 0nr_writeback_temp 0nr_shmem 1581nr_shmem_hugepages 0nr_shmem_pmdmapped 0nr_anon_transparent_hugepages 0nr_unstable 0nr_vmscan_write 148946nr_vmscan_immediate_reclaim 2540nr_dirtied 798484nr_written 938957nr_kernel_misc_reclaimable 0nr_unreclaimable_pages 0nr_ion_heap 0nr_ion_heap_pool 0nr_gpu_heap 0pages free 133183min 1221low 6006high 6380spanned 523776present 523776managed 374424protection: (0, 0, 0)nr_free_pages 133183nr_zone_inactive_anon 28250nr_zone_active_anon 34245nr_zone_inactive_file 29724nr_zone_active_file 33943nr_zone_unevictable 806nr_zone_write_pending 31nr_mlock 806nr_page_table_pages 10425nr_kernel_stack 18256nr_bounce 0nr_zspages 26061nr_free_cma 0pagesetscpu: 0count: 342high: 378batch: 63vm stats threshold: 30cpu: 1count: 301high: 378batch: 63vm stats threshold: 30cpu: 2count: 32high: 378batch: 63vm stats threshold: 30cpu: 3count: 296high: 378batch: 63vm stats threshold: 30node_unreclaimable: 0start_pfn: 512Node 0, zone Normalpages free 0min 0low 0high 0spanned 0present 0managed 0protection: (0, 0, 0)Node 0, zone Movablepages free 0min 0low 0high 0spanned 0present 0managed 0protection: (0, 0, 0)
Free Memory
free
-
total: Total memory managed by the kernel page allocator;
-
used: Memory currently in use;
-
free: Free memory;
-
shared: Shared memory, such as anonymous pages;
-
buffers: Buffer memory;
-
cached: Cache memory;
The difference between buffers and cached. cached is used to accelerate reads, buffers is used to accelerate writes. cached saves read data in memory so that when reading again, the data can be read directly from memory instead of the hard disk, speeding up the read process. buffers temporarily saves scattered write operations in memory and writes them to the hard disk in batches when a certain threshold is reached, reducing disk fragmentation and repeated seeks, speeding up the write process.
free
total used free shared buffers
Mem: 1533640704 1308901376 224739328 6422528 921600
-/+ buffers/cache: 1307979776 225660928
Swap: 766816256 401342464 365473792
free -m
total used free shared buffers
Mem: 1462 1249 213 6 0
-/+ buffers/cache: 1248 214
Swap: 731 382 348
free -h
total used free shared buffers
Mem: 1.4G 1.2G 212M 6.1M 900K
-/+ buffers/cache: 1.2G 213M
Swap: 731M 383M 349M
Clear Cache
drop_caches
-
echo x > /proc/sys/vm/drop_caches
Clear pagecache
echo 1 > /proc/sys/vm/drop_cachesClear dentries and inodes
echo 2 > /proc/sys/vm/drop_cachesClear all caches (pagecache, dentries, and inodes)
echo 3 > /proc/sys/vm/drop_caches
Virtual Memory Usage
vmallocinfo
-
cat /proc/vmallocinfo
0x0000000000000000-0x0000000000000000 8192 bpf_jit_binary_alloc+0x70/0x110 pages=1 vmalloc...0x0000000000000000-0x0000000000000000 20480 start_kernel+0x330/0x4f0 pages=4 vmalloc0x0000000000000000-0x0000000000000000 8192 of_iomap+0x4c/0xb8 phys=0x00000000fdd00000 ioremap0x0000000000000000-0x0000000000000000 20480 start_kernel+0x330/0x4f0 pages=4 vmalloc0x0000000000000000-0x0000000000000000 8192 of_iomap+0x4c/0xb8 phys=0x00000000fdd20000 ioremap0x0000000000000000-0x0000000000000000 20480 start_kernel+0x330/0x4f0 pages=4 vmalloc
vmstat
- cat /proc/vmstat
Memory Pressure
pressure
-
cat /proc/pressure/memory
-
VSS- Virtual Set Size (includes shared library memory)
-
RSS- Resident Set Size (actual physical memory used, includes shared library memory)
-
PSS- Proportional Set Size (actual physical memory used, proportionally allocated shared library memory)
-
USS- Unique Set Size (physical memory exclusively used by the process, does not include shared library memory)
Generally, memory usage follows this pattern: VSS >= RSS >= PSS >= USS