linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值

引 言: top命令作为Linux下最常用的性能分析工具之一,可以监控、收集进程的CPU、IO、内存使用情况。比如我们可以通过top命令获得一个进程使用了多少虚拟内存(VIRT)、物理内存(RES)、共享内存(SHR)。

最近遇到一个咨询问题,某产品做性能分析需要获取进程占用物理内存的实际大小(不包括和其他进程共享的部分),看似很简单的问题,但经过研究分析后,发现背后有很多故事……

1 VIRT RES SHR的准确含义

三个内存指标,VRIT,RES,SHR准确含义是什么?谁能告诉我们?MAN页?Linux专家?SUSE工程师?Linus?谁能说出最正确答案?没人!因为惟有源代码才是最正确的答案。

那我们就去看下源码吧,这就是开源软件的最大的好处。

首先这三个数据的源头,肯定是内核,进程的相关数据结构肯定是由内核维护。那么top作为一个用户空间的程序,要想获取内核空间的数据,就需要通过系统接口(API)获取。而proc文件系统是Linux内核空间和用户空间交换数据的一个途径,而且是非常重要的一种途径,这点和windows更倾向于基于函数调用的形式不同。

当你调用系统函数read读取一个普通文件时,内核执行对应文件系统的代码从磁盘传送文件内容给你。

当你调用系统函数read读取一个 proc文件时,内核执行对应的proc文件系统的代码从内核的数据结构中传送相关内容给你。proc文件和磁盘没有关系。只是系统接口而已。

而一个进程的相关信息,Linux全部通过/proc/<pid>/内的文件告诉了我们。

如下,你可以使用普通的文件读写工具,比如cat获取进程的各种信息。这比函数调用的方式灵活多了、丰富多了。

回到我们的问题,top命令显示的进程信息,肯定也是通过proc获取的,因为除此之外没有其他途径,没有系统函数可以做这个事情,top也不可能越过用户层直取内核获取数据。

带着以上信息,很快就可以从top的源码中找到关键代码:

啊哈,statm文件:

根据sscanf的顺序,第一个值是VIRT,第二个值是RES,第三个值是SHR!

等等,好像数值对不上,top显示的SHR是344k,而statm给出的是86!

再来看一行关键代码:

statm显示的是页数,top显示的是KB。X86下,一页是4KB,86 * 4 = 344。这就对了!

于是乎,我们找到了最关键的入口,接下来按图索骥,看看内核是怎么产生statm文件内容就可以了。~~

proc_pid_statm函数负责产生statm文件内容,当你使用cat命令打印statm文件时,内核中的这个函数会执行。

proc_pid_statm获取进程的mm_struct数据结构,而这个数据结构就是进程的内存描述符,通过它可以获取进程内存使用、映射的全部信息。

进一步考察task_statm函数,可以看到:

第一个值(VIRT)就是mm->total_vm,即进程虚存的总大小,这个比较清晰,只要进程申请了内存,无论是malloc还是堆栈还是全局,都会计入这个值;

第二个值(RES)是mm->file_rss+mm->anon_rss;

第三个值(SHR)是mm->file_rss。

RES要和SHR结合者看,内核把物理内存分为了两部分,一部分是映射至文件的,一部分是没有映射至文件的即匿名内存,完全和共不共享没有关系!

但file_rss为什么叫做shared呢?应该是一种指示性表述,表示这部分内存可能是共享的。但并不代表真正共享了。那么到底哪些计入file_rss?通过查阅相关代码,发现(可能有遗漏):

l 程序的代码段。

l 动态库的代码段。

l 通过mmap做的文件映射。

l 通过mmap做的匿名映射,但指明了MAP_SHARED属性。

l 通过shmget申请的共享内存。

即进程通过以上方式占用的物理内存,计入file_rss,也就是top的SHR字段。我们看到一般这些内存都是以共享方式存在。但如果某个动态库只一个进程在使用,它的代码段就没有被共享着。

反过来再来看anon_rss统计的内容,是否就一定是独占的?也不是,比如新fork之后的子进程,由于copy on write机制,在页面被修改之前,和父进程共享。这部分值并不体现在top命令的SHR字段内。

综上所述top命令显示的SHR字段,并不是准确描述了进程与其他进程共享使用的内存数量,是存在误差的。

那么如何获取进程准确的共享内存数量?

2 获取进程准确的共享内存数量

我们注意到在描述进程信息的proc/<pid>内,有一个smaps文件,里面展示了所有内存段的信息,其中有Shared_Clean Shared_Dirty Private_Clean Private_Dirty:几个字段。

找到相关代码,可以看到,一个页面如果映射数>=2计入Shared_* ; 如果=1计入Private_*。(脏页计入*_Dirty,否则计入*_Clean)

统计smaps文件内所有段的Shared_*值的总和就是进程准确的共享内存数量!

统计smaps文件内所有段的Private_*值的总和就是进程准确的独占内存数量!

3 总结

通过以上分析,我们可以得到如下结论:

