【问题标题】:How do VmRSS and resident set size match?VmRSS 和驻留集大小如何匹配?
【发布时间】:2012-05-11 03:50:38
【问题描述】:

我解析来自/proc/[pid]/statm 的数据以获取有关某个进程的内存使用情况的线索。 man proc 声明 驻留集大小(以“页数”衡量)与 /proc/[pid]/status 中的 VmRSS (KB??) 相同。由于它们具有不同的价值观,我想了解这些价值观之间的联系。有没有我可以在/proc 某处读到的因素(我想到了 VmPTE,但它的……其他……)?我应该解析哪一个来获取某个进程的已用内存大小?

#ex 1782 = firefox

~$ cat /proc/1782/statm
  224621 46703 9317 11 0 98637 0
#          \--- resident set size

~$ cat /proc/1782/status | grep Vm
  VmPeak:     935584 kB
  VmSize:     898484 kB
  VmLck:           0 kB
  VmHWM:      257608 kB
  VmRSS:      186812 kB
  VmData:     394328 kB
  VmStk:         220 kB
  VmExe:          44 kB
  VmLib:       61544 kB
  VmPTE:        1224 kB
  VmSwap:          0 kB

【问题讨论】:

    标签: linux procfs


    【解决方案1】:

    /proc/<pid>/stat 的 RSS 值为页数,而/proc/<pid>/status 的 VmRSS 值为 kB。

    在您的情况下,46703 * 4kB(页面大小)= 186812 kB。

    【讨论】:

    • @lupz,考虑验证这个似乎正确的答案。如proc(5) manpage 中所述。
    【解决方案2】:

    我的理解是,VM 是虚拟内存的数量,而 RSS 是它驻留在内存中的多少。所以,

    虚拟内存 = 物理内存的一部分 + 磁盘的一部分

    物理内存中的部分是RSS。所以,VSS 应该大于 RSS。如果它们接近相等,则意味着您的过程在内存中很舒适。如果 VSS 大得多,则意味着没有足够的内存,并且必须将其中的一部分换出到磁盘(即,由于竞争进程等)。

    在我的系统上,我可以执行“man proc”并列出以下内容:

              * VmPeak: Peak virtual memory size.
    
              * VmSize: Virtual memory size.
    
              * VmLck: Locked memory size (see mlock(3)).
    
              * VmHWM: Peak resident set size ("high water mark").
    
              * VmRSS: Resident set size.
    
              * VmData, VmStk, VmExe: Size of data, stack, and text segments.
    

    如果您想报告内存使用的峰值,那么您可能需要虚拟内存,它看起来像 VmPeak。

    希望这会有所帮助!

    【讨论】:

    • 我不知道从哪里获取 proc 的值,但我认为我的页面大小是 4KB。我对 VmPTE 感到困惑。它似乎是“页表的 [pid]s 部分的大小”,然后是“缓冲区条目的大小”:)
    • 是的,很多这些值是系统相关的。在我使用过的某些系统中,其中一些值将始终为 0,因为支持尚未编译到内核中。所以是的,不要相信我的手册页所说的,因为它们可能与您的系统无关。
    • 实际上,虚拟内存 = RAM 中的一部分 + 磁盘上的一部分 + 未映射到物理内存的虚拟地址空间 + 内存映射文件 + 共享内存。因此,要测量内存消耗,VmSize 毫无用处。查看stackoverflow.com/questions/13308684/…的第一个答案
    【解决方案3】:

    proc 的手册页状态跟随在 statm 上下文中

    /proc/[pid]/statm  
     Provides information about memory usage, measured in pages.  The columns are:  
    
      size       (1) total program size  
                 (same as VmSize in /proc/[pid]/status)  
      resident   (2) resident set size  
                 (same as VmRSS in /proc/[pid]/status)  
      share      (3) shared pages (i.e., backed by a file)  
      text       (4) text (code)  
      lib        (5) library (unused in Linux 2.6)  
      data       (6) data + stack  
      dt         (7) dirty pages (unused in Linux 2.6)  
    

    但它没有说明的是sizeresident以页数表示。

    ~$ cat /proc/1782/statm
      224621 46703 9317 11 0 98637 0
    #          \--- resident set size
    

    因此,46703 是以页数表示的驻留集大小,224621 也是以页数表示的虚拟内存大小。

    现在以 KB 为单位将它们与页面大小相乘。您可以使用getconf PAGESIZE 命令或在C/C++ 程序中通过调用sysconf(_SC_PAGE_SIZE)(在 unistd.h 中定义)来获取页面大小。这将为您提供以字节为单位的页面大小。除以 1024 得到页面大小(KB)。

    例子:

    $getconf PAGESIZE
    4096
    

    4096/1024 = 4 KB

    因此,以 KB 为单位的驻留集大小为 46703 x 4 = 186812 kB (VmRSS)。
    以 KB 为单位的总程序大小为 224621 x 4 = 898484 kB (VmSize)

    【讨论】:

      猜你喜欢
      • 2011-03-03
      • 2020-07-01
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多