ITエンジニアによるITエンジニアのためのブログ

Linuxでのメモリー不足の調査手順(free、vmstat、top)

Linuxではメモリーの使用状況を確認するための様々なコマンドがありますが、システムパフォーマンス低下がメモリ不足によるものなのかをどのコマンドを使って調査すべきか悩む人も多いのではないでしょうか。

結論からお伝えすると、メモリーの使用状況は 1) free、2) vmstat、3) top の順番で調査するのが理想です。

本記事では各コマンドの表示内容、役割の違いを説明し、なぜ上記順番で調査すべきかを解説します。

目次

  • Linuxのメモリー管理の基礎
  • freeコマンド
  • vmstatコマンド
  • topコマンド
  • パフォーマンス低下時の調査手順
  • まとめ

Linuxのメモリー管理の基礎

Linuxカーネルは物理メモリー(RAM)に加え、スワップ領域と呼ばれるハードディスク/SSDの容量の一部を仮想メモリーとしてアプリケーションプログラムに提供しています。仮想メモリーはページと呼ばれる(一般的に)4キロバイトごとの単位で管理されます。

物理メモリーが足りなくなると、カーネルはあまり使われていないページを物理メモリーからスワップ領域に移動させます。これをスワップアウト(またはページアウト)と呼びます。

逆にアプリケーションプログラムがスワップ領域にあるページを必要とするときは、カーネルがそのページをスワップ領域から物理メモリーに移動させます。これをスワップイン(またはページイン)と呼びます。

Linuxカーネルはこのように、高速だが容量が限られている物理メモリーと、低速だが大量の容量を提供できるスワップ領域を組み合わせることで、物理メモリー単体では不可能な大容量プログラムの同時実行や、プログラムが必要なデータへの高速アクセスを可能にしています。

ただしディスクI/Oは低速なので、物理メモリーの量が逼迫されて頻繁にページング(スワッピング)が発生するとシステムパフォーマンス低下につながります。

また、さらにメモリーを使用して全ての仮想メモリー(RAM + スワップ領域)を使い切ってしまうと、カーネルが新しいプロセスにメモリ割り当てを行えなくなるだけでなく、既存プロセスを強制終了(OOM Killer)したり、過剰なページングによってシステムがフリーズしたりします。

パフォーマンス劣化の比較

状態スワップ領域に余裕がある場合(通常のページアウト)仮想メモリーが完全に枯渇した場合
発生メカニズムRAMが不足し、アイドル状態のページをスワップアウトする。RAMとスワップの両方が満杯で、どこにもメモリーを書き出せない。
パフォーマンスディスクI/Oによる遅延が発生する(システムが重くなる)。システム全体が機能不全に陥る。
システム影響遅くなるが、動作は継続する。アプリケーションの強制終了、システムフリーズ、クラッシュ。
I/Oの度合い過剰になる。極端に過剰になり、システムがディスクの応答待ちで完全に停止する。

そのため、システムパフォーマンスの低下時には以下に紹介するコマンドを使ってメモリー使用状況を確認することが重要です。

freeコマンド

freeコマンドは、現時点での物理メモリーとスワップ領域それぞれの総容量、使用容量、空き容量の他、カーネルが使用しているバッファーとキャッシュ容量を表示します。

2行で表示され、1行目が物理メモリー(RAM)、2行目がスワップ領域の情報です。

  • Mem: total: 搭載されているRAMの総容量。
  • Swap: total: 設定されているスワップ領域の総容量。
  • Mem: used: 現在使用されているRAM容量。 計算式は total – free – buff/cache となることが多いです。
  • Swap: used: 現在使用されているスワップ容量。スワップの場合はbuffersとcacheがないため、計算式は total – free です。
  • Mem: free: 現在空いているRAM容量。Linuxは、使われていない物理メモリーを積極的にファイルキャッシュなどに割り当て(buff/cache)、システム全体のパフォーマンスを向上させます。このため、この値は常に低くなります。現在、システムが実質的にどれだけの空きメモリーを持っているかを判断するには、free列よりも available 列を参照することが推奨されます。
  • Swap: free: スワップ領域で現在空いているスワップ容量。
  • Mem: shared: 複数のプロセス間で共有されている物理メモリー量。
  • Swap: shared: なし。物理RAM上にあるデータの共有状況を示すため、スワップ領域での表示はありません。
  • Mem: buff/cache: バッファ及びキャッシュ。ユーザーにとって重要なのは個別値よりも解放可能なメモリー量であり、両者とも解放可能なため合計値が表示されます。
  • Swap: buff/cache: なし。物理RAM上にのみ存在するため表示はありません。
  • Mem: available: 新規のアプリケーションが要求した際に、スワップを使わずにすぐに割り当てられるとカーネルが推定する物理メモリー量(free + すぐに解放可能なbuff/cacheの一部とメモリースラブ)。
  • Swap: available: なし。物理メモリーに関する指標のため、表示はありません。

