内存管理-31-系统内存统计-4-/proc/vmstat

基于msm-5.4

一、打印内容

1. 打印格式

# cat /proc/vmstat
/* 1. 打印全局数组 vm_zone_stat[] 的值,enum zone_stat_item 描述各条目 */
nr_free_pages 617775
nr_zone_inactive_anon 16518
nr_zone_active_anon 979541
nr_zone_inactive_file 698879
nr_zone_active_file 172233
nr_zone_unevictable 799
nr_zone_write_pending 23
nr_mlock 799
nr_page_table_pages 30669
nr_kernel_stack 62368
nr_shadow_call_stack_bytes 15966208
nr_bounce 0
nr_zspages 3271
nr_free_cma 0
/* 2. 打印全局数组 vm_node_stat[] 的值,enum node_stat_item 描述各条目 */
nr_inactive_anon 16518
nr_active_anon 979541
nr_inactive_file 698879
nr_active_file 172233
nr_unevictable 799
nr_slab_reclaimable 35540
nr_slab_unreclaimable 56547
nr_isolated_anon 0
nr_isolated_file 0
workingset_nodes 10
workingset_refault 6019
workingset_activate 6019
workingset_restore 0
workingset_nodereclaim 0
nr_anon_pages 982470
nr_mapped 537561
nr_file_pages 899517
nr_dirty 23
nr_writeback 0
nr_writeback_temp 0
nr_shmem 13782
nr_shmem_hugepages 0
nr_shmem_pmdmapped 0
nr_file_hugepages 0
nr_file_pmdmapped 0
nr_anon_transparent_hugepages 0
nr_unstable 0
nr_vmscan_write 18979
nr_vmscan_immediate_reclaim 8
nr_dirtied 77330
nr_written 93219
nr_kernel_misc_reclaimable 40568
nr_unreclaimable_pages 156794
/* 3. 收集全局变量 struct wb_domain global_wb_domain 的成员,分别是 thresh 和 bg_thresh */
nr_dirty_threshold 293883
nr_dirty_background_threshold 73201
/* 4. 以每个cpu为单位,收集 per_cpu(vm_event_states, cpu) 的和,各元素由 enum vm_event_item 描述 */
pgpgin 2174532
pgpgout 297144
pswpin 9200
pswpout 18979
pgalloc_normal 20942336
pgalloc_movable 0
allocstall_normal 0
allocstall_movable 0
pgskip_normal 0
pgskip_movable 0
pgfree 21569479
pgactivate 408312
pgdeactivate 49
pglazyfree 0
pgfault 5143535
pgmajfault 17558
pglazyfreed 0
pgrefill 0
pgsteal_kswapd 0
pgsteal_direct 0
pgscan_kswapd 0
pgscan_direct 0
pgscan_direct_throttle 0
pginodesteal 0
slabs_scanned 0
kswapd_inodesteal 0
kswapd_low_wmark_hit_quickly 0
kswapd_high_wmark_hit_quickly 0
pageoutrun 0
pgrotated 1613
drop_pagecache 0
drop_slab 0
oom_kill 0
pgmigrate_success 806
pgmigrate_fail 0
compact_migrate_scanned 0
compact_free_scanned 0
compact_isolated 8531
compact_stall 0
compact_fail 0
compact_success 0
compact_daemon_wake 0
compact_daemon_migrate_scanned 0
compact_daemon_free_scanned 0
unevictable_pgs_culled 802
unevictable_pgs_scanned 0
unevictable_pgs_rescued 3
unevictable_pgs_mlocked 803
unevictable_pgs_munlocked 4
unevictable_pgs_cleared 0
unevictable_pgs_stranded 0
thp_fault_alloc 0
thp_fault_fallback 0
thp_collapse_alloc 0
thp_collapse_alloc_failed 0
thp_file_alloc 0
thp_file_mapped 0
thp_split_page 0
thp_split_page_failed 0
thp_deferred_split_page 0
thp_split_pmd 0
thp_zero_page_alloc 0
thp_zero_page_alloc_failed 0
thp_swpout 0
thp_swpout_fallback 0
swap_ra 57
swap_ra_hit 39

打印的各个条目的字符串来自 vmstat_text[], 各条目的值分别来自全局数组 vm_zone_stat[]、全局数组 vm_node_stat[]、全局变量 struct wb_domain global_wb_domain 的成员、以每个cpu为单位收集 per_cpu(vm_event_states, cpu) 的和。


2. 成员说明

pageoutrun: kswapd的启动次数。

allocstall_xx: direct reclaim 的次数。


二、实现

void __init init_mm_internals(void) //vmstat.c
{
    proc_create_seq("vmstat", 0444, NULL, &vmstat_op);
}

static void *vmstat_start(struct seq_file *m, loff_t *pos) //vmstat.c
{
    unsigned long *v;
    int i, stat_items_size;

    /* 表示要分配内存的大小,这些条目的信息都会在这里进行打印 */
    stat_items_size = NR_VM_ZONE_STAT_ITEMS * sizeof(unsigned long) +
              NR_VM_NUMA_STAT_ITEMS * sizeof(unsigned long) +
              NR_VM_NODE_STAT_ITEMS * sizeof(unsigned long) +
              NR_VM_WRITEBACK_STAT_ITEMS * sizeof(unsigned long);

#ifdef CONFIG_VM_EVENT_COUNTERS
    stat_items_size += sizeof(struct vm_event_state);
#endif

    m->private = v = kmalloc(stat_items_size, GFP_KERNEL);

    /* 1. 收集全局数组 vm_zone_stat[] 的信息 */
    for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) //enum zone_stat_item条目的个数
        v[i] = global_zone_page_state(i); //v[i] = vm_zone_stat[i]
    v += NR_VM_ZONE_STAT_ITEMS;

    /* 2. 收集全局数组 vm_node_stat[] 的信息 */
    for (i = 0; i < NR_VM_NODE_STAT_ITEMS; i++) //enum node_stat_item 条目的个数
        v[i] = global_node_page_state(i); //v[i] = vm_node_stat[i];
    v += NR_VM_NODE_STAT_ITEMS;

    /* 3. 收集全局变量 struct wb_domain global_wb_domain 的成员。
     * v[0]=dirty_throttle_control.thresh; v[1]=dirty_throttle_control.bg_thresh;
     */
    global_dirty_limits(v + NR_DIRTY_BG_THRESHOLD, v + NR_DIRTY_THRESHOLD);
    v += NR_VM_WRITEBACK_STAT_ITEMS;

#ifdef CONFIG_VM_EVENT_COUNTERS
    /* 4. 以每个cpu为单位收集 per_cpu(vm_event_states, cpu) 的和 */
    all_vm_events(v); //enum vm_event_item 有 NR_VM_EVENT_ITEMS 个条目
    v[PGPGIN] /= 2;     /* sectors -> kbytes */
    v[PGPGOUT] /= 2;
#endif
    return (unsigned long *)m->private + *pos;
}

 

posted on 2024-08-31 11:43  Hello-World3  阅读(46)  评论(0编辑  收藏  举报

导航