web-dev-qa-db-ja.com

vm / min_free_kbytes-最小予約メモリを保持する理由

これによると 記事

/ proc/sys/vm/min_free_kbytes:これは、「アトミック」割り当て(再利用を待つことができないもの)を含む特別な予約で使用するために解放されるメモリの量を制御します

私の質問は、「回収を待つことができないもの」とはどういう意味ですか?言い換えれば、システムに特定の最小量のメモリを常に解放するように指示する必要がある理由と、どのような状況でこのメモリが使用されるのかを理解したいと思います。 [何かで使用する必要があります。そうでなければ、必要性が見えない]

2番目の質問:このメモリを(システム上で)4MBを超える値に設定すると、パフォーマンスが向上しますか?特定のプロセスが進行し、この数値をより高い値に設定するとシェルのパフォーマンスが向上する場合、シェルのパフォーマンスが非常に低いサーバーがあります(たとえば、ls -lの実行に10〜15秒かかります)。

19
user3063877

(リンクは死んでいる、今は here のように見える)

そのテキストはアトミック割り当てを参照しています。これは、制御を放棄せずに満たす必要がある(つまり、現在のスレッドを中断することができない)メモリに対する要求です。これは、割り込みルーチンで最も頻繁に発生しますが、本質的なロックを保持している間にメモリが必要なすべての場合に適用されます。スワッパーがメモリを解放するのを待つ余裕がないため、これらの割り当ては即座に行う必要があります。

より詳細な説明については Linux-MM を参照してください。ただし、メモリ割り当てプロセスの概要は次のとおりです。

  • _alloc_pagesは最初に各メモリゾーンを反復処理して、適格な空きページを含む最初のメモリゾーンを探します
  • _alloc_pagesは、kswapdタスク[..to ..]を起動して、各ゾーンに維持されている予約メモリプールをタップします。
  • それでもメモリ割り当てが成功しない場合、_allocページは[..]を放棄します(。=] GFP_ATOMICを使用した割り当て。

min_free_kbytesは、説明されている「ls -lの実行に10〜15秒かかります」ではほとんど役に立ちません。これは、ゾーンの枯渇ではなく、一般的なメモリ不足とスワッピングが原因である可能性があります。 min_free_kbytes設定は、即時リクエストを処理するのに十分な空きページのみを許可する必要があります。通常の操作が再開されるとすぐに、スワッパープロセスを実行してメモリゾーンのバランスを再調整できます。 min_free_kbytesを増やす必要があったのは、dma散乱をサポートしていないネットワークカードでジャンボフレームを有効にした後だけです。

2番目の質問を少し拡張すると、リンクされた記事で言及されているvm.swappinessとダーティ比を調整するより良い結果が得られます。ただし、「ls -l」のパフォーマンスを最適化すると、他のプロセスが遅くなる可能性があることに注意してください。プライマリ以外のユースケース向けに最適化しないでください。

12
Arno

すべてのLinuxシステムは、システムで使用可能なすべての物理メモリを使用しようとします。多くの場合、ファイルシステムバッファーキャッシュを作成します。技術的には、このメモリはnot使用されていますが、キャッシュに割り当てられています。

ご質問の「回収待ち」とは、プロセスに割り当てられるように「使用されていない」キャッシュメモリを回収するプロセスを指します。これは透過的であると想定されていますが、実際には、このメモリが利用可能になるのを待たない多くのプロセスがあります。 Javaは、特に大きな最小ヒープサイズが設定されている場合の良い例です。プロセスはメモリを割り当てようとし、1つの大きな連続した(アトミック?)チャンクで即座に利用できない場合、プロセスは死にます。

min_free_kbytesで一定量のメモリを予約すると、このメモリをすぐに使用できるようになり、高いメモリ負荷と完全なバッファキャッシュがあるときに新しいプロセスを開始、実行、終了する必要がある場合のメモリ負荷を軽減します。

バッファキャッシュがいっぱいの場合、4MB以上の即時割り当てを必要とするプロセスは失敗する可能性があるため、4MBはかなり低いように見えます。設定はvery調整可能でシステム固有ですが、使用可能なメモリが数GBある場合、予約メモリを128 MBに増やしても問題はありません。シェルの対話性にどのような影響があるかはわかりませんが、おそらくプラスになります。

7
Shaun Dewberry

このメモリは、通常のプロセスによる使用から解放されます。 @Arnoが述べたように、実行できる特別なプロセスには割り込みルーチンが含まれており、今すぐ(割り込みであるため)実行し、他のプロセスを実行する前に終了する必要があります(アトミック)。これには、メモリがいっぱいになったときにメモリをディスクにスワップアウトすることなどが含まれます。

メモリがいっぱいになると、割り込み(メモリ管理)プロセスが実行され、メモリがディスクにスワップされるため、通常のプロセスで使用できるようにメモリが解放されます。しかし、vm.min_free_kbytesが小さすぎて実行できない場合、システムがロックされます。これは、他のユーザーが実行できるように、この割り込みプロセスを最初に実行してメモリを解放する必要があるが、十分な予約メモリがないためにスタックしているためですvm.min_free_kbytesデッドロックを引き起こすタスクを実行します。

参照:

6
pd12