バッファ (Buffers) は、ファイルシステムのメタデータ(ファイルやディレクトリの情報、ディスクの構造など)を一時的に保存するために使われるメモリー領域です。ディスクへの書き込みや読み込みをブロック単位で整理し、効率化を図るために使われます。

キャッシュ (Cache) は、プロセスが実際に使用するファイルの内容(データ)を一時的に保存するために使われるメモリー領域です。一度ディスクから読み込んだデータをRAMに保持することで、次に同じデータが必要になったときにディスクアクセスなしで高速に提供できます。このキャッシュは特にページキャッシュと呼ばれ、RAMの大部分を占めることが多いです。

スラブ (Slab) は、カーネルのページで構成されたメモリーの塊です。カーネルオブジェクトの効率的な管理に使われます。slabtopコマンドで確認できます。

バッファとキャッシュの個別の数値を確認したい場合は、/proc/meminfoファイルの内容を直接見ることができます。

cat /proc/meminfo | grep -E 'Buffers|Cached'

なお、freeコマンドに -t (トータル)オプションを付けると、3行目に物理メモリー + スワップ領域の合計値(コミット可能な総量)が表示されます。この合計容量を完全に使い果たすとシステムがフリーズしたりアプリケーションが強制終了されたりするため、監視すべき重要な指標です。

    vmstatコマンド

    vmstatコマンドはバーチャルメモリー(物理メモリーとスワップ領域)、ディスクI/O、CPU使用率等に関する統計情報を表示します。

    最初の行はシステム起動時から現在までの平均値を表示し、2行目からは指定したインターバルの情報を表示します。

    例えば5秒間の統計情報を3回(最初の行含む)、メビバイト単位で表示させたい場合は以下のようにコマンドを実行します。

    # -S オプションは単位指定 (M = メビバイト)
    vmstat -S m 5 3

    メモリーに関する統計は以下のカラムで表示されます。

    • memory
      • swpd (Swapped): スワップ領域に書き出されている仮想メモリー。
      • free: 空いている物理メモリー。
      • buff: 物理メモリー上のバッファ。
      • cache: 物理メモリー上のページキャッシュ。
    • swap
      • si (Swap in): ディスクのスワップ領域からRAMへページが読み込まれている量/秒。
      • so (Swap out): RAMからディスクのスワップ領域へページが書き込まれている量/秒。
    vmstatカラム対象領域freeコマンドの対応項目
    swpdスワップ領域Swap: 行の used
    free物理メモリーMem: 行の free
    buff物理メモリーMem: 行の buff/cache の一部 (バッファ)
    cache物理メモリーMem: 行の buff/cache の一部 (キャッシュ)

    (注: vmstatbuff + cache は、freebuff/cache と厳密には一致しない場合があります)

    このように、freeコマンドが静的なスナップショット(一時点の状態)を提供するのに対し、vmstatは継続的にシステム状況を監視する動的な統計情報を提供します。

    topコマンド

    topコマンドはメモリー情報を含むシステムに関する様々な指標を表示します。

    メモリーに関する情報は以下の2つのエリアで確認できます。

    1. サマリーエリアでのシステム全体のメモリー使用状況。
    2. タスクエリアでの個別タスクのメモリー使用状況。

    サマリーエリア

    サマリーエリアではfreeコマンドと同じくシステム全体のメモリー使用状況が表示されます(sharedを除く)。

    各行の最初には単位が表示されます(MiBはメビバイト)。

    avail Memはスワップ領域の行で表示されていますが、これは表示エリアを有効に使うためであり、実際は物理メモリー行に属している項目が改行されて表示されています(実際、スワップ行はusedで行の終わりを示す .(ピリオド)が使われています)。

    タスクエリア

    タスクエリアでは個別プロセスのメモリ使用状況が確認できます。

    • VIRT (Virtual Memory Size) : プロセスが使用しているバーチャルメモリーの総容量。コード、データ、共有ライブラリ、スワップされたページを含みます。アクセス可能な仮想アドレス空間の合計サイズを示しており、予約されたが実際に使われていないものも含みます。そのため、システム全体のRAM容量とスワップ領域の合計値よりも大きくなることがあります。
    • RES (Resident Memory Size)VIRTの一部で、プロセスが現在RAM(物理メモリー)に確保している部分。プロセス間で共有されている共有メモリーは、各プロセスのRESに重複してカウントされます。
    • SHR (Shared Memory Size)RESの一部で、他のプロセスが使用している可能性がある共有メモリー。
    • SWAP(デフォルトでは表示されないので、fキー(Fields management の略)を押して選択する必要があります。): プロセスによって使用されているスワップされたサイズ。ディストリビューションやtopのバージョンによって、この値が示す内容が異なる場合があります。man topで確認する必要がありますが、一般的に以下のいずれかを指します。
      • VIRTRES: プロセスが確保した仮想メモリーのうち、物理メモリー(RES)にない部分。これには、実際にスワップ領域に書き出されたものだけでなく、まだ物理的に確保されていない領域も含まれる可能性があり、実スワップ量とは異なる場合があります。(多くのLinuxディストリビューションのtopはこちらを採用しています)
      • 実スワップ量: プロセスが 実際に スワップ領域に書き出しているメモリー量 (/proc/<pid>/statusVmSwap に相当)。
    • %MEM(Memory Usage (RES)):物理メモリー総容量に対するプロセスのRESの割合。

    このように、topはシステム全体と個別タスク両方のメモリー使用状況を表示できます。

    ただ、表示項目が多いがゆえにtopの使用自体がシステムに負荷をかけてしまうという側面があります。そのため、システム全体のメモリー使用状況はfreevmstatコマンドで確認し、個別タスクのメモリー使用状況をtopで確認するのがおすすめです。

    パフォーマンス低下時の調査手順

    パフォーマンス低下がメモリー不足によるものかどうかを判断するには、これまで紹介した3つのコマンドを以下の手順で組み合わせて使うのが理想です。

    1.初期診断(free

    まず free -h (-hは人間が読みやすい単位で表示) を実行し、Mem行の available が非常に少ない値になっていないかをチェックします。

    2. 動的監視(vmstat

    次に vmstat 1 (1秒ごとに統計情報を更新) などのコマンドで実行し、swapsi(スワップイン)と so(スワップアウト)の値が継続的に(ゼロではなく)増加していないかを確認します。

    これらの数値が継続的かつ高い値を示している場合、RAMが慢性的に不足しており、システムが頻繁にスワッピングを行っていることが確認でき、これがパフォーマンス低下の直接的な原因である可能性が高いです。

    ヒント: メモリー不足による激しいスワッピングは、ディスクI/Oの負荷を急増させます。vmstatの io ブロックにある wa (wait) 列(I/O待ちのCPU時間)が同時に増加している場合、スワッピング(つまりメモリー不足)がI/Oボトルネックを引き起こしているという強い証拠になります。

    3. ボトルネックの特定(top

    スワッピングが発生している場合、topコマンドでどのプロセスが RESVIRT が高く、大量のメモリーを消費しているかを特定します。

    まとめ

    freevmstattopの3つのコマンドを適切な順番で使うことによって、システムパフォーマンス低下の原因がメモリー不足にあるかどうかを効率的に調査することができます。システム動作が遅くなった時は、ぜひ試してみてください。