19

我解析数据/proc/[pid]/statm以获取有关某个进程的内存使用情况的线索。man proc指出驻留集大小(以“页面”衡量)与/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
4

3 回答 3

43

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

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

于 2013-06-19T09:07:40.623 回答
21

我的理解是 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。

希望这可以帮助!

于 2012-05-01T16:32:17.473 回答
11

在上下文中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)

于 2016-12-07T19:18:29.317 回答