首页 > 系统相关 >内存管理-31-内存统计-1-初探

内存管理-31-内存统计-1-初探

时间:2024-08-27 21:17:13浏览次数:9  
标签:stat zone 31 vm long item 内存 初探 NR

基于msm-5.4

一、概述

Linux内核为了帮助大家从宏观上把握系统内存的使用情况,在几大核心数据结构上都有相应的统计计数,如物理页面使用情况、伙伴系统分配情况、内存管理区的物理页面使用情况等。

1. vm_stat 计数值

内存管理模块定义了三个全局的 vm_stat 计数值

//include/linux/vmstat.h
extern atomic_long_t vm_zone_stat[NR_VM_ZONE_STAT_ITEMS];
extern atomic_long_t vm_numa_stat[NR_VM_NUMA_STAT_ITEMS]; //默认不使能CONFIG_NUMA,这个不存在
extern atomic_long_t vm_node_stat[NR_VM_NODE_STAT_ITEMS];

内存管理区中包含与页面相关的计数值:

struct zone {
    atomic_long_t        vm_stat[NR_VM_ZONE_STAT_ITEMS];
    atomic_long_t        vm_numa_stat[NR_VM_NUMA_STAT_ITEMS];
}

内存节点数据结构中包含与页面相关的计数值:

typedef struct pglist_data {
    atomic_long_t        vm_stat[NR_VM_NODE_STAT_ITEMS];
}

enum zone_stat_item:

enum zone_stat_item {
    NR_FREE_PAGES, //空闲页面数
    NR_ZONE_LRU_BASE, //用于 LRU_BASE 的统计,LRU链表是从 LRU_BASE 开始标记的。##### 注释: 仅用于压缩和回收重试。
    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,    //脏页、正在回写以及不稳定的页面数量
    NR_MLOCK,        //使用 mlock() 锁住的页面。注释:找到已锁定的页面并将其移出 LRU。
    NR_PAGETABLE,    //用于页表的页面数量
    NR_KERNEL_STACK_KB,    //用于内核栈的页面数量。注释: 以KB为单位
#if IS_ENABLED(CONFIG_SHADOW_CALL_STACK)
    NR_KERNEL_SCS_BYTES,    /* measured in bytes */
#endif
    NR_BOUNCE, //跳跃页面的数量
#if IS_ENABLED(CONFIG_ZSMALLOC)
    NR_ZSPAGES, //用于 zsmalloc 机制的页面数量
#endif
    NR_FREE_CMA_PAGES, //CMA中的空闲页面数量
    NR_VM_ZONE_STAT_ITEMS //zone中vm_stat计数值的项数
};

跳跃页面:在早期IA-32架构中,一些ISA总线的设备只能访问低端的16M内存,如DMA设备源地址在16M以下,而DMA设备的目标地址可能在16MB以上,因此需要在16M内存分配一个缓冲区来作为跳板,这明显会增加一次复制动作,这个缓冲区称为跳跃页面。

提供了几个接口来计算统计计数:

//include/linux/vmstat.h
static inline void zone_page_state_add(long x, struct zone *zone, enum zone_stat_item item)
{
    atomic_long_add(x, &zone->vm_stat[item]);
    atomic_long_add(x, &vm_zone_stat[item]);
}
static inline void node_page_state_add(long x, struct pglist_data *pgdat, enum node_stat_item item)
{
    atomic_long_add(x, &pgdat->vm_stat[item]);
    atomic_long_add(x, &vm_node_stat[item]);
}

提供了几个接口来获取统计计数:

//include/linux/vmstat.h
static inline unsigned long global_zone_page_state(enum zone_stat_item item)
{
    return atomic_long_read(&vm_zone_stat[item]);
}
static inline unsigned long global_node_page_state(enum node_stat_item item)
{
    return atomic_long_read(&vm_node_stat[item]);
}

static inline unsigned long zone_page_state(struct zone *zone, enum zone_stat_item item)
{
    return atomic_long_read(&zone->vm_stat[item]);
}
//mm/vmstat.c
unsigned long node_page_state(struct pglist_data *pgdat, enum node_stat_item item)
{
    return atomic_long_read(&pgdat->vm_stat[item]);
}

