web-dev-qa-db-ja.com

VmRSSと常駐セットのサイズはどのように一致しますか?

/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
14
lupz

私の理解では、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のような仮想メモリが必要になる可能性があります。

お役に立てれば!

15
Ray

/proc/<pid>/statのRSS値はページ数ですが、/proc/<pid>/statusのVmRSS値はkB単位です。

あなたの場合、46703 * 4kB(ページサイズ)= 186812kBです。

31
Takashi Oguma

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単位の合計プログラムサイズは224621x 4 = 898484 kB(VmSize)

10
Dr. Xperience