1. 概要

このチュートリアルでは、Linuxのプロセスで使用される4つのメモリ測定値について説明します。 VSZ、RSS、USS、およびPSS。

詳細に入るとわかるように、それぞれに独自の特性と使用法があります。

2. VSZメモリ

VSZは仮想メモリサイズの略です。 これは、プロセスが仮想的にアクセスする可能性のあるメモリの総量です。

バイナリ自体のサイズ、リンクされたライブラリ、およびスタックまたはヒープの割り当てを考慮します。

プロセスが開始されると、VSZメモリはRSSメモリになります。

3. RSSメモリ

VSZとは対照的に、RSSはResident Set Sizeの略で、実行中にプロセスに割り当てられたRAMの量を示す測定値です

ただし、メモリにすでにロードされているライブラリは考慮されていないため、実際にはプロセスのRAM使用量を正確に測定することはできません。

2つのプロセスが1つ以上のライブラリを使用する場合、1つのプロセスが次々に開始される場合、ライブラリは事前にロードされていても、RSSは各プロセスのライブラリのサイズを報告します。 これが、RSSが誤解を招く可能性があり、完全に信頼されるべきではない理由です。

RSSはメモリ出力全体を表示するため、すでにプリロードされている情報であっても、プロセスリストのすべてを合計すると、割り当てられた合計メモリよりも多くのメモリが得られます。

4. RSSおよびVSZを使用する

4.1. psを使用する

LinuxプロセスのRSSおよびVSZを確認する方法の1つは、psを呼び出すことです。

$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.1  0.0 169316 13184 ?        Ss   18:14   0:04 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    18:14   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   18:14   0:00 [rcu_gp]
// ...
root          28  0.0  0.0      0     0 ?        S    18:14   0:00 [idle_inject/3]

上記の出力は、ターミナルにリストされているすべてのプロセスのほんの一部です。

しかし、ご覧のとおり、RSSとVSZという名前の2つの列があり、各プロセスに割り当てられた合計メモリと、プロセスがそれ自体に割り当てた最大値を示しています。

一部のプロセス(たとえば、すべてのGoogle Chromeプロセス)のみを表示する場合は、次を使用できます。

ps eo user,pid,vsz,rss $(pgrep -f 'chrome')
USER                    PID     VSZ    RSS
baeldung-reader        5236 1358620 333984
baeldung-reader        5246  268300  63804
baeldung-reader        5247  268300  63084
// ...
baeldung-reader       36354 4587872  52700

4.2. topを使用する

プロセスをチェックするためのもう1つの便利なコマンドは、topです。 これを使用すると、システムで実行されているすべてのプロセスが表示されます。

上記のコマンドとは異なり、実行中のプロセスのリストの変更を毎回チェックするため、RSSとVSZの変更をリアルタイムで確認できます。

たとえば、PID 12408(この場合はgoogle chromeインスタンス)のプロセスを見ると、たとえば、特定のプロセスが使用しているCPUの量を示す%CPUの違いを確認できます。 ターミナルでわかるように、実行されるChromeプロセスは複数あります。実際に実行されるプロセスは複数あるため、これは理にかなっています。実際のChromeアプリケーション、開いているタブ、ブラウザダウンローダーを介したダウンロードなどです。 – CPUが適切と判断した場合、割り当てられるリソースは多かれ少なかれ次のようになります。

top - 22:55:50 up  4:41,  1 user,  load average: 0,82, 2,25, 2,72
Tasks: 350 total,   1 running, 349 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0,5 us,  0,2 sy,  0,0 ni, 99,3 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
MiB Mem :  32035,2 total,  23820,8 free,   3484,8 used,   4729,7 buff/cache
MiB Swap:      0,0 total,      0,0 free,      0,0 used.  27832,6 avail Mem 

    PID USER                 PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  // ...
  12408 baeldung-reader      20   0 9146156 312452 119532 S   1,7   1,0   9:56.70 chrome
  // ...
  12077 baeldung-reader      20   0 4784576 182196  92716 S   0,3   0,6   1:00.59 chrome

そして30秒後:

top - 22:56:20 up  4:41,  1 user,  load average: 0,63, 2,07, 2,65
Tasks: 351 total,   1 running, 350 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1,8 us,  0,5 sy,  0,0 ni, 97,7 id,  0,0 wa,  0,0 hi,  0,0 si,  0,0 st
MiB Mem :  32035,2 total,  23806,6 free,   3492,9 used,   4735,7 buff/cache
MiB Swap:      0,0 total,      0,0 free,      0,0 used.  27819,3 avail Mem 

    PID USER                 PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
  // ...
  12408 baeldung-reader      20   0 9185940 306080 123896 S  14,0   0,9  10:00.01 chrome
  // ...
   4340 baeldung-reader      20   0 1171680 328412 156400 S   1,3   1,0   6:15.76 chrome
  // ...
   4579 baeldung-reader      20   0 4723180 172064  73352 S   0,7   0,5   0:23.38 chrome
  // ...
   4414 baeldung-reader      20   0  377528 105756  66972 S   0,3   0,3   1:33.44 chrome
   4457 baeldung-reader      20   0  431860 120172  86228 S   0,3   0,4  20:52.63 chrome
  12691 baeldung-reader      20   0 4737484 173728  99572 S   0,3   0,5   0:15.66 chrome
  // ...

