vmstat内存事件详解

/proc/vmstat中记录了内存相关的所有事件,整理了下每个事件的含义,加深对内存event的理解。

一、cgroup相关事件

pgpgin //cgroup内存记账事件,cgroup内申请内存成功的次数。 待确定

pgpgout //cgroup内释放内存的次数。待确定

二、内存申请/释放相关事件

pgalloc_dma,pgalloc_dma32,pgalloc_normal,pgalloc_movable //每个zone成功申请page的个数

allocstall_dma,allocstall_dma32 ,allocstall_normal,allocstall_movable //每个zone分配内存触发host直接内存回收事件的次数

pgskip_dma,pgskip_dma32,pgskip_normal,pgskip_movable //在内存回收流程中,从lru隔离page的时候,记录每个zone不符合隔离条件的page的个数。

pgfree //释放page的个数

pgactivate //被移入活跃lru链表的page个数

pgdeactivate //被移入非活跃lru链表的page个数

pglazyfree //从cpu的page向量表中移除page的个数

pgfault //整个系统缺页总次数(major+minor)

pgmajfault //major page fault 次数。缺页分配内存page时,若涉及io操作,即统计到pgmajfault,比如文件映射,swap in时,需要读写磁盘文件的情况。

三、扫描lru相关事件

pglazyfreed //在内存回收从lru成功隔离符合回收条件的pages后,如果是匿名映射的page并且没有PG_swapbacked的falg,增加一次该事件的计数,说明后续是可以直接释放该page,无需swap out的。可以通过madvise(MADV_FREE)设置某匿名vma内映射的pages,如果系统内存紧张决定回收pages,不用交换,后续直接释放。

pgrefill //在内存回收流程中扫描活跃lru链表page的个数。然后这些pages会分别根据每个page的引用情况,是移到非活跃lru链表还是继续放在活跃链表。

pgsteal_kswapd ,pgsteal_direct //分别是后台内存回收和直接内存会输收扫描非活跃lru时,能够成功隔离page的个数,即能够回收page的个数。

pgscan_kswapdpgscan_direct //分别是后台和直接内存内存回收扫描非活跃lru时,扫描到的page个数。

这里steal和scan是存在差异,因为内存回收扫描非活跃lru时,会先将符合回收条件的page从lru隔离出来,以免影响lru使用的竞争,此时sacn会先被计数,若成功隔离page的个数为0,说明此次扫描完成后未找到符合回收的page,若隔离page的个数不为0,即有符合回收条件的page,此时会继续回收page,同时steal才被计数,所以steal 是<= scan的。

pgscan_direct_throttle //成功限制直接回收事件的次数。当前进程在此时收到了SIGKILL信号的话,就没必要再继续直接回收了,停止直接回收,同时增加该计数。

四、内存回收相关事件

zone_reclaim_failed //node 快速回收失败次数。在申请内存流程中,若在fastpath申请内存失败,踩到内存水线,会进行非unmap和非writeback的快速回收。

pginodesteal //直接回收slab,并扫描inode lru时,如果文件映射的page是空闲的,该page可以被释放回收,即记录该场景下空闲page的个数。

slabs_scanned //回收slab的时候,扫描slab的总数

kswapd_inodesteal //和pginodesteal相似的,在后台回收时的计数.

kswapd_low_wmark_hit_quickly //kswap准备sleep之前,剩余内存再次低于低水线的次数。

kswapd_high_wmark_hit_quickly //kswap准备sleep之前,剩余内存再次低于高水线的次数。

可以这样理解,当剩余内存踩到低水线时会唤醒kswapd,启动后台回收,直到剩余内存达到高水线时,kswapd会有一个时长为HZ/10的过渡期,尝试准备sleep,在这期间如果剩余内存再次低于低水线,则记录一次快速low_wmark事件。若在这期间如果剩余内存再次低于高水线,则记录一次快速high_wmark事件。

pageoutrun //kswap调用balance_pgdat函数(回收主函数)的次数。可视为后台回收的次数。

pgrotated //被移动到lru链表末尾的page个数。

drop_pagecache //从系统启动开始,主动drop cache触发次数。

drop_slab //主动drop slab触发次数

使用系统接口:/proc/sys/vm/drop_caches

echo 1 > /proc/sys/vm/drop_caches 释放空闲pagecache,即drop_pagecache。

echo 2 > /proc/sys/vm/drop_caches 释放各文件系统空闲的detry和inode,即drop_slab。

