首页 > 系统相关 >内存管理-31-进程内存占用-1-/proc/pid/status

内存管理-31-进程内存占用-1-/proc/pid/status

时间:2024-08-26 21:48:07浏览次数:11  
标签:status kB struct hiwater mm 31 vm 内存 rss

基于msm-5.4

一、初探

1. 打印格式

# cat /proc/593/status
Name:   surfaceflinger
...
VmPeak: 11322904 kB
VmSize: 11306812 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     92828 kB
VmRSS:     91100 kB
RssAnon:           19708 kB
RssFile:           70884 kB
RssShmem:            508 kB
VmData:    53808 kB
VmStk:       132 kB
VmExe:      5680 kB
VmLib:     28768 kB
VmPTE:       524 kB
VmSwap:        0 kB

CoreDumping:    0
THP_enabled:    0
...

内容解释:

VmPeak: 虚拟内存占用峰值
VmSize: 当前虚拟内存占用量
VmLck: 锁定的虚拟内存量
VmPin: Pin住的内存量
VmHWM:
VmRSS: 进程当前在虚拟内存中占用的总空间,包括进程本身和所有链接库。
RssAnon: 进程当前在虚拟内存中匿名页占用的内存量
RssFile: 进程当前在虚拟内存中文件页占用的内存量
RssShmem: 进程当前在虚拟内存中共享内存页占用的内存量
VmData: 进程数据段占用内存量
VmStk: 进程的栈占用内存量
VmExe: 进程纯代码段占用内存量,不包括链接库。
VmLib: 进程的库段占用内存量
VmPTE: 进程的页表占用内存量
VmSwap: 进程在交换区占用内存量?


2. 实现

static const struct pid_entry tgid_base_stuff[] = { //fs/proc/base.c
    ONE("status",     S_IRUGO, proc_pid_status),
};
static const struct pid_entry tid_base_stuff[] = { //fs/proc/base.c
    ONE("status",    S_IRUGO, proc_pid_status),
};

int proc_pid_status(struct seq_file *m, struct pid_namespace *ns,
        struct pid *pid, struct task_struct *task) //proc/array.c
{
    /* 内核线程返回NULL */
    struct mm_struct *mm = get_task_mm(task);
    ...
    /* 只有用户线程才有这部分信息打印,内核线程不打印内存相关信息 */
    if (mm) {
        task_mem(m, mm);
        task_core_dumping(m, mm);
        task_thp_status(m, mm);
        mmput(mm);
    }
    ...
    return 0;
}

内存相关的统计:

void task_mem(struct seq_file *m, struct mm_struct *mm) //proc/task_mmu.c
{
    unsigned long text, lib, swap, anon, file, shmem;
    unsigned long hiwater_vm, total_vm, hiwater_rss, total_rss;

    anon = get_mm_counter(mm, MM_ANONPAGES); //mm->rss_stat.count[MM_ANONPAGES];
    file = get_mm_counter(mm, MM_FILEPAGES); //mm->rss_stat.count[MM_FILEPAGES];
    shmem = get_mm_counter(mm, MM_SHMEMPAGES); //mm->rss_stat.count[MM_SHMEMPAGES];

    hiwater_vm = total_vm = mm->total_vm;
    if (hiwater_vm < mm->hiwater_vm)
        hiwater_vm = mm->hiwater_vm;
    hiwater_rss = total_rss = anon + file + shmem;
    if (hiwater_rss < mm->hiwater_rss)
        hiwater_rss = mm->hiwater_rss;

    /* 代码占用的大小 */
    text = PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK); //向上向下圆整
    text = min(text, mm->exec_vm << PAGE_SHIFT); //这里是以字节为单位
    /* lib库占用的大小 */
    lib = (mm->exec_vm << PAGE_SHIFT) - text;

    swap = get_mm_counter(mm, MM_SWAPENTS); //mm->rss_stat.count[MM_SWAPENTS];

    /* 对应打印格式,单位KB */
    SEQ_PUT_DEC("VmPeak:\t", hiwater_vm);
    SEQ_PUT_DEC(" kB\n VmSize:\t", total_vm);
    SEQ_PUT_DEC(" kB\n VmLck:\t", mm->locked_vm);
    SEQ_PUT_DEC(" kB\n VmPin:\t", atomic64_read(&mm->pinned_vm));
    SEQ_PUT_DEC(" kB\n VmHWM:\t", hiwater_rss);
    SEQ_PUT_DEC(" kB\n VmRSS:\t", total_rss);
    SEQ_PUT_DEC(" kB\n RssAnon:\t", anon);
    SEQ_PUT_DEC(" kB\n RssFile:\t", file);
    SEQ_PUT_DEC(" kB\n RssShmem:\t", shmem);
    SEQ_PUT_DEC(" kB\n VmData:\t", mm->data_vm);
    SEQ_PUT_DEC(" kB\n VmStk:\t", mm->stack_vm);
    seq_put_decimal_ull_width(m, " kB\n VmExe:\t", text >> 10, 8);
    seq_put_decimal_ull_width(m, " kB\n VmLib:\t", lib >> 10, 8);
    seq_put_decimal_ull_width(m, " kB\n VmPTE:\t", mm_pgtables_bytes(mm) >> 10, 8); //mm->pgtables_bytes
    SEQ_PUT_DEC(" kB\n VmSwap:\t", swap);
    seq_puts(m, " kB\n");
}