繰り返しになりますが、これは出力のほんの一部ですが、変化の変動性と、優先順位が付けられ、優先順位が下げられたCPUによって順序付けられたプロセスを確認できます。

前述したように、これらのタイプは完全に正確ではありませんが、信頼できる見積もりを得ることができます。

5. PSSメモリ

PSS(Proportional Set Size)は、はるかに便利なメモリ管理メトリックです。 RSSとまったく同じように機能しますが、 共有ライブラリのパーティショニング

たとえば、50ページのサイズの同じライブラリを使用する5つのプロセスがある場合、各プロセスについて、PSSによって報告されるサイズはその特定の共有ライブラリに対して10ページしかありません。 すべての共有プロセスのすべての共有ライブラリでも同じことが起こります。

PSSの利点の1つは、すべてのプロセスを合計すると、システムのメモリ使用量全体を適切に概算できることです。

6. USSメモリ

一意のセットサイズ(USS)は、プロセスのプライベートメモリを表します。 言い換えると、 このプロセスにのみ割り当てられたライブラリとページが表示されます

このタイプのメモリは、別のプロセスを起動する実際のコストを表すため、非常に便利です。 また、逆に、プロセスが終了すると、システムに返される実際の金額を表します。

7. PSSとUSSの使用

7.1. psを使用する

LinuxプロセスでPSSメモリをチェックするには、チェックしたいプロセスの / proc / {$ PID} /smapsにアクセスする必要があります。 このために、チェックしたいプロセスのPIDが必要です。

たとえば、javbitmq-serverプロセスを確認する場合は次のようになります。

$ ps -aux | grep 'rabbitmq-server'
rabbitmq    1055  0.0  0.0   2608   604 ?        Ss   iun04   0:00 /bin/sh /usr/sbin/rabbitmq-server
$ sudo cat /proc/1055/smaps | grep -w 'Pss:'
Pss:                  20 kB
Pss:                  76 kB
Pss:                  24 kB
// ...
Pss:                   0 kB

ここでは、複数のPSS出力が表示されます。これらを追加すると、プロセスの合計PSS印刷が取得されます。 または、たくさんの数字を追加する代わりに、次のようにすることができます。

$ sudo cat /proc/1055/smaps | grep -i 'Pss:' |  awk '{Total+=$2} END {print Total}'
165

ここに、rabitmq-serverプロセスの合計PSSメモリサイズがKB単位で報告されています。 大量のPSSメモリを使用するプロセスがある場合は、出力をフォーマットして、より大きな測定単位でレポートすることができます。

$ sudo cat /proc/1055/smaps | grep -i 'Pss:' | awk '{Total+=$2} END {print Total/1000" MB"}'
0,165 MB

キロとメガの違いであるため、1024ではなく1000で割ることを覚えておく必要があります。

7.2. smenを使用する

USSをチェックするために使用する非常に興味深いツールは、 smem です。これは、USSおよびその他のタイプを出力するために使用します。

$ sudo apt-get install smem
$ smem
  PID User                Command                         Swap      USS      PSS      RSS 
 4346 baeldung-reader     cat                                0      116      149     1936 
 4347 baeldung-reader     cat                                0      120      151     1884 
 2663 baeldung-reader     /usr/libexec/gnome-session-        0      488      522     5240 
 2578 baeldung-reader     /usr/libexec/xdg-permission        0      748      794     6320 
 2558 baeldung-reader     /usr/bin/dbus-daemon --conf        0      668      812     4672 
 2820 baeldung-reader     /usr/libexec/gsd-screensave        0      788      832     6404 
 2531 baeldung-reader     /usr/libexec/ibus-memconf          0      776      859     7148 
 2803 baeldung-reader     /usr/libexec/gsd-a11y-setti        0      832      885     6728 
 2551 baeldung-reader     /usr/libexec/at-spi-bus-lau        0      824      893     7284 
 3192 baeldung-reader     /usr/libexec/gvfsd-metadata        0      860      902     6376 
 2498 baeldung-reader     /usr/libexec/gvfs-mtp-volum        0      860      906     6544 
 2431 baeldung-reader     /usr/libexec/gvfs-goa-volum        0      904      990     6644

特定のプロセスを確認するために、grepコマンドを再度使用します。

$ smem | grep -w 'chrome'
60608 ioan     grep --color=auto -w chrome        0      364      396     2588 
 4381 ioan     /opt/google/chrome/nacl_hel        0      604     1121     4132 
 4376 ioan     /opt/google/chrome/nacl_hel        0      668     1183     4204 
 4379 ioan     /opt/google/chrome/chrome -        0      204     1232    15752 
// ...
 4340 ioan     /opt/google/chrome/chrome          0   276260   290467   387636

8. 結論

この記事では、Linuxプロセスのさまざまなメモリ測定値をどのように使用できるかを見ました。

また、いつ選択するか、そしてそれらが何を意味するかについても学びました。