Linuxでのプロセスメモリ管理
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メモリ
たとえば、50ページのサイズの同じライブラリを使用する5つのプロセスがある場合、各プロセスについて、PSSによって報告されるサイズはその特定の共有ライブラリに対して10ページしかありません。 すべての共有プロセスのすべての共有ライブラリでも同じことが起こります。
PSSの利点の1つは、すべてのプロセスを合計すると、システムのメモリ使用量全体を適切に概算できることです。
6. 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プロセスのさまざまなメモリ測定値をどのように使用できるかを見ました。
また、いつ選択するか、そしてそれらが何を意味するかについても学びました。