内存管理-31-系统内存统计-2-/proc/buddyinfo 和 /proc/pagetypeinfo

基于 msm-5.4

一、概述

1. 简介

/proc/buddyinfo 节点包含当前伙伴系统的简要信息,而 /proc/pagetypeinfo 则包含了当前伙伴系统详细信息,包括每个迁移类型和每个链表的成员数量等。

迁移类型最小的单位是页块,在Arm64架构中,页块的默认大小是4M. 但需注意,页块的大小和普通巨页有关,当配置了 CONFIG_HUGETLB_PAGE 时,页块的order大小等于 HUGE_PAGE_ORDER, 通常是9,否则,页块的order是10.

#ifdef CONFIG_HUGETLB_PAGE
#define pageblock_order        HUGETLB_PAGE_ORDER //9
#else
#define pageblock_order        (MAX_ORDER-1) //11-1=10
#endif /* CONFIG_HUGETLB_PAGE */


2. 打印格式-buddyinfo

# cat /proc/buddyinfo
Node 0, zone   Normal  40832  27860  12069   3974    423     88     37      0      0      0      0

注:打印函数见 frag_show_print()

 

3. 打印格式-pagetypeinfo

# cat /proc/pagetypeinfo
Page block order: 10
Pages per block:  1024

Free pages count per migrate type at order       0      1      2      3      4      5      6      7      8      9     10
Node    0, zone   Normal, type    Unmovable  35624  25526   9745   3158     30     55     30      0      0      0      0
Node    0, zone   Normal, type      Movable   4125   2277   2182    773    352     33      7      0      0      0      0
Node    0, zone   Normal, type  Reclaimable      8     39    124     41     41      0      0      0      0      0      0
Node    0, zone   Normal, type          CMA      0      0      0      0      0      0      0      0      0      0      0
Node    0, zone   Normal, type   HighAtomic     67     18     18      2      0      0      0      0      0      0      0
Node    0, zone   Normal, type      Isolate      0      0      0      0      0      0      0      0      0      0      0

Number of blocks type     Unmovable      Movable  Reclaimable          CMA   HighAtomic      Isolate
Node 0, zone   Normal         1293         2113           31           36            1            0

Number of mixed blocks    Unmovable      Movable  Reclaimable          CMA   HighAtomic      Isolate
Node 0, zone   Normal           82          524           16            0            1            0

上面打印可分四部分:

(1) 打印 pageblock_order 和 pageblock_nr_pages 的值, 打印函数 pagetypeinfo_show()。

(2) 打印的是 zone->free_area[order]->free_list[MIGRATE_TYPES] 链表上元素的个数,是个二维矩阵了,实现函数是 pagetypeinfo_showfree_print()。

(3) 打印的是以 pageblock_nr_pages 为步长,遍历每个zone的所有pfn, 从 mem_section->usage->pageblock_flags 拿到其对应的迁移类型,记录的是这种迁移类型对应的页块(单位4M)的个数。打印函数是 pagetypeinfo_showblockcount_print()

(4) 依赖 CONFIG_PAGE_OWNER, 若没有配置则什么也不打印。遍历zone span的所有pages, 剔除没有对应实际物理内存的page、剔除本zone的page、剔除PageBuddy(page)成立的page、剔除PageReserved(page)成立的page后, 根据拓展数据中 page_owner->gfp_mask 得到的page的迁移类型和page所在的pageblock(单位4M)的迁移类型不相等时,则将pageblock对应的迁移类型计数加1,若pageblock对应的迁移类型是 MIGRATE_CMA 则加在 MIGRATE_MOVABLE 上。打印函数是 pagetypeinfo_showmixedcount_print()

ChatGPT: 该函数可能遍历内存中的页面块,并统计每个迁移类型中包含其他类型页面的页面块数量。这有助于了解内存管理策略(如页面迁移和回收)的效果。


二、打印实现

/* kernel_init_freeable --> ~ */
void __init init_mm_internals(void) //mm/vmstat.c
{
    ...
    proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op);
    proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op);
}


1. buddyinfo

static void frag_show_print(struct seq_file *m, pg_data_t *pgdat, struct zone *zone) //mm/vmstat.c
{
    int order;

    seq_printf(m, "Node %d, zone %8s ", pgdat->node_id, zone->name);
    for (order = 0; order < MAX_ORDER; ++order)
        seq_printf(m, "%6lu ", zone->free_area[order].nr_free);
    seq_putc(m, '\n');
}


2. pagetypeinfo

static int pagetypeinfo_show(struct seq_file *m, void *arg) //mm/vmstat.c
{
    pg_data_t *pgdat = (pg_data_t *)arg;

    /* 打印第(1)部分内容 */
    seq_printf(m, "Page block order: %d\n", pageblock_order); //(MAX_ORDER-1)=10
    seq_printf(m, "Pages per block:  %lu\n", pageblock_nr_pages); //(1UL << pageblock_order)=1<<10
    seq_putc(m, '\n');
    /* 打印第(2)部分内容 */
    pagetypeinfo_showfree(m, pgdat);
    /* 打印第(3)部分内容 */
    pagetypeinfo_showblockcount(m, pgdat);
    /* 打印第(4)部分内容 */
    pagetypeinfo_showmixedcount(m, pgdat);

    return 0;
}

 

posted on 2024-08-27 21:29  Hello-World3  阅读(66)  评论(0编辑  收藏  举报

导航