본문

Tech
Linux freeコマンドでメモリの状態を確認する方法

작성일 2019.07.09

blog_37_main.webp

freeコマンドを使用すると、メモリ使用量と空き容量、およびキャッシュに使用されるメモリがどれくらいであるかを簡単に把握できます。実際のfreeコマンドは、Linux/proc/meminfoからメモリ情報を取得して表示します。それでは、freeコマンドで見ることができるメモリ情報とそれに関連するmeminfoの値を見てみましょう。

freeコマンド

code_00.webp

  • [total] : インストールされた合計メモリサイズ/設定されたスワップ合計サイズ
  • [used] : totalからfree、buff/cacheを引いた使用中のメモリ。 /使用中のスワップサイズ
  • [free] : total から used と buff/cahce を引いた実使用可能な空きメモリ量 / 未使用スワップサイズ
  • [shared] : tmpfs(メモリファイルシステム)、ramfsなどとして使用されるメモリ。 複数のプロセスで使用できる共有メモリ
  • [buffers] : カーネルバッファとして使用中のメモリ
  • [cache] : ページキャッシュとslabとして使用されているメモリ
  • [buff/cache] : バッファとキャッシュを加えた使用中のメモリ
  • [available] : swappingなしで新しいプロセスで割り当て可能なメモリの予想サイズ。(以前の-/+ buffers/cacheが消えて新しくなったカラム)

オプション

  • [-h] : 人が読みやすい単位で出力する。
  • [-b | -k | -m | -g] : バイト、キビバイト、メビバイト、ギガバイト単位で出力します。
  • [--tebi | --pebi] : テビバイト、ペビバイト単位で出力する。
  • [--kilo | --mega | --giga | --tera | --peta] : キロバイト、メガバイト、ギガバイト、ペタバイト単位で出力する。
  • [-w] : ワイドモードでcacheとbuffersを別々に出力する。
  • [-c '繰り返し'] : 指定した繰り返し回数だけ free を連続して実行する。
  • [-s ''] : 指定した秒だけディレイを置いて継続的に実行する。
  • [-t] : 合計が計算されたtotal列行をさらに出力します。

キャッシュ(Cache)とバッファ(Buffer)との違い

Linuxは常に空きメモリ領域をBufferとCacheとして使用しようとします。メモリにデータを保存することで、遅いディスクへのアクセスをできるだけ減らし、パフォーマンスを向上させます。

Bufferは、バッファキャッシュでデバイスブロックのメタデータをメモリにキャッシュしたサイズです。 ブロックデバイスからデータを読み取るために必要な情報をメモリに保存します。

Cacheは、ページキャッシュとslabとして使用されているメモリサイズです。

  • ページキャッシュは一度ディスクに読み込まれたデータをメモリに保存し、同じデータを再読み込みするときにディスクに要求せずにメモリから直接読み出すことができます。
  • slab は、カーネルが管理するカーネルオブジェクトを格納する単位です。カーネルは、アプリケーション割り当て単位のページよりも小さい単位であるslab単位でメモリを使用します。1つのメモリページに複数のslabが存在する可能性があります。
  • slabにファイルのinodeやdentry情報をキャッシュできます。

実際に約1Mサイズのファイルを生成してそれを読むと、cacheサイズが増加することがわかります。

code_01.webp

ファイルを読み込む前のキャッシュサイズ

code_02.webp

1Mサイズのファイルを読む

code_03.webp

1M増加したキャッシュサイズ

CacheとBufferの間に最近使用されていないメモリサイズの詳細については、/proc/meminfoで確認できます。

code_04.webp

上に見えるInactive(anon)とInactive(file)、SRelaimableが参照されてから古いスワップ領域に移動し、その領域を新しいメモリに割り当てることができるサイズです。

  • Inactive(anon)は、匿名メモリのうち参照が少ないメモリサイズです。
  • Inactive(file)は、ページキャッシュ中の参照が少ないメモリサイズです。
  • SRelaimableは、slab中に再割り当て可能な領域です。

freeコマンドでこれらの値を参照してメモリにキャッシュされたデータのうちスワップ領域にアウトさせ、メモリを空にして新しい割り当てができる大きさをfreeコマンドのavailableとして示すものです。 availableはあくまでシステムで計算された予測サイズなので、この値にあまり依存してはいけません。

スワップ(swap)メモリ

スワップは、ディスクの一定部分をメモリ領域不足時にメモリのように使用するために設定しておいた空間です。

カーネルは、メモリが不足している状況では、BufferとCacheに割り当てられているもののうち、頻繁に使用されていないものを空にしてメモリに割り当てようとします。 また、メモリ内のデータのうち、最近使用されていないデータをSWAP空間に移動します。(SWAP-OUT)

そして、SWAPに転送されたデータをプロセスが読み取るためにメモリにデータを取り戻します。(SWAP-IN) これはディスクから移動されたデータをメモリに戻すため、レイテンシが長くなり、最終的にパフォーマンスが低下します。

一時的なメモリ使用量の増加により、一定の SWAP を使用する状況と継続的なメモリ不足により SWAP が大きくなる場合を継続的にモニタリングし、メモリ増設のタイミングを考慮する必要があります。

まとめ

ロードバランシングまたはワークロードを分散配置するプログラムは、/proc/meminfoを参照して、キャッシュ領域を空にしてどのくらいのメモリ割り当てが可能かについての情報も確認します。手動で命令を使用してキャッシュを空にすることもできます。ただし、キャッシュを適切に使用するとシステムのパフォーマンスが向上し、頻繁にキャッシュを空にするとパフォーマンスが低下する可能性があります。そのため、システムの特性に合わせてキャッシュのカーネルパラメータを適切に設定することについて考える必要があります。

WhaTap Monitoringを体験してみましょう。
難しかったモニタリングと分析が容易に実現できます。