1. 概要

私たちのマシンで実行されているプロセスにはメモリが必要です。 また、メモリ要件はプロセスごとに異なります。

時々、メモリ使用量を監視する必要があります。 新しく作成されたアプリケーションをデバッグする場合もあります。 または、サーバーの全体的なメモリ使用量を見つけるためのものです。 いずれの場合も、最初のステップはメモリ使用量をログに記録することです。

このチュートリアルでは、メモリ消費量を監視するさまざまな方法を確認します。

2. freeコマンドの使用

メモリ使用量をチェックするために頭に浮かぶ最初のコマンドは、freeコマンドです。 ご存知のとおり、このコマンドは、使用済み、空き、バッファリング済み、および使用可能なメモリを出力します。

使用法は次のとおりです。

free [options]

freeコマンドは2つのモードで機能します。 1つは、メモリ使用量を1回出力して終了することです。これは、デフォルトの動作です。 もう1つは、連続して印刷することです。 メモリ使用量を監視することを目的としているため、後者のモードを使用します。

それを見てみましょう:

$ free -s 1 -h -c 3
              total        used        free      shared  buff/cache   available
Mem:           7.7G        2.9G        2.7G        175M        2.2G        4.4G
Swap:            0B          0B          0B

              total        used        free      shared  buff/cache   available
Mem:           7.7G        2.9G        2.7G        175M        2.2G        4.4G
Swap:            0B          0B          0B

              total        used        free      shared  buff/cache   available
Mem:           7.7G        2.9G        2.7G        176M        2.2G        4.4G
Swap:            0B          0B          0B

上記のコマンドは、1秒ごとに3回メモリ使用量を出力しました。

結果から、RAMの合計は7.7GBであることがわかります。 そのうち、2.9GBが使用されています。 そして、2.7GBの空きRAMがあります。

使用したオプションを確認してみましょう。

  • -s 1 :結果の印刷の遅延を設定します。 ここでは、1秒使用しました
  • -h :結果を人間が読める形式で印刷します
  • -c 3 :結果を出力するカウントを設定します

ご覧のとおり、これらのオプションは、メモリ使用量を長期間監視する必要がある場合に役立ちます。 さらに、出力をファイルにリダイレクトする場合があります。 そうすれば、後で必要になったときに参照できます。

3. topコマンドの使用

top コマンドは、freeコマンドとしてLinuxユーザーの間でも一般的です。 ただし、このコマンドは、CPU、メモリ、およびプロセスに関する詳細情報を提供します。

デフォルトでは、このコマンドを実行すると、インタラクティブモードでコマンドが開始されます。 また、実行中のすべてのプロセスと、さまざまなシステムリソースの使用状況を出力します。 ユーザーは、この画面から任意のプロセスを操作できます。

メモリ消費量を継続的に監視するには、topコマンドで提供されるバッチモードオプションを使用する必要があります。

それを見てみましょう:

$ top -b -d1 -o +%MEM > memory.log

上記のコマンドは、結果をmemory.logファイルにリダイレクトします。 そして、毎秒topコマンドの結果が表示されます。

ここで使用したさまざまなオプションを確認してみましょう。

  • -b :バッチモードを有効にし、ユーザーからの入力を受け入れない
  • -d1 :各結果の間に1秒の遅延を設定します
  • -o +%MEM :デフォルトのソートオプションをオーバーライドして、%MEM列の値を使用します。 + 記号は、降順で並べ替えるために使用されます

このコマンドは、すべてのプロセスの詳細をmemory.logファイルに記録します。 これにより、より多くのメモリを使用するプロセスも確認できます。

一方、全体的なメモリ消費量をログに記録したいだけの場合は、grepコマンドを使用してそれだけをフィルタリングできます。

それがどのように機能するか見てみましょう:

$ top -b -d1 -o +%MEM | grep -A1 'KiB Mem'
KiB Mem :  8072956 total,  2813224 free,  3001308 used,  2258424 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4596252 avail Mem 
--
KiB Mem :  8072956 total,  2813224 free,  3001308 used,  2258424 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4596252 avail Mem 
--
KiB Mem :  8072956 total,  2813224 free,  3001308 used,  2258424 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4596252 avail Mem 

ここでは、以前に試したのと同じtopコマンドを使用しました。 さらに、 grep コマンドを使用して、メモリ関連の情報をフィルタリングしました。 その結果、メインメモリとスワップメモリの使用量が出力されたことがわかります。 コマンドを終了するには、ctrl-cを押す必要があります。

スワップメモリの使用量を表示するために、grepコマンドの-A1オプションを使用して、一致する行の1行下を印刷しました。

4. sarコマンドの使用

システム情報を印刷するために使用される別のコマンドを見てみましょう。 sarコマンドは、システムアクティビティ情報を出力します。使用統計を継続的に出力するオプションも含まれています。

前に見た他の2つのコマンドとは異なり、これはメモリ使用量に関する詳細情報を出力します。

