VmRSS和居民设置大小如何匹配?

lup*_*upz 13 linux procfs

我解析数据/proc/[pid]/statm以获得关于某个进程的内存使用情况的线索.man proc说明驻留集大小(以"页面"衡量)与VmRSS(KB ??)相同/proc/[pid]/status.由于它们具有不同的值,我想了解这些值之间的联系.是否有某种因素我可以在某处阅读/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
Run Code Online (Sandbox Code Playgroud)

Tak*_*uma 31

RSS值/proc/<pid>/stat是页数,而VmRSS值/proc/<pid>/status是以kB为单位.

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

  • @lupz,考虑验证这个看似正确的答案.如[proc(5)](http://linux.die.net/man/5/proc)联机帮助页中所述. (2认同)

Ray*_*Ray 15

我的理解是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.
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助!

  • 实际上,虚拟内存= RAM中的一部分+磁盘上的部分+虚拟地址空间未映射到物理内存+内存映射文件+共享内存.因此,为了测量内存消耗,VmSize是没用的.请参阅http://stackoverflow.com/questions/13308684/increase-of-virtual-memory-without-increse-of-vmsize的第一个答案 (3认同)

Dr.*_*nce 10

procstatm上下文中跟随状态的手册页

/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)  
Run Code Online (Sandbox Code Playgroud)

但它未能说明的是,sizeresident以页数表示.

~$ cat /proc/1782/statm
  224621 46703 9317 11 0 98637 0
#          \--- resident set size
Run Code Online (Sandbox Code Playgroud)

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

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

示例:

$getconf PAGESIZE
4096
Run Code Online (Sandbox Code Playgroud)

4096/1024 = 4 KB

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