l top命令通过解析/proc/<pid>/statm统计VIRT和RES和SHR字段值。

l VIRT是申请的虚拟内存总量。

l RES是进程使用的物理内存总和。

l SHR是RES中”映射至文件”的物理内存总和。包括:

程序的代码段。

动态库的代码段。

通过mmap做的文件映射。

通过mmap做的匿名映射,但指明了MAP_SHARED属性。

通过shmget申请的共享内存。

l /proc/<pid>/smaps内Shared_*统计的是RES中映射数量>=2的物理内存。

l /proc/<pid>/smaps内Private_*统计的是RES中映射数量=1的物理内存。

原文地址:https://www.cnblogs.com/youngerger/p/8460767.html

时间: 2024-08-01 09:33:59

linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值的相关文章

剖析top命令显示的VIRT RES SHR值

http://www.fuzhijie.me/?p=741 引 言: top命令作为Linux下最常用的性能分析工具之一,可以监控.收集进程的CPU.IO.内存使用情况.比如我们可以通过top命令获得一个进程使用了多少虚拟内存(VIRT).物理内存(RES).共享内存(SHR). 最近遇到一个咨询问题,某产品做性能分析需要获取进程占用物理内存的实际大小(不包括和其他进程共享的部分),看似很简单的问题,但经过研究分析后,发现背后有很多故事-- 1 VIRT RES SHR的准确含义 三个内存指标,

Linux进程管理四大工具ps \dstat\ top\ htop

Linux进程管理之“四大名捕” 一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手“无情”.内功卓越的高手“铁手”.腿功惊人的“追命”和剑法一流的“冷血”本文四大名捕由linux命令所出演      无情:ps     出演      铁手:dstat  出演      追命:top    出演      冷血:htop   出演 二.进程相关基础知识 介绍四大名捕之前先介绍一下进程相关的基础知识,话不多说,看图. 三.

linux ps top 命令 VSZ,RSS,TTY,STAT, VIRT,RES,SHR,DATA的含义

linux ps top 命令 VSZ,RSS,TTY,STAT, VIRT,RES,SHR,DATA的含义 linuxpstop http://javawind.net/p131 VIRT:virtual memory usage 虚拟内存 1.进程“需要的”虚拟内存大小,包括进程使用的库.代码.数据等 2.假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 RES:resident memory usage 常驻内存 1.进程当前使用的内存大小,但不包

Linux 内存 virt res shr data swap 意义

virt  res shr data 这几个很容易搞混了,写一下 首先解释下含义: virt : 程序占用的虚拟内存 man: The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped out and pages that have been mapped but not used. r

top命令显示CPU使用率过了100%原因

1.使用top命令查看发现cpu使用率超过了100%,如下图: 4868 root      20   0  161m  768  568 S 100.1  0.0   6867:56 pidguard 2.我的机器是8cpu的,经过检查发现top命令显示的是占用的cpu总数. 即8cpu时top下cpu利用率最大可以到达800%. 如果你的进程利用了多个cpu,那么top命令显示的是多个cpu占用率的总和. 所以top命令下查看到的cpu利用率是可能超过100%的.

《Linux学习并不难》Linux常用操作命令(1): cat命令显示文本文件内容

8.1  <Linux学习并不难>Linux常用操作命令(1): cat命令显示文本文件内容 使用cat命令可以显示文本文件的内容,也可以把几个文件内容附加到另一个文件中.如果没有指定文件,或者文件为"-",那么就从标准输入读取. 命令语法: cat [选项] [文件] 命令中各选项的含义如表所示. 选项 选项含义 -n 对输出的所有行编号 -b 对非空输出行编号 -s 当遇到有连续两行以上的空白行时,就替换为一行的空白行 -E 在每行结束处显示$ 例:显示/etc/ini

查看LINUX进程内存占用情况

可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看oracle用户的进程内存使用情况的话可以使用如下的命令: $ top -u oracle 内容解释: PID:进程的ID USE

Linux进程管理和系统监控ps,top

在Linux下进程查看和进程管理是经常使用的命令,我们可以使用ps来查看上一个状态中,各进程的信息,也可以通过top命令来实时的查看进程的属性信息.可以通过kill来管理进程运行,通过调整renice值来调整进程的优先级. 而htop.dstat.glances则是非常优秀Linux的系统监控命令,接下来就一步一步介绍他们的使用. ps的使用 查看ps是shell内置的命令还是外部命令 [[email protected] ~]# type psps is /bin/ps 由上可知ps是外部命令

Linux进程内存统计

一. 进程内存统计 cat /proc/[pid]/status通过/proc/[pid]/status可以查看进程的内存使用情况,包括虚拟内存大小(VmSize),物理内存大小(VmRSS),数据段大小(VmData),栈的大小(VmStk),代码段的大小(VmExe),共享库的代码段大小(VmLib)等等. Name: java /进程的程序名/ State: S (sleeping) /进程的状态信息,具体参见/ Tgid: 9744 /线程组号/ Pid: 9744 /进程pid/ PP