VmRSS和Resident Set Size如何匹配?

23
我从/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
3个回答

46

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

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


2
@lupz,请考虑验证这个答案,它似乎是正确的。详见proc(5)手册页。 - Franklin Piat

26

我的理解是,虚拟内存是指总的虚拟内存量,而常驻集大小是指其中在内存中驻留的部分。因此,

虚拟内存 = 存放在物理内存中的部分 + 存放在磁盘中的部分

存放在物理内存中的部分就是常驻集大小。所以,虚拟内存大小应该大于常驻集大小。如果它们接近相等,那就意味着进程在内存中运行得很顺畅。如果虚拟内存远大于常驻集大小,这就表示内存不足了,其中的某些部分需要被交换到磁盘上(例如受到其他进程的竞争等原因)。

在我的系统上,我可以执行 "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获取值的位置,但我认为我的pagesize是4KB。我被VmPTE搞糊涂了。它似乎更像是“[pid]s页表部分的大小”,而不是“缓冲区条目的大小” :) - lupz
1
是的,很多这些值都依赖于系统。在我使用过的一些系统中,其中一些值将始终为0,因为支持未编译到内核中。因此,请不要相信我的手册所说的内容,因为它们可能与您的系统无关。 - Ray
11
实际上,虚拟内存包括RAM中的一部分、磁盘上的一部分、未映射到物理内存的虚拟地址空间、内存映射文件和共享内存。因此,要衡量内存消耗,VmSize 是相当无用的。请参见https://dev59.com/-2rXa4cB1Zd3GeqPBadW的第一个答案。 - vcarel

14

proc 的 Man 页面在 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)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接