【问题标题】:Linux, using mmzone.h to gather information on memory mangagement statsLinux,使用 mmzone.h 收集有关内存管理统计信息的信息
【发布时间】:2020-07-22 21:07:03
【问题描述】:

我正在尝试创建一个能够报告内存管理统计信息的系统调用。我的目标是能够报告以下内容:

  1. 所有内存区域中的当前空闲页数。
  2. slab 分配器当前使用的页数,在所有内存中 区域。
  3. 活动列表中的当前页数,在所有内存中 区域。
  4. 非活动列表中的当前页数,在所有内存中 区域。
  5. 当前活动列表中的页数,其引用位 在所有内存区域中设置。
  6. 非活动列表中当前被引用的页数 在所有内存区域中设置位。
  7. 从活动列表移动到 自上次机器启动以来的非活动列表。
  8. 与七号相同,反之亦然。

我并不完全了解如何访问这些信息。我知道在mmzone.h 中有一个我可以使用名为vm_stat 的数组与enum zone_stat_itemenum node_stat_item 一起使用,这将允许我收集有关1 的信息,但mmzone.h 是否包含有关2 到8 的信息。例如,我会使用vm_stat[NR_SLAB_RECLAIMABLE]vm_stat[NR_SLAB_UNRECLAIMABLE] 来计算2吗?如果没有,我在哪里可以访问满足 2 到 8 的信息?我很困惑,因为我发现单独的变量名称不是很有描述性。

【问题讨论】:

    标签: linux memory memory-management system-calls


    【解决方案1】:

    我不知道 2、5、6、7 或 8。但是,对于 3 和 4,您可以遍历所有区域(使用也在 mmzone.h 中定义的 for_each_zone 宏),并且使用枚举 zone_stat_item:

        enum zone_stat_item {
        /* First 128 byte cacheline (assuming 64 bit words) */
        NR_FREE_PAGES,
        NR_ZONE_LRU_BASE, /* Used only for compaction and reclaim retry */
        NR_ZONE_INACTIVE_ANON = NR_ZONE_LRU_BASE,
        NR_ZONE_ACTIVE_ANON,
        NR_ZONE_INACTIVE_FILE,
        NR_ZONE_ACTIVE_FILE,
        NR_ZONE_UNEVICTABLE,
        NR_ZONE_WRITE_PENDING,  /* Count of dirty, writeback and unstable pages */
        NR_MLOCK,       /* mlock()ed pages found and moved off LRU */
        NR_PAGETABLE,       /* used for pagetables */
        NR_KERNEL_STACK_KB, /* measured in KiB */
        /* Second 128 byte cacheline */
        NR_BOUNCE,
    #if IS_ENABLED(CONFIG_ZSMALLOC)
        NR_ZSPAGES,     /* allocated in zsmalloc */
    #endif
        NR_FREE_CMA_PAGES,
        NR_VM_ZONE_STAT_ITEMS };
    

    如果你看一下vmstat.h,你会发现这个有用的功能:

    static inline unsigned long zone_page_state(struct zone *zone,
                    enum zone_stat_item item){
    long x = atomic_long_read(&zone->vm_stat[item]);
    #ifdef CONFIG_SMP
    if (x < 0)
        x = 0;
    #endif
    return x;
    

    }

    您可以使用它来获取该枚举中每个元素的值。要获得答案 3,请为每个区域添加 NR_ACTIVE_ANONNR_ACTIVE_FILE。对于 4,您将得到每个区域的 NR_INACTIVE_ANONNR_INACTIVE_FILE 的总和。

    如果你最终弄明白了,请告诉我你是如何获得剩余物品的。

    【讨论】:

    • 嗯,这可能不是答案,但至少它是其中的一部分,所以谢谢。
    • @MPK 没问题。我一直在尝试用类似的内核做类似的事情。我发现 zone 结构有一个 pglist_data *zone_pglist_dat,它有 lruvec 作为成员。假设这包含该区域的所有 LRU 列表,但我不知道如何遍历它们的页面。所以我会检查一下。
    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多