Linuxターミナルからメモリ使用量を確認する方法
- Dave McKay
@TheGurkha
- 2020年3月11日、8:
Linux システムのメモリ使用量を把握する方法はたくさんあります。 このラウンドアップでは、最も一般的に使用されるコマンドラインの方法を取り上げます。 freevmstattopの3つです。
How Linux Uses RAM
RAM は、アプリケーションやデーモンなど、すべてのプロセスが必要とする有限のリソースです。 しかし、利用できる量は限られています。 カーネルは、メモリの争奪戦を審判し、割り当てられたメモリをすべての空腹なプロセスに配分します。 これは、グラブの数よりも多くの開いたくちばしを向けられた母鳥のようなものです。
未使用の RAM は無駄な RAM です。Linux は、余った RAM をファイル バッファ領域などに使用して、コンピュータを最適なパフォーマンスで動作させます。 システムの RAM が暴走プロセスやメモリ リークによって消費されているような印象を受けがちですが、そのようなことはほとんどありません。
それは通常、カーネルがバックグラウンドで粘り強く仕事をしているだけです。
カーネルがスワップ スペースの使用を開始したほうが効率的だと判断した場合は、それも利用します。 Linux の swappinessswappiness の値が、スワップを有効にするきっかけとなる RAM 使用量のしきい値を設定しているというのは事実ではありません。
では、ターミナル ウィンドウで Linux コンピュータの RAM 使用量を確認するために使用できるさまざまなテクニックを見ていきましょう。
free コマンド
free コマンドは、コンピューター上の合計、使用済み、空き、共有、バッファ/キャッシュ、および利用可能な RAM の表を表示します。
この例では、-m (mebibytes)オプションを使用します。 しかし、-b (bytes)、-k (kibibytes)、-g (gibibytes)を使うこともできます。
次のコマンドを入力します:
free -m
これが得られる出力です。
total used free shared buff/cache available Mem: 1987 901 95 80 990 811 Swap: 1521 651 869
Mem 列には次の情報が含まれています:
- Total: このコンピューターに搭載されている物理的な RAM の合計量です。
- 使用済み。 総量から Free+Buffers+Cache を引いたもの。
- Free: 未使用のメモリの量。
- Shared: ファイルシステムで使用されるメモリの量。
- Buff/cache。 バッファとキャッシュに使用されるメモリの量。 これは、必要に応じてカーネルによって迅速に解放されます。
- Available(使用可能)。
Swap 列には次の情報が含まれています:
- 合計:スワップパーティションまたはファイルのサイズ
- 使用済み。
- Free: 残りの (使用されていない) スワップ領域の量
使用されているスワップ領域の割合を確認するには、読者の方から教えていただいた以下の巧妙なトリックを使用することもできます:
free -m | grep Swap | awk '{print ($3/$2)*100}'
RELATED: Linux で free コマンドを使用する方法
vmstat コマンド
スワップ領域の状態を理解せずに、Linux ボックスで RAM がどのように使用されているかを十分に理解することはできません。 vmstat コマンドを使用すると、スワップ領域 (または仮想メモリ) がどのように使用されているかをより深く調べることができます。 これは、前回の再起動以降の平均値に基づいて、さまざまなスワップ関連の統計情報をレポートします。
次のように入力します:
vmstat
これは折り返しのない出力です:
このレポートには多くのデータ ポイントがありますので、それらを分解してみましょう:
- Proc:
- r: 実行可能な」プロセスの数です。
- r: 「実行可能な」プロセスの数。これらは実行中であるか、次のタイムスライスされた CPU サイクルのバーストを待っています。 これらは眠っているのではなく、ブロッキング システム コールを実行しています。 これらのプロセスは、現在のアクションを完了するまで中断できません。 通常、このプロセスは、あるリソースが空くのを待っているデバイスドライバです。
- メモリ:
- swpd: 使用されている仮想メモリの量、つまり、どれだけのメモリがスワップアウトされたかを示します。
- free: アイドル(未使用)メモリの量。
- buff: バッファとして使用されているメモリの量。
- cache: キャッシュとして使用されているメモリの量。
- Swap:
- si: スワップスペースからスワップインされた仮想メモリの量。
- so: スワップスペースにスワップアウトされた仮想メモリの量。
- IO:
- bi: Blocks in. 仮想メモリをRAMにスワップバックするために使用されるデータブロックの数。
- bo: ブロックアウト。 仮想メモリをRAMからスワップスペースにスワップするために使用されるデータブロック数。
- System:
- in: クロックを含む 1 秒あたりの割り込みの数。
- cs: 1秒あたりのコンテキストスイッチの数です。 コンテキストスイッチとは、カーネルがシステムモードからユーザーモードへと処理を切り替えることです。
- CPU。 これらの値はすべて総CPU時間に対するパーセンテージです:
- us:
- us: ユーザー (非カーネル) コードの実行に費やされた時間。
- sy: カーネル コードの実行に費やされた時間。 カーネルコードの実行に費やされた時間。
- id:
- id: アイドル状態の時間。
- wa: 受信または出力を待つために費やされた時間。
- st: ハイパーバイザーが他の仮想マシンへのサービスを終了してから、戻ってきてこの仮想マシンに対応するまでの仮想マシンの待機時間。
関連記事です。 Linux での vmstat コマンドの使用方法
top コマンド
top コマンドは、情報が詰まった画面を表示します。 値は数秒ごとに更新されます。
使用するには、次のように入力します。
top
「e」キーを押しました。 これにより、表示がメガバイトに変更されました。メガバイトは、バイトを表す長い文字列よりも視覚的に解析しやすいのです。
各行には以下のような情報が表示されています。
3行目のCPUフィールドは以下のとおりです。
- us:
- us: CPUがユーザースペースでユーザーのためのプロセスを実行するのに費やした時間。
- sy: CPUがシステムの「カーネル」を実行するのに費やした時間。
- sy: システムの「カーネル空間」のプロセスを実行するのに CPU が費やした時間
- ni: CPU が手動で nice 値を設定したプロセスを実行するのに費やした時間。
- id: CPU のアイドル時間。
- wa:
- wa: I/O の完了を待つために CPU が費やした時間
- hi: ハードウェア割り込みの処理に CPU が費やした時間
- si: ソフトウェア割り込みの処理に CPU が費やした時間。
- si: ソフトウェア割り込みの処理に CPU が費やした時間。
- st (steal time):
すべての列を見るには、左または右の矢印キーを押す必要があるかもしれません。
- PID: プロセスID.
- USER: プロセスのオーナーの名前.
- PR: プロセスの優先度。
- NI: プロセスのナイス値。
- VIRT: プロセスが使用する仮想メモリ。
- RES:
- SHR: プロセスが使用する共有メモリ
- S: プロセスのステータス。 (下記のこのフィールドが取り得る値のリストを参照).
- %CPU: 最後の更新以降にプロセスが使用したCPU時間のシェア。
- %MEM: 使用された物理メモリのシェア。
- TIME+: タスクが使用した総CPU時間(100分の1秒単位)。
- COMMAND: コマンド名または行(名前+オプション)。 (この列は上の画像では画面外の右側にあります。)
S 列に表示されるステータスは次のいずれかになります:
- D:
- R: Running.
- S: Sleeping.
- T: Traced(停止).
- Z: Zombie.
Qを押してtopを終了します。
/proc/meminfo の読み込み
Linux でメモリ統計を報告するツールの多く (おそらくほとんど) は、疑似ファイルシステム /proc/meminfo から情報を取得します。
次のように入力します。
less /proc/meminfo
実行しているカーネルや CPU のアーキテクチャに応じて、異なるフィールドが表示されるかもしれません。
MemTotal: 2035260 kB MemFree: 919064 kB MemAvailable: 1300932 kB Buffers: 33528 kB Cached: 457604 kB SwapCached: 29732 kB Active: 313360 kB Inactive: 603276 kB Active(anon): 74648 kB Inactive(anon): 355004 kB Active(file): 238712 kB Inactive(file): 248272 kB Unevictable: 16 kB Mlocked: 16 kB SwapTotal: 1557568 kB SwapFree: 873024 kB Dirty: 80 kB Writeback: 0 kB AnonPages: 414100 kB Mapped: 97436 kB Shmem: 4148 kB KReclaimable: 52932 kB Slab: 94216 kB SReclaimable: 52932 kB SUnreclaim: 41284 kB KernelStack: 9280 kB PageTables: 45264 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 2575196 kB Committed_AS: 5072192 kB VmallocTotal: 34359738367 kB VmallocUsed: 35712 kB VmallocChunk: 0 kB Percpu: 720 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB Hugetlb: 0 kB DirectMap4k: 180160 kB DirectMap2M: 1916928 kB
すべてのサイズは、特に明記されていない限り、kibibytes (キビバイト) です。
- MemTotal: 使用可能な RAM の合計 (いくつかの予約済みビットとカーネルのバイナリ コードを除く)
- MemFree:
LowFreeHighFreeの合計です。 現在利用可能なRAMの量です。 - MemAvailable: スワップなしで新しいアプリケーションを開始するために利用可能な推定メモリ量。
- Buffers(バッファ)。 生のディスクブロックのための一時的なストレージです。 これにより、ハードドライブのインとアウトを削減します。 また、同じデータに対する後続の要求に対しても、すでにメモリ内にあるため、アクセスが高速化されます。
- Cached(キャッシュ)。 ハードドライブ上のファイルから読み込まれたキャッシュされたページ(
SwapCachedは含まない)。 - SwapCached。 スワップアウトされて戻ってきたメモリで、スワップスペースにコピーが残っているもの。
- Active: 最近使用されたメモリ。 絶対に必要でない限り再利用されません。
- Inactive (非アクティブ)。 使用されているが、最近使用されたものではないメモリ。 再利用される可能性が高いです。
- Active(anon)。 疑似ファイル システムで作成されたファイルに割り当てられたメモリ。 匿名ファイルはハードドライブには存在しません。
- Inactive(anon)。 匿名、
shmemの立ち退き(メモリーの再利用)候補のメモリーの量 - Active(file)。 使用中のファイル キャッシュ メモリの量、または前回のメモリ再生サイクル以降に使用されたファイル キャッシュ メモリの量
- Inactive(file)。 ハード ドライブから読み込まれたファイル キャッシュ メモリのうち、再生の候補となるものの量。
- Unevictable: 回避可能であるべきだが、ユーザー空間のプロセスによってメモリにロックされているため回避できないメモリの量
- Mlocked。 ユーザースペースのプロセスによってロックされているため、回避可能ではないメモリの総量。
- HighTotal: ユーザースペースのプログラムやページキャッシュによって使用される HighMem の総量。 カーネルはこのメモリゾーンにアクセスできますが、LowMemよりもアクセスが遅くなります。 HighMemの空き容量。
- LowTotal:LowMemの容量で、HighMemと同じ用途に使用できるが、カーネルが独自の用途に使用することもできる。
- LowFree:LowMemの空き容量。 空いているLowMemの量。
- MmapCopy。 ファイル データにマップされているメモリの量。
- SwapTotal: 使用可能なスワップ スペースの合計量。
- SwapFree: 現在使用されていないスワップスペースの量。
- Dirty: ディスクに書き戻されるのを待っているメモリの量。
- Writeback:
- Writeback: ディスクに書き戻されているメモリの量。
- マップド。
- Shmem:メモリにマップされたファイル(ライブラリなど)。 疑似ファイル システムで消費されるメモリ量。
- KReclaimable:
- KReclaimable: カーネルのメモリ割り当てで、メモリに対する要求が十分に厳しい場合、カーネルは再要求を試みます。
- SReclaimable: カーネルのデータ構造キャッシュ。
- SUnreclaim: 再利用できない
Slabメモリの量 - KernelStack: カーネル スタックに割り当てられたメモリの量。
- PageTables。 最下層のページ テーブルに割り当てられたメモリの量。
- Quicklists。 ページ テーブルの割り当てと削除は非常に頻繁に行われる操作なので、できるだけ迅速に行うことが重要です。 そのため、ページ テーブルに使用されるページは、「クイックリスト」と呼ばれるいくつかの異なるリストにキャッシュされます。
- NFS_Unstable: サーバーが受信したが、まだ不揮発性ストレージに書き込まれていないネットワーク ファイル システム (NFS) のページ。
- バウンス。 ブロックデバイスのバウンスバッファーに使用されるメモリ。 バウンスバッファは、デバイスが直接アクセスできるようにメモリの低い位置に配置されます。
- WritebackTmp。 Filesystem in Userspace (FUSE)が一時的なライトバックバッファに使用するメモリ。
- CommitLimit: システムで現在割り当て可能なメモリの総量。
- Committed_AS: 現在の要求をすべて満たすために推定されるメモリの量。 プログラムがいくつかのRAMを要求した場合、その要求は記録されますが、RAMはプログラムが使用を開始して初めて割り当てられます。 また、プログラムが予約した最大量まで、必要に応じてのみ割り当てられます。 実際に提供できる量よりも多くのメモリが「割り当て」られます。
- VmallocTotal: vmalloc メモリ領域の合計サイズ
- VmallocUsed: vmalloc領域の使用量。 Linux 4.4以降、このフィールドは計算されなくなり、ハードコーディングされています。
- VmallocChunk: 空き vmalloc 領域の最大の連続ブロック。
- HardwareCorrupted。 物理的なメモリ破損の問題があるとしてタグ付けされたメモリの量。 割り当てられません。
- LazyFree。
MADV_FREEMADV_FREEフラグを設定すると、そのページが必要なくなったことを示し、埋め立ての候補となります。 実際の埋め立ては、メモリに対する十分な需要が発生するまで遅れる可能性があります。 - AnonHugePages: ファイルバックされていない巨大なページがユーザースペースのページテーブルにマッピングされました。 ファイルにバックアップされていないページは、ハード ドライブ ファイルから来たものではありません。
- ShmemHugePages。 巨大なページで割り当てられた共有メモリ (
shmem) で使用されるメモリの量。 - ShmemPmdMapped:
- CmaTotal: CMA (Contiguous Memory Allocator) ページの量。 これらは、メモリの連続した領域にしか通信できないデバイスによって使用されます。
- CmaFree。 CMA(Contiguous Memory Allocator)の空きページの量。
- HugePages_Total: 巨大ページプールのサイズ。
- HugePages_Free: プール内の未割り当て巨大ページの数。
- HugePages_Rsvd: 予約された巨大ページの数。 割り当てのコミットは行われているが、割り当てはまだ行われていない。
- HugePages_Surp: 定義されたシステム値を超えるプール内の巨大ページの数。
- Hugepagesize。 巨大ページのサイズ。
- DirectMap4k。
- DirectMap4k: 4 kB ページにマップされた RAM のバイト数。
- DirectMap4M: 4 MB ページにマップされた RAM のバイト数。
- DirectMap2M: 2 MB ページにマップされた RAM のバイト数。
- DirectMap1G: 2 GB のページにマップされた RAM のバイト数。
Linux の常として、簡単な概要を得るには複数の方法があり、詳細に踏み込むには常に少なくとも 1 つの方法があります。
あなたはおそらく、freetopvmstate/proc/meminfoは、特定の問題を深く掘り下げて調査する必要があるときのために確保しておきましょう。
Dave McKay氏は、パンチングテープが流行っていた頃に初めてコンピュータを使い、それ以来ずっとプログラミングを続けています。 IT業界での30年以上の経験を経て、現在はフルタイムの技術ジャーナリストとして活躍しています。 その間、フリーランスのプログラマー、国際的なソフトウェア開発チームのマネージャー、ITサービスのプロジェクトマネージャー、そして最近ではデータ保護責任者として活躍しています。 デイブは、Linuxのエバンジェリストであり、オープンソースの提唱者でもあります。Read Full Bio “