//CoreDump成员:

static inline void task_core_dumping(struct seq_file *m, struct mm_struct *mm)
{
    seq_put_decimal_ull(m, "CoreDumping:\t", !!mm->core_state);
    seq_putc(m, '\n');
}

//HTP透明大页:

static inline void task_thp_status(struct seq_file *m, struct mm_struct *mm)
{
    bool thp_enabled = IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE); //

    if (thp_enabled)
        thp_enabled = !test_bit(MMF_DISABLE_THP, &mm->flags);
    seq_printf(m, "THP_enabled:\t%d\n", thp_enabled);
}


3. 实验

通过下面脚本可以看到一个进程的所有线程的这些打印都是相同的

P=593; L=""; for I in $(seq 13 29); do L+=$I; L+=p; echo $L; cat /proc/$P/status | sed -n $L; for T in `ls /proc/$P/task/`; do cat /proc/$P/task/$T/status | sed -n $L; done; L=""; done;

 

标签:status,kB,struct,hiwater,mm,31,vm,内存,rss
From: https://www.cnblogs.com/hellokitty2/p/18381653

相关文章

  • limu|P31-34|CPU和GPU
    目录CPUVSGPU提升CPU利用率1、提升空间和时间的内存本地性2、并行以利用所有核提升GPU利用率1、并行2、内存本地性3、少用控制语句4、不要频繁在CPU和GPU之间传数据单机多卡并行分布式计算CPUVSGPU首先,一个芯片的空间是有限的,给了很多空间给某个内容(能力强),其他内容的空间就......
  • sqli-labs靶场通关攻略 31-35
    主页有sqli-labs靶场通关攻略1-30第三一关less-31闭合方式为?id=1&id=1")--+步骤一:查看数据库名http://127.0.0.1/less-31/?id=1&id=-1%22)%20union%20select%201,database(),3%20--+ 步骤二:查看表名http://127.0.0.1/less-31/?id=1&id=-1%22)%20union%20select%2......
  • sqli-labs靶场通关攻略(31-35关)
    第31关(")闭合)查数据库?id=")unionselect1,2,database()--+查表?id=")unionselect1,2,group_concat(table_name)frominformation_schema.tableswheretable_schema='security'--+查列?id=")unionselect1,2,group_concat(column_nam......
  • Spring Boot 3 中的性能优化:更快的启动时间和更低的内存占用
    随着微服务架构的普及,SpringBoot因其简洁的配置和快速的开发周期,成为了众多开发者的首选框架。然而,随着应用规模的增大和复杂度的提升,如何优化SpringBoot应用的启动时间和内存占用成为了一个重要的课题。本文将探讨在SpringBoot3中可以采取的一些性能优化措施,以实现......
  • JVM-内存结构(超详细)
    目录程序计数器(PC寄存器)定义作用特点Java虚拟机栈定义结构​编辑栈帧的结构栈帧的生命周期JVM压栈出栈过程Java虚拟机栈的特点常见运行时异常本地方法栈(NativeMethodStack)定义作用结构生命周期特点堆定义特点新生代、老年代对象分配过程总结方......
  • 学懂C++(四十四):C++ 自定义内存管理的深入解析:内存池与自定义分配器
    目录1.内存池(MemoryPool)概念模型特点核心点实现适用场景经典示例实现代码解析2.自定义分配器(CustomAllocators)概念模型特点核心点实现适用场景经典示例实现代码解析高级自定义分配器示例代码解析总结        C++作为一种高性能编程语言,在......
  • 【日记】这个月花了好多钱(1317 字)
    正文这几天都好热。热到人不想动,只想睡觉。今天写文章发现自己有个很显著的特点,就是在有个框架之后,具体细节完全没有预设。我只能像马尔可夫链一样,形成一个比较窄的窗口,接着这个窗口里的情节往下写,否则我就会宕机,写不出来。整个故事情节看起来也就比较散。马尔可夫链拯......
  • 网站提示431 Request Header Fields Too Large:请求头字段太大怎么办
    当遇到“431RequestHeaderFieldsTooLarge”错误时,这意味着客户端发送的请求头中的一个或多个字段超过了服务器允许的最大长度。这种情况通常发生在请求头中的某个字段(如Cookie或Authorization)过长时。解决方案检查请求头确认请求头中的字段是否过长。特别注意Cook......
  • 算法与数据结构——内存与缓存
    内存与缓存数组和链表两种数据结构分别代表了“连续存储”和“分散存储”两种物理结构。实际上,物理结构在很大程度上决定了程序对内存和缓存的使用效率,进而影响算法程序的整体性能。计算机存储设备计算机中包括三种类型的存储设备:硬盘(harddisk)、内存(random-accessmemory,RAM)、......
  • [oeasy]python031_[趣味拓展]unix起源_Ken_Tompson_Ritchie_multics
    [趣味拓展]unix起源_Ken_Tompson_Ritchie_multics......