| 统计项 | 描 述 |
|---|---|
| NR_FREE_PAGES | 空闲页面数量 |
| NR_ZONE_LRU_BASE | 用于LRU_BASE的统计。LRU链表是从LRU_BASE开始标记的 |
| NR_ZONE_INACTIVE_ANON | 不活跃匿名页面数量 |
| NR ZONE ACTIVE_ANON | 活跃匿名页面数量 |
| NR_ZONE_INACTIVE_FILE | 不活跃文件映射页面数量 |
| NR_ZONE_ACTIVE_FILE | 活跃文件映射页面数量 |
| NR_ZONE_UNEVICTABLE | 不可回收的页面数量 |
| NR_ZONE_WRITE_PENDING | 脏页、正在回写以及不稳定的页面数量 |
| NR_MLOCK | 使用mlock()锁住的页面数量 |
| NR_PAGETABLE | 用于页表的页面数量 |
| NR_KERNEL STACK KB | 用于内核栈的页面数量 |
| NR_BOUNCE | 跳跃页面的数量 |
| NR_ZSPAGES | 用于zsmalloc机制的页面数量 |
| NR_FREE_CMA_PAGES | CMA中的空闲贝面数量 |
| NR_VM_ZONE_STAT_ITEMS | ZONE中vm stat计数值的项数 |
| 统计项 | 描述(实现) |
|---|---|
| MemTotal | 系统当前可用物理内存总量,通过读取全局变量_toalrampages 来获得 |
| 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 | 活跃的匿名页面(LRUACTIVE_ANON)和 活跃的文件映射页面(LRU_ACTIVE_FILE) |
| Inactive | 不活跃的匿名页面(LRUINACTIVE_ANON) 和不活跃的文件映射页面(LRU_NACTIVE_FILE) |
| Active(anon) | 活跃的匿名页面(LRU_ACTIVE_ANON) |
| Inactive(anon) | 不活跃的匿名页面(LRU_INACTIVE_ANON |
| Active(file) | 活跃的文件映射页面(LRU_ACTIVE_FILE) |
| Inactive(file) | 不活跃的文件映射页面(LRUINACTIVE_FI LE) |
| Unevictable | 不能回收的页面(LRUUNEVICTABLE) |
| Mlocked | 不会被交换到交换分区的页面,由全局的vm zone_stat[]中的NR_MLOCK 来统计 |
| SwapTotal | 交换分区的大小 |
| SwapFree | 交换分区的空闲空间大小 |
| Dirty | 脏页的数量,由全局的vm_node_stat[]中的NR_FILE_DIRTY来统计 |
| Wnteboel | 正在回写的页面数量,由全局的vm_node_stat[]中的NR_WRITEBACK来统计。 |
| AnonPages | 统计有反向映射(RMAP)的页面,通常这些页面都是匿名页面并且都映射到了用户空间,但是并不是所有匿名页面都配置了反向映射,如部分的 shmem 和tmpfs页面就没有设置反向映射。这个计数由全局的vm_node_stat[]中的NR_ANON_MAPPED来统计 |
| Mapped | 统计所有映射到用户地址空间的内容缓存页面,由全局的vmnode_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) |
| KernelStack | 所有进程内核栈的总大小,由全局的 vm zone stat门中的NR_KERNEL_STACK_KB来统计 |
| PageTables | 所有用于页表的页面数量,由全局的vmzone_stat[]中的NR PAGETABLE来统计 |
| NFS_Unstable | 在NFS中,发送到服务器端但是还没有写入磁盘的页面(NR_UNSTABLE_NFS) |
| WritebackTmp | 回写过程中使用的临时缓存(NR_WRITEBACK_TEMP) |
| VmallocTotal | vmalloc 区域的总大小 |
| VmallocUsed | 已经使用的vmalloc 区域总大小 |
| Percpu | percpu机制使用的页面,由pcpu_nr_pages函数来统计 |
| AnonHugePages | 统计透明巨页的数量 |
| ShmemHugePages | 统计在shmem 或者 tmpfs中使用的透明巨页的数量 |
| ShmemPmdMapped | 使用透明巨页并且映射到用户空间的 shmem 或者 tmpfs 的页面数量 |
| CmaTotal | CMA机制使用的内存 |
| CmaFree | CMA机制中空闲的内存 |
| HugePages_Total | 普通巨页的数量,普通巨页的页面是预分配的 |
| HugePages_Free | 空闲的普通巨页的数量 |
| Hugepagesize | 普通巨页的大小,通常是2MB或者1GB |
| Hugetlb | 普通巨页的总大小,单位是KB |
PG_SwapBacked标志位,见shmem_alloc_and_acct_page()函数。PG_SwapBacked标志位来确定将页面添加到匿名页面的LRU链表还是文件映射的LRU链表中,见page_is_file_cache()函数。若没有设置PG_SwapBacked标志位,则页面时文件映射的页面,会被添加到文件映射的LRU链表中;否则,被添加到匿名页面的LRU链表中。cat /proc/*/status | grep -E 'Name|Pid|Vm*|Rss*|Hu*'
| 成员名 | 含义 |
|---|---|
| Name | 进程的名称 |
| Pid | PID。 |
| VmPeak | 进程使用的最大虚拟内存,通常情况下它等于进程的内存描述符mm 中的 total_vm. |
| VmSize | 进程使用的虚拟内存,它等于mm->total_vm。 |
| VmLck | 进程锁住的内存,它等于mm->locked_vm,这里指使用mlock()锁住的内存。 |
| VmPin | 进程固定住的内存,它等于mm->pinned_vm,这里指使用 get_user_page()固定住的内存。 |
| VmHWM | 进程使用的最大物理内存,它通常等于进程使用的匿名页面、文件映射页面以及共享内存页面的大小总和。 |
| VmRSS | 进程使用的最大物理内存,它常常等于VmHWM,计算公式为 VmRSS= RssAnon+RssFile+RssShmem. |
| RssAnon | 进程使用的匿名页面,通过get_mm_counter(mm,MM_ANONPAGES)获取。 |
| RssFile | 进程使用的文件映射页面,通过get_mm_counter(mm, MM_FILEPAGES)获取。 |
| RssShmem | 进程使用的共享内存页面,通过get_mm_counter(mm, MM_SHMEMPAGES)获取。 |
| RssFile | 进程使用的文件映射页面,通过get_mm_counter(mm, MM_FILEPAGES)获取 RssShmem:进程使用的共享内存页面,通过getmm_counter(mm,MM SHMEMPAGES获取。 |
| VmData | 进程私有数据段的大小,它等于 mm->data_vm。 |
| VmStk | 进程用户栈的大小,它等于mm->stack_vm。 |
| VmExe | 进程代码段的大小,通过内存描述符mm中的start_code和end_code两个成员获取。 |
| VmLib | 进程共享库的大小,通过内存描述符mm中的exec_vm和VmExe计算。 |
| VmPTE | 进程页表大小,通过内存描述符 mm 中的pgtables_bytes 成员获取。 |
| VmSwap | 进程使用的交换分区的大小,通过get_mm_counter(mm,MM_SWAPENTS)获取。 |
| HugetlbPages | 进程使用巨页的大小,通过内存描述符 mm 中的 hugetlb_usage成员获取。 |
dirty_background_bytes:当脏页所占的内存数量(指所有可用内存,即空闲页面+可回收内存页面)超过dirty_background_bytes时,内核回写线程(writeback thread)开始回写脏页。dirty_background_ratio:当脏页所占的百分比达到dirty_background_ratio时,内核回写线程开始回写脏页数据,直到脏页比例低于此值。注意,对于dirty_background_bytes和dirty_background_ratio,我们只能设置其中一个。当设置其中一个时,另外一个立即变成0。dirty_background_ratio的默认值为10。dirty_bytes:当系统的脏页总数达到dirty_bytes值时,write系统调用会被阻塞,并开始回写脏页数据,直到脏页总数低于此值。注意,该值不能设置为小于两个页面大小的字节数,否则,设置不生效并且系统会默认加载之前的旧值。dirty_ratio:当脏页所占的百分比(空闲内存页+可回收内存页)达到dirty_ratio时,write系统调用被阻塞并开始回写脏页数据,直到脏页比例低于此值。dirty_ratio的默认值为20。注意,对于dirty_ratio和dirty_bytes,我们只能设置其中一个。dirty_expire_centisecs:脏数据的过期时间。当内核回写线程被唤醒后会被检查哪些数据的存在时间超过了这个时间,并将这些脏数据回写到磁盘,单位是百分之1秒,也就是10ms、该值默认是3000,即若脏数据的存在时间超过30s,那么内核回写线程唤醒之后优先回写这些脏数据。dirty_writeback_centisecs:内核回写线程周期性唤醒的时间间隔,默认是5s。drop_caches:用来回收干净的页面高速缓存和一些可以回收的slab对象,如文件系统中inode、dentries等。其默认值的含义如下。