VmRSS和居民组合大小如何匹配?

我parsing/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 

我的理解是虚拟机是虚拟内存的数量,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/<pid>/stat的RSS值是页数,而/proc/<pid>/status的VmRSS值是kB。

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

statm上下文中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 (ie, 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是以页数表示的常驻集大小, 46703是以页数表示的虚拟存储器大小。

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

例如:

 $getconf PAGESIZE 4096 

4096/1024 = 4 KB

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