プロセスのメモリ使用量に関する指標

  1. VSS (Virtual Set Size)
  2. RSS (Resident Set Size)
  3. PSS (Proportional Set Size)
  4. USS (Unique Set Size)

ref. プロセスのメモリ使用量に関する指標を学ぶ (VSS, RSS, PSS, USS) - リネオブログ - リネオソリューションズ

上記事よりまとめ。

  • VSS (Virtual Set Size)
    • プロセスがアクセスできるメモリ領域サイズの総和
    • VSS には仮想メモリ上にのみ確保されている領域も計上されるため、プロセスがまだ使用していないメモリ領域も含まれる
    • VSS は RSS に比べて大きくなることが多い
  • RSS (Resident Set Size)
    • プロセスが確保している物理メモリの使用量
    • RSS は VSS に比べて小さくなることが多い
    • 物理メモリの使用量の指標として、RSS は VSS よりも役に立つ
    • RSS は複数のプロセス間で共有されているメモリ領域も合計して算出する
      • 大きな共有ライブラリを使用しているだけで RSS は大きくなりがち
  • PSS (Proportional Set Size)
    • RSS のうち共有メモリの使用量をプロセス間で等分することで得られる物理メモリの使用量
    • 物理メモリの使用量が大きなプロセスを特定したい場合、まずは PSS が大きな値を示しているプロセスに着目してみるのが良い
  • USS (Unique Set Size)
    • RSS のうち共有メモリの使用量を除いた物理メモリの使用量
    • USS はプロセスが使用している物理メモリの実体を把握するのに役立つ

実際に確認してみる

Railsアプリケーションをpumaをワーカー数4で立ち上げて、メモリ使用量を確認してみる。

$ ps -eo pid,%mem,vsz,rss,cmd --sort=-%mem
  PID %MEM    VSZ   RSS CMD
  806  0.7 294372 73472 puma 5.6.6 (tcp://localhost:3000) [app]
  810  0.6 971192 66572 puma: cluster worker 1: 806 [app]
  812  0.6 971192 66572 puma: cluster worker 2: 806 [app]
  815  0.6 971192 66572 puma: cluster worker 3: 806 [app]
  809  0.6 971192 66568 puma: cluster worker 0: 806 [app]
  863  0.0   8588  3928 ps -eo pid,%mem,vsz,rss,cmd --sort=-%mem
    1  0.0   4612  3628 bash
  466  0.0   4476  3508 bash

なおVSZはVSSと同じ意味。

VSS(Virtual Set Size) = Virtual Memory Size = VSZ

procs

Rust製のprocsを使うとこんな感じ。

# procs --sortd UsageMem
 PID  User │ TTY   CPU MEM:▼ CPU Time MEM │ Command
           │       [%]   [%]          [%] │
 2240 root │ pts/0 0.0   0.9 00:00:02 0.9 │ puma: cluster worker 2: 806 [app]
 806  root │ pts/0 0.0   0.8 00:00:06 0.8 │ puma 5.6.6 (tcp://localhost:3000) [app]
 2239 root │ pts/0 0.0   0.7 00:00:02 0.7 │ puma: cluster worker 0: 806 [app]
 2084 root │ pts/0 0.0   0.7 00:00:02 0.7 │ puma: cluster worker 3: 806 [app]
 2238 root │ pts/0 0.0   0.7 00:00:02 0.7 │ puma: cluster worker 1: 806 [app]
 2487 root │ pts/1 0.0   0.0 00:00:00 0.0 │ bash
 1    root │ pts/0 0.0   0.0 00:00:00 0.0 │ bash

smem

PSS, USS を確認するための smem を使ってみるとこう。

# smem
  PID User     Command                         Swap      USS      PSS      RSS
 2487 root     bash                               0      584     1487     3552
    1 root     bash                               0      660     1563     3628
 6037 root     /usr/bin/python3 /usr/bin/s        0    12948    13239    14776
 2238 root     puma: cluster worker 1: 806        0     8032    22930    71812
 2239 root     puma: cluster worker 0: 806        0     8044    22942    71824
 2084 root     puma: cluster worker 3: 806        0     8824    23336    71832
  806 root     puma 5.6.6 (tcp://localhost        0    25660    37030    78552
 2240 root     puma: cluster worker 2: 806        0    50340    58818    91792