web-dev-qa-db-ja.com

pagecache、dentries、inodeとは何ですか?

https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system からこれら3つの新しいテクニックを学びました=:


ページキャッシュを解放するには:

# echo 1 > /proc/sys/vm/drop_caches

エントリとiノードを解放するには:

# echo 2 > /proc/sys/vm/drop_caches

ページキャッシュ、エントリ、およびiノードを解放するには:

# echo 3 > /proc/sys/vm/drop_caches

私は正確にページキャッシュ、デントリ、およびiノードとは何かを理解しようとしています。正確には何ですか?

それらを解放すると、有用なmemcachedおよび/またはredisキャッシュも削除されます?

-

なぜ私はこの質問をしているのですか?私のAmazon EC2サーバーRAMは、数日間で6%から95%に7日間でいっぱいになりました。これらを削除するには、隔週のcronjobを実行する必要がありますその後、メモリ使用量は再び6%に減少します。

19
Rakib

単純化しすぎて、複数の答えがあるため、質問のコンテキストと思われるものを説明してみましょう。

ディレクトリ構造のメモリキャッシングを使用しているようです。コンテキストのinodeは、ファイルを表すデータ構造です。 dentriesは、ディレクトリを表すデータ構造です。これらの構造を使用して、ディスク上のファイル構造を表すメモリキャッシュを構築できます。直接リストを取得するために、OSは、ディレクトリがある場合はそのエントリにアクセスして、その内容(一連のiノード)をリストできます。そこにない場合は、ディスクに移動してメモリに読み込み、再度使用できるようにします。

ページキャッシュには、ディスク上のブロックへのメモリマッピングを含めることができます。これはおそらく、バッファI/O、メモリマップファイル、実行可能ファイルのページ領域など、OSがファイルからメモリに保持できるものであれば何でも構いません。

コマンドはこれらのバッファーをフラッシュします。

18
user3344003

私は正確にページキャッシュ、デントリ、およびiノードとは何かを理解しようとしています。正確には何ですか?

user3344003はその特定の質問に対して正確な回答をすでに提供していますが、これらのメモリ構造が動的に割り当てられることに注意することは依然として重要です。

「空きメモリ」の使用が適切でない場合、メモリはそれらのキャッシュに使用されますが、他の「より重要な」アプリケーションがメモリを割り当てようとすると、自動的にパージされて解放されます。

いいえ、これらのキャッシュは、アプリケーション(redisやmemcachedを含む)によって維持されるキャッシュには影響しません。

私のAmazon EC2サーバーRAMは、数日間で6%から95%に7日間でいっぱいになりました。これらを削除するには、隔週のcronjobを実行する必要がありますその後、メモリ使用量は再び6%に減少します。

おそらく、状況を誤って解釈している可能性があります。システムがリソースを効率的に使用している可能性があります。

少し簡単にするために、「空き」メモリは「未使用」またはさらに劇的なものと見なすこともできます-リソースの浪費:お金を払ったが、それを利用していない。これは非常に経済的ではない状況であり、Linuxカーネルは「空き」メモリを「より便利」に使用しようとします。

その戦略の一部には、動的にサイズ変更されたさまざまなメモリキャッシュを使用して、さまざまな種類のディスクI/Oを保存するための使用が含まれます。キャッシュメモリへの迅速なアクセスは、「遅い」ディスクアクセスを節約するため、多くの場合、これは便利なアイデアです。

「より重要な」プロセスがメモリを割り当てたいと思うとすぐに、Linuxカーネルは自発的にそれらのキャッシュを解放し、要求しているプロセスがメモリを利用できるようにします。そのため、通常はこれらのキャッシュを「手動で解放」する必要はありません。

Linuxカーネルは、他のアイドル状態のプロセスのメモリをディスク(スワップスペース)にスワップアウトして、「より重要な」タスクに使用するためにRAMを解放し、おそらくキャッシュ。

したがって、システムが積極的にスワップイン/スワップアウトしない限り、手動でキャッシュをフラッシュする理由はほとんどありません。

これらのキャッシュを「手動でフラッシュ」する一般的なケースは、純粋にベンチマーク比較のためです。最初のベンチマーク実行は「空の」キャッシュで実行され、結果が悪くなる可能性があります。ウォームキャッシュ)。ベンチマークを実行する前にキャッシュをフラッシュすることで、「ウォーム」キャッシュを削除し、ベンチマークの実行を互いに「公平」に比較できます。

6

一般的な誤解は、「空きメモリ」が重要であるというものです。メモリは使用するためのものです。

それを明らかにしましょう:

  • 重要なデータが保存されている使用済みメモリがあり、それが100%に達すると、あなたは死んでいます
  • 次に、キャッシュ/バッファがあり、それを行うスペースがある限り使用されます。ほとんどの場合、ディスクファイルに高速にアクセスするための通性メモリです。空きメモリが不足した場合、これはそれ自体を解放し、ディスクに直接アクセスできるようにします。

キャッシュメモリを推奨どおりにクリアすることはほとんどの場合役に立たず、最適化を非アクティブ化することを意味するため、速度が低下します。

本当にメモリが足りなくなった場合、つまり「使用済みメモリ」が多く、スワップの使用状況が見え始めた場合は、何かを行う必要があります。

[〜#〜]ただし[〜#〜]:AWSインスタンスで実行されている既知のバグがあり、dentryキャッシュが明確な理由なしにメモリを消費しています。 このブログ で明確に説明され、解決されています。

このバグに関する私自身の経験では、「歯科」キャッシュは「使用済み」と「キャッシュ済み」の両方のメモリを消費し、時間内に解放されないようで、最終的にはスワップが発生します。バグ自体はとにかくリソースを消費する可能性があるため、調査する必要があります。

2
Tristan

古いスレッドを復活させるのは嫌いですが、最近、Linux仮想マシンでメモリの問題に対処しています。残念ながら、コンピューティングマシンの仮想化が素晴らしく、Linuxメモリとリソース割り当ての進歩が優れている場合でも、ハイパーバイザが「パフォーマンス機能」と呼ばれる機能を実行すると競合が発生します。

VMWareは積極的にRAMをディスクに送信します。ディスクがSAN上にある場合、RAMは、本当にパフォーマンスの高いRAIDと安定したネットワークアクセスがある場合、最高で1Gbpsから10Gbpsになりました(現在、RAM 100のVMがすべて同じSANを使用しているという事実を無視して)) 。DDR3 RAMは、最新のシステムでは25Gbps +で動作するため、予想される速度の1/25から1/2未満で実行されているシステムで問題が発生する可能性があります。

私のLinuxシステムのキャッシュは、ファイルシステムのディスクI/Oと文字通り同じ速度です。つまり、パフォーマンスは向上せず、キャッシュをクリアする代わりに、OSのRAMをSwapにアクティブに送信しています。これはLinuxのせいではなく、VMWareのおかげで大きな問題になっていますが、残念ながら、クラウドインフラストラクチャはこのような愚かなことを常にしていることに注意してください。詳しくはこちらをご覧ください https://www.vmware.com /content/dam/digitalmarketing/vmware/en/pdf/techpaper/perf-vsphere-memory_management.pdf または、VMWareを使用している場合は、「割り当てられたメモリ」と「アクティブなメモリ」、およびVMの場所がわかりますこのメモリの区別と処理により、VMWareとは常に異なる量が表示されます。

0
Tmanok