/ proc/meminfoを実行したときのメモリのスナップショットが次のLinuxマシンである:
MemTotal: 16413388 kB
**MemFree: 48296 kB**
Buffers: 193600 kB
Cached: 1986448 kB
SwapCached: 874512 kB
Active: 15034264 kB
Inactive: 713672 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 16413388 kB
LowFree: 48296 kB
SwapTotal: 8385920 kB
SwapFree: 4682408 kB
Dirty: 3124 kB
Writeback: 0 kB
Mapped: 13005560 kB
Slab: 257784 kB
CommitLimit: 16592612 kB
Committed_AS: 59624324 kB
PageTables: 233748 kB
VmallocTotal: 536870911 kB
VmallocUsed: 267064 kB
VmallocChunk: 536603555 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
これは16 GBのマシンで、Javaにデプロイするアプリケーションが3つあります。これには3つのjvmインスタンスがあり、それらを組み合わせた一般的なメモリ要件は1 GBに近くなります。
そのマシンで現在実行されている他のアプリケーションに影響を与えずに、そのアプリケーションをデプロイしても安全かどうか知りたいと思いました。上記のメモリスナップショットを見るとわかりますか?
それを決定するのに役立つ他の統計とそれらの統計を収集する方法は?
(それはおそらくOPに少し遅れますが、これはかなり頻繁に尋ねられるので、私はそれに打撃を与えます)
free
は通常、次のように表示されます。
total used free shared buffers cached
Mem: 8195284 8137708 57576 0 1232328 2651156
-/+ buffers/cache: 4254224 3941060
Swap: 18892216 759852 18132364
人々は、自分が持っている空きメモリの量を調べようとするとき、Mem:
行をよく見る傾向があります。残念ながら、Linuxカーネルは利用可能なメモリを(少なくとも)以下の方法で最適に利用しようとするため、この行はかなり誤解を招くものです。
I/Oサブシステム(ディスクなど)からのデータをキャッシュするため、必要に応じてすぐに利用できます。
アクティブなプロセスのデータをキャッシュすることを優先して、スワップスペースに対してしばらく非アクティブであったプロセスをアクティブに追い出します。これは、応答性よりもスループットを優先する傾向があるため、一部の人々はカーネルを調整してこの動作を変更します。
最初の点は、free
に関する混乱の原因です。これは、Mem:
行に、キャッシュに使用されたメモリが使用メモリ量で含まれているためです。ただし、カーネルはパフォーマンス上の理由から可能な限りキャッシュします。実際、しばらく稼働しているLinuxシステムでは、空きメモリはゼロに近い傾向があります。未使用のメモリは無駄なメモリです。
ただし、キャッシュメモリは、別のプロセスで必要な場合、カーネルによって解放できます。ある程度I/Oパフォーマンスに影響しますが、他のプロセスはより多くのメモリを持つことができますスワップスペースを使用せずに。したがって、ほとんどの目的と目的で、そのメモリは解放されますです。
そのため、free
には2行目が含まれており、キャッシュメモリは空きと見なされます。
-/+ buffers/cache: 4254224 3941060
この2行目は、特定の目的のために十分な空きメモリがあるかどうかを知りたい場合に注意する必要がある行です。
上記の例では、Mem:
行によると、約57 MBの空きメモリがあります。しかし、2行目を読むと、実際には約3.9 [〜#〜] gb [〜#〜]があり、アクティブなプロセスを強制的にスワップせずに使用できます。補足として、メインメモリにより多くのプロセスとキャッシュ用のスペースを作るために、スワップアウトされためったに使用されない約760 MBのデータもあります。
ほぼ同時に、/proc/meminfo
の内容:
MemTotal: 8195284 kB
MemFree: 57660 kB
Buffers: 1232352 kB
Cached: 2651156 kB
SwapCached: 119936 kB
.
.
.
MemTotal
:カーネルによって検出された使用可能な物理メモリ。
MemFree
:未使用の物理メモリ-free
のMem:
行に表示される空きメモリ。
Buffers
:rawディスクブロックの比較的一時的なストレージ。
Cached
:ディスクから読み取ったファイルのメモリ内キャッシュ。 SwapCachedメモリは含まれません。
SwapCached
:一度スワップアウトされ、次にスワップインされたが、まだスワップ空間にあるメモリ。必要に応じて、内容を破棄することができます(非常に高速です)。入れ替える必要はありません(遅い)。
したがって、実際に利用可能なメモリの正確な見積もりを得るには
MemFree + Buffers + Cached + SwapCached
良い出発点です-そして、その2行目にfree
が表示されます。
当然、メモリ管理と関連する統計および測定はこれよりも複雑です。 free
で示される数値は、詳細を知りたい場合に考慮すべき変数が他にもたくさんあるため、せいぜい見積もりにすぎません。メモリ使用量の最適化を定期的に実行する人にとって、これはほぼ芸術の一種です。
編集:
この「問題」に関するややユーモラスなリンク:
編集2:
メモリ使用分析に関するコメントをほぼ芸術の形で確認するには:
最新のLinuxシステムでは、free
でもキャッシュされたデータの大部分が失われます。私のシステムの/proc/meminfo
から:
SReclaimable: 2253576 kB
これは、システムで使用される約2GBのメモリです slab アロケータがディレクトリエントリなどをキャッシュするために使用され、再利用可能です(つまり、必要に応じて消去してプロセスで使用できます)。ただし、free
はキャッシュメモリを考慮せず、その計算に含まれないため、使用済みメモリとして表示されます。
slabtop
ユーティリティが利用可能な場合、システム管理者は slab キャッシュの用途を見つけることができます。
システムの実際のメモリ使用量をfree
に表示させる方法(rootユーザーのみ)は次のとおりです。
# swapoff -a
# sync
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers cached
Mem: 8195284 3181468 5013816 0 8656 228832
-/+ buffers/cache: 2943980 5251304
Swap: 0 0 0
# swapon -a
最初のコマンドはスワップ空間を無効にします。スワップアウトされたデータを保持するのに十分なメモリがない場合は発行しないでください。その場合、メモリ使用量の計算で空きのSwap:
行を考慮する必要があります。
2番目のコマンドは、すべてのバッファーされたデータをディスクにプッシュします。これにより、次のステップでより多くのキャッシュメモリを解放できます。
3番目のコマンドは、セットの中で最も重要です。これにより、カーネルはキャッシュされたデータ(ページキャッシュ、ディレクトリエントリ、iノードなど)を可能な限り破棄します。
次に、free
は最後に、実行中のプロセスが実際に-/+ buffers/cache:
行で使用するものを示します。キャッシュされたすべてのデータを削除した後でも、カーネルはすぐに再びキャッシュを開始します。この場合、数秒以内にすでに約250MBのキャッシュデータに達しています。
最後のコマンドは、スワップスペースを再度有効にします。これは、最初のコマンドも使用された場合にのみ必要です。
これらのコマンドは、必要な特権を得るためにrootユーザーが実行する必要があることに注意してください。