一般的な使用法は次のとおりです。

sar [ options ] [ <interval> [ <count> ] ]

サンプルの使用法を見てみましょう。

$ sar -o memory.log -r 1 3 --human
Linux 4.15.0-76-generic (slave-node) 	04/21/22 	_x86_64_	(4 CPU)

15:00:23    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
15:00:24         2.7G      4.4G      5.0G     65.2%    779.4M   1012.5M      7.5G     97.4%      3.8G    605.7M     84.0k
15:00:25         2.7G      4.4G      5.0G     65.2%    779.4M   1012.5M      7.5G     97.4%      3.8G    605.8M    120.0k
15:00:26         2.7G      4.4G      5.0G     65.2%    779.4M   1012.6M      7.5G     97.4%      3.8G    605.9M    156.0k
Average:         2.7G      4.4G      5.0G     65.2%    779.4M   1012.5M      7.5G     97.4%      3.8G    605.8M    120.0k

上記の結果は、1秒の遅延でメモリの詳細を3回出力したことを示しています。 また、そのセッションの平均も印刷されています。

この結果を得るために、以下のオプションを使用しました。

  • -o :このフラグを使用すると、バイナリ形式で指定されたファイル名への出力がキャプチャされます
  • -r :メモリ統計を出力します。 デフォルトでは、CPUの詳細を出力します
  • 1 :間隔として1秒を指定しました
  • 3 :結果を3回印刷します
  • –human :結果を人間が読める形式で表示します

このコマンドを実行すると、現在のディレクトリにmemory.logという名前の新しいファイルが作成されます。 このファイルはバイナリ形式であるため、-fオプションを指定してsarコマンドを使用して読み取る必要があります。

-o オプションを使用した場合でも、このコマンドは同じ情報を画面に出力します。 これをデーモンとして実行したい場合は、この出力を / dev /nullにリダイレクトできます。

5. vmstatコマンドの使用

vmstatコマンドは、メモリ、CPU、ディスク、およびプロセスに関する情報を表示するために使用されます。 sar コマンドと同様に、vmstatコマンドもシステムリソースを監視します。 これはまた、彼らの状態に関する多くの情報を提供します。

使用法は次のとおりです。

vmstat [options] [delay [count]]

このコマンドを実行する方法を確認しましょう。

$ vmstat 1 3 -a -S M -w -t
procs -----------------------memory---------------------- ---swap-- -----io---- -system-- --------cpu-------- -----timestamp-----
 r  b         swpd         free        inact       active   si   so    bi    bo   in   cs  us  sy  id  wa  st                 IST
 0  0            0         2747          605         3855    0    0     1    20    1    0   1   0  98   1   0 2022-04-21 15:00:35
 0  0            0         2747          605         3855    0    0     0     0  222  428   1   0  99   0   0 2022-04-21 15:00:36
 0  0            0         2747          605         3855    0    0     0     0  138  341   1   0 100   0   0 2022-04-21 15:00:37

結果から、メモリ使用量とその他の統計が3回出力されていることがわかります。

私たちが与えたさまざまなオプションを見てみましょう:

  • 1 :統計の印刷の遅延
  • 3 :統計を印刷したかった回数
  • -a :アクティブおよび非アクティブなメモリ情報を出力します。 デフォルトでは、バッファとキャッシュ情報を出力します
  • -SM :統計をMB単位で出力するように指示します
  • -w :大きな値に対応するようにワイドモードを設定します
  • -t :結果にタイムスタンプを出力します

6. / proc /meminfoファイル

最後に、procファイルシステムのmeminfoファイルを確認しましょう。 このファイルはすべてのメモリ関連情報を保持します。実際、freeおよびtopコマンドは、このファイルを使用してメモリ使用量情報を収集します。

このファイルをcatして、その内容を確認できます。 しかし、それは私たちに一度の情報を与えるでしょう。 したがって、1行のスクリプトを記述して、メモリパラメータを継続的に出力できます。

それを確認しましょう:

$ while true; do cat /proc/meminfo | grep 'MemTotal\|MemFree'; echo; sleep 1; done
MemTotal:        8072956 kB
MemFree:         2813452 kB

MemTotal:        8072956 kB
MemFree:         2812972 kB

MemTotal:        8072956 kB
MemFree:         2812576 kB

ここでは、 cat / proc / meminfoファイルの無限のwhileループがあります。 次に、 grep コマンドに送られ、MemTotalおよびMemFreeフィールドをフィルタリングします。 grep コマンドに必要に応じて、さらにフィールドを追加できます。 次に、区切り文字として空白行をエコーします。 最後に、 sleep を1秒間行い、ユーザーがctrl-cを押すまでプロセス全体を繰り返します。

7. 結論

このチュートリアルでは、メモリ使用量を監視するさまざまな方法を見てきました。 要件に合ったものを選択する場合があります。