没有使能 CONFIG_NUMA, 使用的主要是全局的数组,见:

#define sum_zone_node_page_state(node, item) global_zone_page_state(item)
#define node_page_state(node, item) global_node_page_state(item)

 

标签:stat,zone,31,vm,long,item,内存,初探,NR
From: https://www.cnblogs.com/hellokitty2/p/18383559

相关文章

  • 项目中Redis常见的一些问题(缓存穿透,缓存雪崩,内存耗尽等)
    缓存穿透缓存穿透是指查询一个不存在的数据,导致每次请求查询这个不存在的数据都会转发到数据库,可能导致数据库崩溃通常都会用布隆过滤器来解决它布隆过滤器布隆过滤器主要是用于检索一个元素是否在一个集合中。它的底层主要是先去初始化一个比较大数组,里面存放的二进......
  • linux系统内存不足时, 系统杀死程序 哪儿查看日记
    下面是由ai回答的:当Linux系统内存不足时,系统可能会通过OOMkiller(Out-Of-Memorykiller)机制自动杀死一些进程以释放内存。要查看因内存不足而被系统杀死的程序,可以通过查看系统日志来获取相关信息。根据搜索结果,以下是一些常用的方法来查看系统日志中的相关记录:使用dmesg......
  • 软设每日一练1——(16进制快速算结果)若用256K×8bit存储器芯片,构成地址40000000H到400F
    题目:若用256K× 8bit的存储器芯片,构成地址40000000H到400FFFFFH且按字节编址的内存区域,则需(        )片芯片A.4        B.8        C.16        D.32        答案:A解:1、首先看单位,存储器芯片单位是256K× 8bit,地址是字节......
  • FreeRTOS不同内存管理策略的区别
    来源于正点原子《STM32F1FreeRTOS开发手册V1.1》第二十章内存管理20.7heap_5内存分配方法(P391):heap_1最简单,但是只能申请内存,不能释放。heap_2提供了内存释放函数,用户代码也可以直接调用函数pvPortMalloc()和vPortFree()来申请和释放内存,但是heap_2会导致内存碎片的......
  • C++常见内存错误及其对策
    常见内存错误及其对策目录常见内存错误及其对策内存分配未成功,却使用了它内存分配成功但未初始化内存操作越界内存泄漏释放内存后继续使用规则总结图表示C++学习资料在软件开发过程中,内存管理是至关重要的一环。内存错误不仅会导致程序崩溃,还可能引发安全问题。本文......
  • 深入理解GPU内存分配:机器学习工程师的实用指南与实验
    给定一个模型架构、数据类型、输入形状和优化器,你能否计算出前向传播和反向传播所需的GPU内存量?要回答这个问题,我们需要将流程分解为基本组件,并从底层理解内存需求。以下实验(可以在GoogleColab上运行)将帮助你理解核心概念。 数据类型float32需要4字节的内存,bfloat......
  • 内存管理-31-进程内存占用-2-/proc/pid/statm
    基于msm-5.4一、初探1.打印格式#cat/proc/593/statm//非内核线程2826695224031784814200127170//以PAGE_SIZE为单位#cat/proc/187/statm//内核线程0000000打印成员介绍:1:size:打印的是mm->total_vm的值,表示任务占用虚拟地址空间大小,单位PAGE......
  • 内存管理-31-进程内存占用-3-/proc/pid/maps‌
    基于msm-5.4一、初探此文件描述了进程使用的每个内存段的信息,但是并不是所有的段,也不是一个段的所有部分都加载到内存中了,除非使用了对应的页面。1.打印格式#cat/proc/593/maps5e0cb16000-5e0cc1a000r--p00000000fc:03100868352/system/bin/su......
  • 内存管理-31-进程内存占用-4-/proc/pid/smaps
    基于msm-5.4一、初探1.打印格式#cat/proc/593/smaps...7e5a528000-7e5a626000r--p0000000000:1f5/dev/binderfs/hwbinderSize:1016kBKernelPageSize:4kBMMUPageSize:4kBRss:......
  • 【C++ 面试 - 内存管理】每日 3 题(三)
    ✍个人博客:Pandaconda-CSDN博客......