echo 3 > /proc/sys/vm/drop_caches drop_pagecache和drop_slab。

oom_kill //从系统启动开始,oom killer触发次数。

workingset_nodes //需要解释下背景:当remove page释放page的时候,会将mapping中的page node

替换成shadow(exceptional entry),便于这个page在重新insert到mapping的时候做一些计数,然后内存回收的时候,在shrink_slab中会去回收shadow_node链表(全局多维链表,有细分node和cgroup)下面挂的node(挂的是file mapping的private_list成员),也就是内存不足时,会去回收这些占用原来page位置的shadow(应对内存不足,也是防止shadow_node也越来越大,并且回收的是mapping下面所有node都是shadow的缓存)。

这个计数就是统计挂在shadow_node链表下并且mapping节点全是shadow的文件个数。

workingset_refault_anon/file  //page被回收后,又被重新被申请的次数,表示内存颠簸情况。

workingset_activate_anon/file  //page被重新申请时,如果active page中有比当前page更老的page,增加该计数,并设置page为active,使下次回收倾向于回收更老的page。

workingset_restore_anon/file //page被重新申请时,发现page在上次被回收时,从active移动到了inactive lru被回收,会增加计数。表示active lru的颠簸情况。

workingset_nodereclaim //在shrink_slab中回收shadow(page被回收后的slot被替换为shadow,用于计算上面的几个workingset的值)的次数。

五、NUMA状态和相关事件

numa_hit //分配的page的node与期望的node一致的次数。

numa_miss //分配的page的node与期望的node不一致的次数。

numa_foreign //和numa_miss一样,只是统计到不同的node上,numa_miss统计到分配page的node上,numa_foreign统计到期望的node上。

numa_interleave //如果mempolicy分配策略的mode是MPOL_INTERLEAVE,即在策略定义的node之间交叉分配,该事件记录交叉分配的次数。

numa_local //分配的page的node与当前执行缺页的node一致的次数。

numa_other //分配的page的node与在当前执行缺页的node不一致的次数。

上面几个numa计数不是内核事件,只是numa state的记录,可以体现numa访问状态,也可以作为性能指标的参考值。

numa_pte_updates //在标记某个虚拟地址区间不可访问的时候,需要更新的普通page页表的个数。mbind()系统调用可能会触发该事件

numa_huge_pte_updates //修改某个内存区间属性的时候,需要更新THP页表的个数。mprotect()系统调用可能会触发该事件

numa_hint_faults //在缺页时,若pte设置了_PAGE_PROTNONE,会走do_numa_page缺页,其中会进行页迁移,同时增加该事件计数。

numa_hint_faults_local //是numa_hint_faults的子集,迁移的page list中page所在node是当前cup所在node,则增加一次该事件计数。

numa_pages_migrated //更新页表时,迁移的page的个数。

六、内存规整迁移相关事件

pgmigrate_success //迁移成功的page个数。

pgmigrate_fail //迁移失败的page个数。

compact_migrate_scanned //内存规整扫描地址区间后可迁移的page个数,包括后台规整和直接规整。

compact_free_scanned //内存规整扫描地址区间后是空闲page个数。

compact_isolated //内存规整中可隔离可迁移page和空闲page的总数,然后再对已经隔离的page进行内存迁移。

compact_stall //直接内存规整次数。

compact_fail //直接内存规整失败次数。

compact_success //直接内存规整成功次数 。

compact_daemon_wake //kcompactd后台规整线程被唤醒次数。

compact_daemon_migrate_scanned //后台内存规整扫描地址区间后可迁移的page个数。

compact_daemon_free_scanned //后台内存规整扫描地址区间后是空闲page个数。

可使用系统接口:/proc/sys/vm/drop_caches /proc/sys/vm/compact_memory

echo 1 > /proc/sys/vm/drop_caches /proc/sys/vm/compact_memory 主动触发规内存规整,但是只会增加compact_migrate_scanned和compact_free_scanned计数

compact_stall+compact_daemon_wake 可视为系统内存规整总次数

七、hugetlb相关事件

htlb_buddy_alloc_success //分配hugetlb大页成功的次数。

htlb_buddy_alloc_fail //分配hugetlb大页失败的次数。

八、madvise/mprotect/mlock等内存系统调用相关事件

lru有两类链表,可回收的链表和不可回收链表,其中可回收的链表又分为非活跃匿名页链表,活跃匿名页链表,有非活跃文件页链表,活跃文件页链表。主要用于内存回收时,会扫描lru链表,选择满足回收条件的page。

