meminfo分析

499 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

在Linux操作系统中查看系统内存最准确的方法是查看/proc/meminfo节点,它包含当前时刻系统的所有物理页面的信息。

root@benshushu:~# cat /proc/meminfo
MemTotal:         737696 KB
MemFree:          574684 KB
MemAvailable:     611380 KB
Buffers:            4616 KB
Cached:            91284 KB
SwapCached:            0 KB
Active:            42676 KB
Inactive:          68768 KB
Active(anon):      15668 KB
Inactive(anon):     4704 KB
Active(file):      27008 KB
Inactive(file):    64064 KB
Unevictable:           0 KB
Mlocked:               0 KB
SwapTotal:             0 KB
SwapFree:              0 KB
...

meminfo节点实现在meminfo_proc_show()函数中,该函数实现在fs/proc/meminfo.c。meminfo节点显示的内容如表所示。

  • MemTotal 系统当前可用物理内存总量,通过读取全局变量_totalram_pages来获得

  • MemFree 系统当前剩余空闲物理内存,通过读取全局变量vm_zone_stat[]数组中的NR_FREE_PAGES来获得

  • MemAvailable 系统中可使用页面的数量,由si_mem_available()函数来计算。公式为Available = memfree + pagecache + reclaimable−totalreserve_pages。这里包括了空闲页面(memfree)、文件映射页面(pagecache)、可回收的页面(reclaimable),最后减去系统保留的页面

  • Buffers 用于块层的缓存,由nr_blockdev_pages()函数来计算

  • Cached 用于页面高速缓存的页面。计算公式为Cached = NR_FILE_PAGES – swap_cache − Buffers

  • SwapCached 这里统计交换缓存的数量,交换缓存类似于内容缓存,只不过它对应的是交换分区,而内容缓存对应的是文件。这里表示匿名页面曾经被交换出去,现在又被交换回来,但是页面内容还在交换缓存中

  • Active 活跃的匿名页面(LRU_ACTIVE_ANON)和活跃的文件映射页面(LRU_ACTIVE_FILE)

  • Inactive 不活跃的匿名页面(LRU_INACTIVE_ANON)和不活跃的文件映射页面(LRU_INACTIVE_FILE)

  • Active(anon) 活跃的匿名页面(LRU_ACTIVE_ANON)

  • Inactive(anon) Active(file) 活跃的文件映射页面(LRU_ACTIVE_FILE)

  • Inactive(file) 不活跃的文件映射页面(LRU_INACTIVE_FILE)

  • Unevictable 不能回收的页面(LRU_UNEVICTABLE)

  • Mlocked 不会被交换到交换分区的页面,由全局的vm_zone_stat [ ]中的NR_MLOCK来统计

  • SwapTotal 交换分区的大小

  • SwapFree 交换分区的空闲空间大小

  • Dirty 脏页的数量,由全局的vm_node_stat[ ]中的NR_FILE_DIRTY来统计

  • Writeback 正在回写的页面数量,由全局的vm_node_stat[ ]中的NR_WRITEBACK来统计

  • AnonPages 统计有反向映射(RMAP)的页面,通常这些页面都是匿名页面并且都映射到了用户空间,但是并不是所有匿名页面都配置了反向映射,如部分的shmem和tmpfs页面就没有设置反向映射。这个计数由全局的vm_node_stat[ ]中的NR_ANON_MAPPED来统计

  • Mapped 统计所有映射到用户地址空间的内容缓存页面,由全局的vm_node_stat[ ]中的NR_FILE_MAPPED来统计

  • Shmem 共享内存(基于tmpfs实现的shmem、devtmfs等)页面的数量,由全局的vm_node_stat[]中的NR_SHMEM来统计

  • KReclaimable 内核可回收的内存,包括可回收的slab页面(NR_SLAB_RECLAIMABLE)和其他的可回收的内核页面(NR_KERNEL_MISC_RECLAIMABLE)

  • Slab 所有slab页面,包括可回收的slab页面(NR_SLAB_RECLAIMABLE)和不可回收的slab页面(NR_SLAB_UNRECLAIMABLE)

  • SReclaimable 可回收的slab页面(NR_SLAB_RECLAIMABLE)

  • SUnreclaim 不可回收的slab页面(NR_SLAB_UNRECLAIMABLE)