linuxシステムのメモリ使用量の概要を把握する方法はたくさんあります。この概要では、最もよく使われるコマンドラインメソッドである free、vmstat、top を取り上げます。また、read/proc/meminfo... を直接見ていきます。
Linuxシステムのメモリ使用量の概要を把握する方法はたくさんあります。この概要では、最もよく使われるコマンドライン方式である free、vmstat、top を取り上げます。また、read/proc/meminfo について直接見ていきます。
リナックスのラムの使い方
RAMは有限の資源であり、すべてのプロセス(アプリケーションやデーモンなど)はその一部を必要とします。しかないのです。カーネルは、メモリの競合を判断し、割り当てられたメモリを飢えたすべてのプロセスに割り当てる。それはまるで、開いたくちばしを餌ではなく、自分に向ける母鳥のようなものです。
Linuxは、空きRAMをファイルバッファ領域として使用し、コンピュータを最適なパフォーマンスで動作させることができます。システムのRAMが、何らかの暴走プロセスやメモリリークによって消費されたような印象を受けがちですが、そのようなことはほとんどありません。
通常、カーネルがバックグラウンドで頑固に仕事をしているだけです。もし、カーネルが自分自身のデバイスのためにRAMに他の要求を掘り起こしたら、害がないようにすぐにメモリを落とします。
また、カーネルがスワップスペースの使用を開始した方が効率的と判断した場合にも有効です。Linux の swappeiss 値と、カーネルがスワップを使い始めるタイミングについて、多くの混乱があります。 swapiness 値は、スワップを起動させる RAM 使用量の閾値を設定しますが、これは真実ではありません。
しかし、ここでは、LinuxコンピュータでRAMがどのように使用されているかを確認するために、ターミナルウィンドウでどのような異なるテクニックを使用することができるかを見てみましょう。
指揮の自由度
freeコマンドは、コンピュータの総メモリ、使用メモリ、空きメモリ、共有メモリ、バッファ/キャッシュ、空きメモリの一覧表を提供します。また、設定されているスワップスペースの総量、スワップスペースの使用量と使用可能量も表示されます。
この例では、-m(mebibytes)オプションを使用します。ただし、-b(バイト)、-k(キビバイト)、-g(ギビバイト)を使用することも可能です。
次のようなコマンドを入力します。
free -m
このような出力が得られます。
total used free shared buff/cache available Mem: 1987 901 95 80 990 811 Swap: 1521 651 869
Mem欄には、以下の情報が記載されています。
- 合計:このコンピューターの物理的なRAMの合計量です。
- 使用:合計から、フリー+バッファ+キャッシュの合計を引く。
- Free:未使用メモリ量。
- 共有:tmpfsファイルシステムが使用するメモリ量。
- Buff/cache:バッファとキャッシュに使用されるメモリ量で、カーネルは必要に応じてすぐに解放することができます。
- 使用可能:アプリケーションおよびコンピュータ上の他のオペレーティング・ソフトウェアからのメモリ要求を処理するために使用可能なメモリの概算値です。
為替欄には、以下の情報が記載されています。
- 合計:スワップパーティションまたはファイルのサイズ。
- Used:使用されているスワップスペースの量です。
- Free:残りの(未使用の)スワップスペースの量です。
また、読者の方から教えていただいた以下の裏技を使えば、スワップスペースの使用率を確認することができます。
free -m | grep Swap | awk '{print ($3/$2)*100}'
関連:Linuxでのfreeコマンドの使い方
vmstatコマンド
Linux システムにおける RAM の使用方法をよく理解するためには、スワップスペー スと密接な関係にあるスワップスペースの状態を理解しないわけにはいきません。
vmstatコマンドを使用すると、スワップ領域(または仮想メモリ)がどのように使用されているかをより詳細に知ることができます。スワップ関連の各種統計情報を、前回の再起動以降の平均値に基づいてレポートとして提供します。
と入力する。
vmstat
これはサラウンドなしの出力です。
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 671488 576084 51088 823876 1 7 53 62 99 14 4 1 95 0 0
このレポートには多くのデータが掲載されているので、それを分解して紹介する。
- Proc: r: 「実行可能」なプロセスの数。これらは、実行中か、次のCPUサイクルのスライスバーストを待っている状態です。b: スリープ状態を解除したプロセス数。スリープしているわけではなく、ブロックしているシステムコールを実行しているのです。現在の動作が完了するまで、中断することはできません。通常、この処理はデバイスドライバが何らかのリソースが自由になるのを待つものです。プロセスが通常の活動を再開すると、そのプロセスに対してキューイングされているすべての割り込みが処理されます。
- メモリ:swpd:仮想メモリの使用量、つまりスワップされたメモリの量。Free:空き(未使用)メモリ量。Buffer: バッファとして使用するメモリ量。Cache:キャッシュとして使用するメモリ量。
- スワップ:si:スワップ領域からスワップされた仮想メモリの量 so:スワップ領域に対してスワップされた仮想メモリの量。
- IO:バイ:ブロック仮想メモリをRAMにスワップバックするために使用するデータブロック数。bo:アウトオブブロック。仮想メモリをRAMからスワップ領域にスワップする際に使用するデータブロックの数です。
- システム:in:クロックを含む1秒あたりの割り込み数。cs: 1秒あたりのコンテキストスイッチの回数。コンテキストスイッチとは、カーネルがシステムモードからユーザーモードの処理に切り替わることです。
- CPU:これらの値はすべて、総CPU時間に対するパーセンテージです:us:ユーザー(非カーネル)コードの実行に費やされた時間です。sy: カーネルコードの実行に費やされた時間。id:アイドルタイム。wa:入力や出力を待っている時間。st:ハイパーバイザーが他のVMのサービスを終了してから、このVMを復帰して処理するまでの待機時間。
関連:Linuxでのvmstatコマンドの使用方法
ハイコマンド
トップコマンドは、数秒ごとに値が更新される情報の画面を表示します。
使用するには、次のように入力します。
top
e」キーが押される。これは、バイトを表す長い文字列よりも視覚的に解析しやすいメガバイトへの変更を表示するものです。画面の上部には5つの行の情報があり、その下にはデータの列を含むペインがあります。
ここでは、それぞれの行に記載されている情報をご紹介します。
- 1行目:時間、コンピュータの起動時間、ログイン者数、過去1分、5分、15分の平均負荷。
- 2行目:タスクの数と状態(実行中、停止中、スリープ、ゾンビ)。
- 3行目:CPU情報(以下の項目の内訳を参照)。
- 4行目:物理メモリの合計、および空きメモリ、使用メモリ、キャッシュ、バッファリングされているメモリの量。
- 5行目:スワップメモリの総量、および空きメモリ、使用メモリ、空きメモリの量(キャッシュからの回復が期待できるメモリを考慮)。
3行目のCPUフィールドは以下の通りです。
- us:CPUがユーザー空間でユーザーのためのプロセスを実行するのに費やす時間。
- sy:CPUがシステムの「カーネル空間」プロセスの実行に費やす時間。
- ni: 手動で設定したグッド値で、CPUがプロセスを実行するのに要した時間。
- id:CPUのアイドルタイム。
- wa:CPUがI/Oを完了するまでの待ち時間。
- Hi:ハードウェア割り込みのCPU処理時間。
- si:CPUがソフトウェア割り込みを維持するために使用する時間です。
- st(スティールタイム):仮想マシンの実行によりCPUが失われる時間。
すべての列を見るには、左右の矢印キーを押す必要がある場合があります。各列の値は、以下のように記述されています。
- PID:プロセスID。
- USER:プロセスの所有者の名前。
- PR:プロセスの優先順位。
- ニ:その過程は貴重なものでした。
- VIRT: プロセスが使用する仮想メモリ。
- RES: プロセスが使用する常駐メモリ。
- SHR: プロセスが使用する共有メモリ。
- S: プロセスの状態 (以下のこのフィールドで利用可能な値のリストを参照)。
- %CPU: 前回の更新以降にプロセスが使用したCPU時間のシェア。
- MEM: 使用された物理メモリのシェア。
- TIME+: タスクが使用したCPU時間の合計を100分の1秒単位で表示します。
- コマンド:コマンド名またはコマンドライン(名前+オプション)。 この欄は、上の画像の右側の画面外にあります)。
S列に表示される状態は、以下のいずれかになります。
- D:途切れることのない睡眠。
- R:走ること。
- S:睡眠。
- T:Tracking(停止)。
- Z:Zombie(ゼット・ゾンビ)。
Qを押して、topを終了します。
proc/meminfoの読み込み中
Linuxでメモリ統計情報を報告するツールの多く(おそらくほとんど)は、擬似ファイルシステム/proc/meminfoから情報を取得します。同じことをするために、catやlessというコマンドを使うことができるのです。
以下のように入力します。
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
サイズは特に断りのない限り、すべてキロバイトで表記しています。ここでは、その意味と、お使いのコンピュータの構成やハードウェアによって異なる意味をご紹介します。
- MemTotal:利用可能なRAMの合計(一部の予約ビットとカーネルバイナリコードを除く)。
- MemFree:LowFree+HighFreeの合計で、現在利用可能なRAMの量です。
- MemAvailable:スワップなしで新しいアプリケーションを起動するために利用可能なメモリの見積もり。
- バッファ:オリジナルディスクブロックのための一時的なメモリ。これにより、ハードディスクドライブの入出力が抑えられます。また、同じデータがすでにメモリ上に存在する場合、それ以降のリクエストに対するアクセスも高速化されます。
- Cached:ハードディスク上のファイルから読み込んだキャッシュページ(SwapCachedは含まず)。
- SwapCached:スワップスペースにメモリのコピーを保持します。
- アクティブ:最近使用されたメモリで、絶対に必要でない限り再利用されない。
- 不活性:使用されているが、最近使用していないメモリ。埋立地の可能性が高い。
- active (anon): tmpfs擬似ファイルシステムで作成されたファイルに割り当てられたメモリ。
- Inactive (anon): エビジョン(メモリ再生)の候補となる匿名、tmpfs、shmemのメモリ量。
- アクティブ(ファイル):使用中または最後のメモリ再生サイクル以降に使用されたファイルキャッシュメモリの量です。
- 非アクティブ(ファイル):ハードディスクから読み込まれたファイルキャッシュメモリのうち、リサイクル候補となる量。
- Irrecoverable:回復可能なはずのメモリ量だが、ユーザー空間のプロセスによってメモリ内にロックされているため、回復できない量。
- Mlocked:ユーザー空間のプロセスによってロックされているため、回復できないメモリの合計量。
- HighTotal:ユーザースペースプログラムとページキャッシュが使用するHighMemの総量です。カーネルはこのメモリ領域にアクセスすることができますが、LowMemよりも低速です。
- HighFree:使用可能なHighMemの数です。
- lowtottal: HighMemと同じ目的を持つLowMemの数ですが、カーネルは独自の目的も持っています。
- LowFree:LowMemの空き容量。
- MmapCopy:ファイルデータにマッピングされるメモリ量。
- SwapTotal:使用可能なスワップスペースの総量。
- SwapFree:現在の未使用スワップスペースの量です。
- Dirty:ディスクへの書き戻し待ちのメモリ量。
- ライトバック:ディスク上のメモリに積極的に書き戻すこと。
- AnonPages:ユーザースペースページテーブルにマッピングされた非ファイルバックアップページ。
- マッピング:メモリにマッピングされたファイル(ライブラリなど)。
- Shmem:tmpfs疑似ファイルシステムで消費されるメモリ量。
- KReclaimable:メモリに対する要求が十分に厳しい場合、カーネルはカーネルメモリ割り当ての再請求を試みます。
- Slab: カーネルデータ構造キャッシュ。
- Reclaimable:キャッシュなど再利用可能なボードメモリの量。
- sunclaime: 回収できないボードメモリの量。
- KernelStack:カーネルスタックに割り当てられているメモリ量。
- ページテーブル:最下位レベルのページテーブル専用のメモリ量。
- 高速リスト:ページテーブルの割り当てと削除は非常に頻繁に行われる操作であるため、できるだけ速くページテーブルを割り当て、削除することが重要である。そのため、ページテーブルに使用されるページは、"高速リスト "と呼ばれる複数の異なるリストにキャッシュされます
- NFS不安定:サーバーがネットワークファイルシステム(NFS)ページを受信したが、まだ不揮発性ストレージに書き込まれていない。
- Bounce:ブロックデバイスのバウンスバッファに使用するメモリです。バウンスバッファは、デバイスが直接アクセスできるように、メモリ内の十分低い位置に配置されています。そして、そのデータはHighMemの必要なユーザーページにコピーされます。
- WritebackTmp:ユーザー空間のファイルシステム(FUSE)が一時的なライトバックバッファーに使用するメモリです。
- CommitLimit:システムで現在割り当て可能なメモリの総量。
- 提出された调子:現在のすべての要求を満たすための推定RAM量。プログラムがRAMを要求した場合、その要求は記録されるが、RAMはプログラムが使用を開始したときにのみ割り当てられ、また、プログラムが予約した最大量まで、必要なときにのみ割り当てられる。実際に供給されるよりも多くのメモリが「割り当て」られる可能性があります。すべてのプログラムがすぐにRAMチップを現金化しようとすれば、メモリカジノは破産しかねない(スワップスペースの金融業者と手を取り合って働かなければならない)。
- VmallocTotal:vmallocメモリ領域の合計サイズです。
- VmallocUsed: 使用されたvmalloc領域の数。Linux 4.4 のおかげで、このフィールドはカウントされなくなり、ハードコードされるようになりました。
- VmallocChunk:フリーvmalloc領域内の連続した最大のチャンク。
- HardwareCorrupted: 物理メモリ破壊の問題があるとしてマークされたメモリ量。
- LazyFree: MADVU FREE状態にあるメモリ量。アプリケーションが一連のページにMADVu FREEフラグを設定すると、そのページが不要になり、リサイクルの候補になることを意味する。実際のリサイクルは、十分なメモリ需要があるまで遅れる可能性があります。アプリケーションがページの書き込みを開始した場合、リサイクルをキャンセルすることができます。
- anonhuggepages: ユーザ空間のページテーブルにマッピングされた、ファイル以外のバックアップの巨大なページ。
- ShmemHugePages:共有メモリ(shmem)と擬似ファイルシステム(tmpfs)が使用するメモリ量です。
- ShmemPmdMapped。巨大なページを持つユーザースペースにマッピングされた共有メモリの量。
- CmaTotal: CMA (Contiguous Memory Allocator)ページの量。これらは、連続したレジ○○○のメモリにしか通信できないデバイスで使用されます。
- CmaFreeです。CMA(Contiguous Memory Allocator)ページの空きページ数。
- HugePages_Total: 巨大なページプールのサイズ。
- HugePages_Free: プール内の未割り当て巨大ページ数。
- HugePages_Rsvd:予約巨大ページ数。割り当てのコミットメントはされているが、まだ割り当てられていない。
- HugePages_Surp:定義されたシステム値以上のプール内の巨大ページ数。
- Hugepagesize:巨大なページの大きさ。
- DirectMap4k。4kBページにマッピングされたRAMのバイト数。
- DirectMap4M:4MB ページにマッピングされた RAM のバイト数。
- DirectMap2M:2MBのページにマッピングされたRAMのバイト数。
- DirectMap1G:2GBのページにマッピングされたRAMのバイト数。
Linuxと同じように、概要を知るための方法は1つだけではありませんし、より詳しく知るための方法も少なくとも1つは必ず存在します。
free、top、vmstateを定期的に使用し、特定の問題を深く掘り下げる必要があるときのために/proc/meminfoを保持しておくとよいでしょう。