通过cat /proc/meminfo可以看到内存的使用情况
重点域解析
MemTotal:伙伴系统总内存大小(totalram_pages),这里总内存不包含预留内存(memblock_reserve),以及在调用free_all_bootmem释放内存到伙伴系统之前,通过memblock_alloc分配的内存,如果想回到伙伴系统,需要调用memblock_free_late
MemFree:伙伴系统中剩余内存大小,通过NR_FREE_PAGES获取
MemAvailable:系统可以用内存大小
MemAvailable = memfree + pagecache/2 + SLAB_RECLAIMABLE/2 - wmark_low 也就是算上了page cache和slab 可回收部分,然后减去最低水位值,MemAvailable 是保证userspace thread不会生内存回收的最高可用内存
Buffers:表示块设备(block device)所占用的缓存页,包括直接读写块设备、以及文件系统元数据(metadata)如SuperBlock所使用的缓存页
Cached: page cache + shmem cache + swap cache
SwapCached:匿名内存swapcache大小
Active : active file + active anon mem
inactive :inactive file + inactive anon mem
Active/inactive(anon): 匿名内存(malloc) + tmpfs file大小(而tmpfs又会体现在shmem和Cached,所以会存在重复计算)
Unevictable :不可以收回内存大小,一般userspace调用mlock以后,内存不可以回收
Mlocked:处于锁定状态内存.
Dirty :脏页状态
AnonPages:匿名页面总大小(包含AnonHugePages)
AnonHugePages:匿名大页内存
Mapped:处于映射状态文件页面大小
Shmem:shmem使用内存大小(shmem + tmpfs)
Slab:slab使用内存 = SReclaimable + SUnreclaim
SReclaimable: slab可回收内存大小
SUnreclaim:不可回收大小,如果这个值很大,则可认为有内存泄露
KernelStack:系统所有进程的内核堆栈大小
PageTables:系统所有进程页表大小
VmallocTotal: vmalloc虚拟地址空间大小
CmaTotal:cma内存总大小
CmaFree:剩余CMA内存大小
DirectMap4k: 采用直接映射的内存大小
DirectMap2M: 采用直接映射PMD对应的内存大小
DirectMap1G: 采用直接映射PGD对应的内存大小
free 指令的Used:
mem_used = kb_main_total - kb_main_free - kb_page_cache - kb_slab_reclaimable - kb_main_buffers;
= slab_unreclaim + vmalloc + alloc_page + kernel_stack + page_table + anon_page
user buffer = buffers + Active + Inactive + Unevictable + HugePages_Total *Hugepagesize
kernel buffer = slab + vmalloc + kernel_stack + page_table + alloc_page = used + slab_reclaimable - AnonPages