`
AILIKES
  • 浏览: 187087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

VIRT RES SHR的准确含义

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G

 

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

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

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

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

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

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

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

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G

 

 

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

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

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G
 

 

statm文件:

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G

 

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

等等,好像数值对不上,top显示的SHR344k,而statm给出的是86

再来看一行关键代码:

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G
 

 

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

 

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

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G

 

 

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

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

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

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G

 

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

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

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

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

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

程序的代码段。

动态库的代码段。

通过mmap做的文件映射。

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

通过shmget申请的共享内存。

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

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

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

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

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

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

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G
 

 

 

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

 

 

剖析top命令显示的VIRT RES SHR值 - yalung - Y A L U N G

 

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

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

总结

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

top命令通过解析/proc/<pid>/statm统计VIRTRESSHR字段值。

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

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

SHRRES映射至文件的物理内存总和。包括:

程序的代码段。

动态库的代码段。

通过mmap做的文件映射。

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

通过shmget申请的共享内存。

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

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

分享到:
评论

相关推荐

    Linux top 命令详解

    Linux top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器。下面详细介绍它的使用方法。 认识 top 的显示结果 ------------------- top 命令的显示...

    Linux中top命令参数介绍及查询结果详细分析

    `top`命令显示的界面分为两个主要部分:**统计信息区** 和 **进程信息区**。 ##### 统计信息区 统计信息区位于界面顶部,提供了关于系统整体状态的关键信息,包括时间、系统运行时间、登录用户数以及负载平均值等。...

    ubuntu中top命令详解

    ### 二、`top`命令的显示信息解析 #### 1. 系统运行时间与用户负载 - `top - 01:06:48`: 表示当前时间是01:06:48。 - `up 1:22`: 表示系统已经运行了1小时22分钟。 - `1 user`: 表示当前有1个用户登录。 - `load ...

    图解linux下top命令的使用

    - **VIRT/RES/SHR**:分别代表虚拟内存、物理内存和共享内存的大小 - **S**:进程状态,如D(不可中断的睡眠)、R(运行)、S(睡眠)、T(跟踪/停止)和Z(僵尸进程) - **%CPU/%MEM**:CPU和内存的使用率 - **TIME...

    linux下top命令的使用.docx

    接下来,我们将通过分析一个运行中的 WEB 服务器的 `top` 监控截图,详细介绍 `top` 视图中各种数据的具体含义以及如何对视图中的各进程(任务)字段进行排序。 #### top 视图基本结构及数据解释 **一、第一行:...

    Linux系统中3个性能监控和优化命令讲解.doc

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 从输出结果中,我们可以看到当前系统的 CPU 使用率、内存使用率、进程列表等信息。 二、free 命令 free 命令用于显示系统的内存使用情况。它可以显示总的...

    linux下top使用方法

    `top`命令作为Linux系统中的一个重要工具,不仅可以实时监控系统的整体性能,还能帮助我们快速定位和分析问题所在。通过灵活运用`top`命令提供的各项功能,我们可以更好地管理和优化系统资源,提高系统的稳定性和...

    linux下top命令参数解释定义.pdf

    `top`命令是Linux系统中一个非常重要的性能分析工具,它允许用户实时监控系统的整体状态,包括CPU使用率、内存使用情况以及各个进程的资源占用等。以下是对`top`命令参数及其显示内容的详细解释: 1. **基本概念与...

    top命令解析.pdf

    `top`命令是Linux系统中一个非常重要的性能分析工具,它能实时地显示系统中各个进程的资源占用情况,类似于Windows的任务管理器。这个命令帮助系统管理员监控CPU、内存使用情况,以及进程的状态,以便诊断系统性能...

    top.rar_top linux_trace

    它提供了丰富的选项和自定义字段,可以按需查看不同进程的详细信息,包括PID(进程ID)、USER(进程所有者)、PR(优先级)、NI(Nice值)、VIRT(虚拟内存大小)、RES(物理内存大小)、SHR(共享内存)、%CPU(CPU...

    linux下高cpu解决方案

    PID USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND 14094 root 15 0 315m 10m 7m 891% 2.2 1:49.01 gateway ``` 上述结果显示,`gateway`进程消耗了大量的CPU资源。 2. **进一步分析单个进程内的线程**: ...

    linux进程内存占用排序命令.pdf

    在给出的示例中,可以看到`top`命令默认显示的信息包括:PID(进程ID)、USER(用户)、PR(优先级)、NI(Nice值)、VIRT(虚拟内存大小)、RES(物理内存占用)、SHR(共享内存)、S(状态)、%CPU(CPU使用率)、...

    Linux中top的含义

    `top`命令是Linux系统中一个非常实用且强大的工具,用于实时显示系统中各个进程的资源占用状况。它提供了CPU使用率、内存使用情况以及系统运行时间等信息,是系统管理员进行性能监控的重要手段之一。 在给定的示例...

    查看LINUX进程内存占用情况.docx

    top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 Windows 的任务管理器。使用 top 命令可以查看进程的详细信息,包括进程 ID、进程所有者、进程优先级别、虚拟内存、物理...

    查看LINUX进程内存占用情况

    top 命令是 Linux 下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。可以直接使用 top 命令后,查看 %MEM 的内容。可以选择按进程查看或者按用户查看,如想查看 oracle 用户的进程内存使用情况的话...

    CPU热点定位

    PID USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND 11561 inforsui 20 0 49.9g 6.0g 72m R 100.0 2.7 5194:12 java(耗cpu的线程) ``` 可以看到,PID为11561的线程(对应于Java进程中的某个线程)正在大量消耗...

    linux top命令详解与输出结果说明

    ### Linux top 命令详解与输出结果说明 #### top 命令概述 `top` 命令是 Linux 下一个非常强大的...此外,`top` 命令还支持交互操作,用户可以通过键盘输入不同的命令来进一步定制其显示的信息或者对进程进行管理。

    linux中查看系统资源占用情况的命令.pdf

    它提供了动态更新的界面,显示了每个进程的详细信息,如进程ID(PID)、用户、优先级、虚拟内存(VIRT)、物理内存(RES)、共享内存(SHR)、CPU使用率(%CPU)以及内存使用率(%MEM)等。通过交互式命令,你可以...

    Linux查看CPU和内存使用情况.docx

    `top`命令会以全屏交互模式显示系统信息,包括每个进程的CPU使用率、内存占用情况等。要退出`top`,只需按下`q`键。在`top`界面中,你可以看到如下信息: 1. **PID**: 进程的唯一标识符。 2. **USER**: 进程的所有...

    Linux服务器巡检报告.pdf

    - 表格部分列出所有进程的信息,包括PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND等字段,帮助监控每个进程的状态和资源消耗。 5. **安全检查**: - **当前登陆用户**:通过`who`命令检查...

Global site tag (gtag.js) - Google Analytics