unevictable_pgs_culled //page在添加到lru时,若page满足不可回收条件,会增加一次事件计数,并随后会将page添加到不可回收lru。

这里不可回收条件是page映射的vma是mlocked的(mlock()mlockall()系统调用可设置)和page映射的文件是不可回收的(ramfs内存文件系统file和shmctl设置的file),满足其中一个即不可回收。

unevictable_pgs_rescued //与unevictable_pgs_culled场景对应,若不是不可回收的page,会增加该计数,并添加到可回收链表。只要是page被移出不可回收链表,都会增加该事件计数。

unevictable_pgs_scanned //unevictable_pgs_rescued计数中是通过扫描page所在的链表后才被移出不可回收链表的page个数,就是指通过shmctl系统调用,解锁file映射的page。

unevictable_pgs_mlocked //在page加到lru之前,会先校验一下vma是否是mlocked(是否有VM_LOCKED falg),若有该flags并且page没有设置PG_mlocked,则增加一次计数,并设置page为PG_mlocked。可视为系统mlocked page的总数

unevictable_pgs_munlocked //munlock系统调用中成功解锁的的page个数

unevictable_pgs_cleared //内核中调用clear_page_mlock()清除page的PG_mlocked符号的次数,这个会在内存迁移,断开内存映射时会去调用。

unevictable_pgs_stranded //munlock系统调用中未能成功解锁的的page个数

九、THP相关事件

thp_fault_alloc //分配THP透明巨页成功的次数。

thp_fault_fallback //未能成功分配THP透明巨页的次数。

thp_collapse_alloc //khugepaged线程会尝试将符合条件的普通page整合成THP,线程会先尝试分配一个THP,再将普通page迁移到THP,该事件记录该线程成功分配THP的个数。

thp_collapse_alloc_failed //同上描述,该事件记录khugepaged线程未成功分配THP的个数。

thp_file_alloc //共享内存分配THP的次数。

thp_file_mapped //共享内存完成缺页并建立映射的THP次数。

thp_split_page //THP成功拆分成普通page的次数,swap out或者madvise系统调用修改vma属性,都会触发该事件。

thp_split_page_failed //THP拆分成普通page失败的次数。

thp_deferred_split_page //延迟拆分THP成普通page的个数。在只断开THP部分子页的映射时,并不会立刻拆分,当内存紧张时才会调用shrinker去拆分THP成普通page,并释放空闲的子页。

thp_split_pmd //调整vma的时候(合并或者分离),若新的vma的起始和结束地址未对齐,并且vma中有THP映射,会记录拆分PMD页表为PTE的次数。

thp_split_pud //拆分PUD页表的次数。

thp_zero_page_alloc //缺页时,若地址所在vma是只读,会默认分配THP zero page,并且内核只保存一份零页,在其他只读vma缺页时,也会共享这个零页,不再重新分配。该事件只记录从伙伴系统成功分配零页的次数。

thp_zero_page_alloc_failed //该事件只记录从伙伴系统未成功分配零页的次数。

thp_swpout //thp_swpout指的是pswpout事件中是thp换出事件的计数

thp_swpout_fallback //在swap out之前,会先将page挂到swap cache,如果添加到swap cache失败,会将thp拆分的正常的page,然后再次尝试将page添加到swap cache,同时增加一次计数。

十、virtio balloon相关事件

virtio balloo是guest os在运行时可动态调整它所占用的宿主机内存资源的一种机制。

balloon_inflate //填充balloon的次数

balloon_deflate //收缩balloon的次数。

balloon_migrate //balloon中的page迁移的次数。

十一、swap相关事件

pswpin // 发生swap in 换入事件的个数。

pswpout //发生swap out 换出事件个数,和thp_swpout类似,thp_swpout指的是pswpout事件中thp换出事件的个数。

swap_ra //swap in时未命中swap cache,然后从swap空间预读的次数。

swap_ra_hit //swap in的时候会先从swap cache找page,命中的次数。

十二、脏页相关(待补充)

nr_dirty //脏页个数。

nr_dirty_threshold //前台刷脏门限(page个数),等于vm.dirty_bytes或者等于vm.dirty_ratio*(free pages + active file pages +  inactive file pages - totalreserve_pages)。

nr_dirty_background_threshold //后台刷脏门限(page个数),等于vm.dirty_background_bytes或者等于vm.dirty_background_ratio*(free pages + active file pages +  inactive file pages - totalreserve_pages)。

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值