プログラムがいくつかのメモリを要求しましたが、利用可能なメモリが不足しているとしましょう。 Linuxはさまざまな方法で応答します。 1つの応答は、最近アクセスされていない他の使用済みメモリを選択し、その非アクティブメモリをスワップ領域に移動することです。
しかし、それを越えて書いてコメントをたくさん見ます。利用可能なメモリが多い場合でも、Linuxは時々、非アクティブメモリをスワップ領域に書き込むことを決めると言います。事前書き込みスワップは、最終的にこのメモリを使用しようとしたときにディスクへの書き込みを待つ必要がないことを意味します。性能を最適化するための思いやりのある戦略だそうです。
それは正しいですか?それともこれは神話ですか?ソースを引用してください。
問題を理解するには、次の定義を使用してください。
- 交換
- 無料メモリ - 「利用可能な」メモリが表示されます。無料注文する。
MemFree
から取得した値です/proc/meminfo
。/proc/meminfo
カーネルが提供する仮想テキストファイルです。バラより工程(5)またはRHELドキュメント。 - 利用可能なメモリが多い場合でも- デモ目的で使用可能なメモリが10%以上であると仮定します。
引用する
以下はいくつかのクエリです。linux「機会的スワップ」OR
free
Googleで2番目に高い結果で、StackExchangeユーザーは「RAMに十分な空き容量があるのにスワップを使用するのはなぜですか」と尋ね、約20%の空きメモリを示すコマンドの結果をコピーしました。この特定の質問に対する回答では、次の回答が高い評価を受けています。
LinuxはRAMがいっぱいになる前にスワップを開始します。これはパフォーマンスと応答性を向上させるために行われます。
時には、RAMがプログラムメモリの保存よりもディスクキャッシュに適しているため、パフォーマンスが向上します。そのため、しばらく使用していないプログラムを交換し、頻繁に使用するファイルをキャッシュに保存することをお勧めします。
メモリがいっぱいで、一部のプログラムが実行されているときよりもシステムがアイドル状態のときにページを交換し、ジョブを完了するためにより多くのRAMを要求すると、応答性が向上する可能性があります。
もちろん、スワッピングによりシステムの速度が遅くなるが、スワッピングの代替手段は、スワッピングではなく、より多くのRAMを使用するか、より少ないRAMを使用することである。
Googleの最初の結果は上記の質問と重複してマークされています。 :-).この例では、Inquirer コピーの詳細が 7 GB MemFree
(合計 16 GB) で表示されます。この質問には承認され承認された回答があります。
0に設定すると、使用可能なメモリがない場合にのみスワップが発生します。
swappiness
それ以外の場合、アイドル期間中にカーネルはメモリをスワップします。このプロセスでは、データはメモリから削除されませんが、スワップパーティションにコピーが作成されます。つまり、メモリ不足の状況が発生した場合、すぐにディスクに書き込む必要はありません。この場合、カーネルにはデータのコピーがあることがわかっているため、交換したメモリページを上書きできます。
この
swappiness
パラメーターは、デフォルトでこれを行う程度を制御します。
他の参照によって置き換えられ、明示的に宣言されていないデータもメモリに残ります。ただし、空きメモリが20%の場合でもスワップを行う場合は、このアプローチを好むように見え、その理由はパフォーマンスを向上させるためです。
私が知る限り、Linuxはメインメモリとスワップ空間に同じデータのコピーを保持することをサポートしています。
「自由時間」に「機会主義的交流」が起こるということわざも目立つ。私はこの機能が一般的にパフォーマンスに良いことを確認するのに役立ちます。明確な質問をするのに十分な詳細があると思うので、上記の定義に含めませんでした。私は必要以上に仕事をより複雑にしたくありません。
初期同期
使用可能なメモリがギガバイトの場合、上部に「swout」と表示されます。なぜ?
利用可能なメモリが十分な場合、Linuxでスワップを作成するという報告があります。 「機会主義的な交換」はこれらの報告を説明するかもしれません。その間、少なくとも1つの代替理由が提案された。考えられる原因を見つける最初のステップ:Linuxが上記で定義した「機会的スワッピング」を行ったことがありますか?
私が報告した例では、質問に対する回答が提供されました。その理由は機会主義的な交換ではないからだ。
答え1
Linuxは、この質問で定義されている「機会的スワッピング」を実行しません。
次の主な参考資料では、この概念についてはまったく言及していません。
- Linux仮想メモリマネージャについて。 Mel Gormanのオンラインブック。 Linux 2.6.0がリリースされる前の2003年に作成されました。
- ドキュメント/AdminGuide/sysctl/vm.rst。これは、Linux仮想メモリ管理調整可能設定の基本的なドキュメントです。
だけでなく:
過去には
kswapd
10秒ごとに目が覚めましたが、現在、その領域の利用可能なページ数がpage_lowに達すると、物理ページアロケータによってのみ目が覚めます。 [...]メモリ不足が極端な場合、プロセスはタスクを同期的に完了しますkswapd
。 [...]kswapd
Pages_high透かしに達するまでページを公開し続けます。
上記に基づき、利用可能なページ数が「高透かし」を超えるとスワップが発生しないことが予想される。
第二に、これはkswapd
より多くの無料ページを作成することが目的であることを示しています。
kswapd
メモリページがスワップ領域に書き込まれると、すぐにメモリページが解放されます。kswapd はスワップページのコピーをメモリに保持しません。。
Linux 2.6は「マッピング「ページを解放します。Linux 2.4では状況がより複雑です。ページが複数のプロセスによって共有されている場合、kswapdはそれをすぐに解放することはできません。これは古代の歴史です。リンクされたすべての投稿はLinux 2.6以降に関するものです。
このコントロールは、カーネルがメモリページをどれだけ積極的に交換するかを定義します。値が高いほど攻撃性が増加し、値が低いほど交換量が減少します。 0の値は、アイドル量に達するまでカーネルがスワッピングを開始しないように指示します。およびファイルサポートページ地域の最高水位点より低い
この引用は特別なケースを説明します。swappiness
値が で構成されている場合、0
この場合は交換を行わないでください。隠れ家ページがトップ透かしに落ちました。つまり、カーネルは、スワップを開始する前にほぼすべてのファイルキャッシュを破棄しようとします。 (これにより、速度が大幅に遅くなる可能性があります。わずかなファイルキャッシュが必要です!ファイルキャッシュは、実行中のすべてのプログラムのコードを保存するために使用されます。 :-)
透かしとは何ですか?
上記の引用は、次の質問を提示します。私のシステムの「透かし」メモリ予約はどのくらいですか?A:「小型」システムでは、基本領域の透かしがメモリの3%まで高くなる可能性があります。これは「最小」透かし計算によるものです。大規模システムでは、透かしはメモリの0.3%に近いより小さい割合を占めます。
したがって、問題が10%以上の空きメモリを持つシステムに関連している場合、この透かしロジックの特定の詳細は重要ではありません。
個々の「地域」の透かしは、/proc/zoneinfo
次のように表示されます。工程(5)。私のゾーン情報から抜粋:
Node 0, zone DMA32
pages free 304988
min 7250
low 9062
high 10874
spanned 1044480
present 888973
managed 872457
protection: (0, 0, 4424, 4424, 4424)
...
Node 0, zone Normal
pages free 11977
min 9611
low 12013
high 14415
spanned 1173504
present 1173504
managed 1134236
protection: (0, 0, 0, 0, 0)
現在「透かし」はmin
、low
およびですhigh
。プログラムがfree
ダウンするのに十分なメモリを必要とする場合、min
プログラムは「直接リサイクル」に入ります。プログラムはカーネルがメモリを解放するのを待ちます。
可能であれば直接リサイクルを避けたい。したがって、透かしfree
の下にあるとlow
コアが目覚めますkswapd
。上記の状況が再び発生するkswapd
まで、キャッシュを交換または削除してメモリを解放してください。free
high
追加の資格:カーネルはkswapd
lowmemとDMAを使用するために全体のlowmem_reserveボリュームを保護するために実行されます。基本低メモリ予約これはRAMの最初の4GiB(DMA32領域)の約1/256であるため、通常は約16MiBです。
Linuxコードの送信
[...]
透かしの倍率:
この要素はkswapdの攻撃性を制御します。これは、kswapdが起動する前にノード/システムに残っているメモリ量と、kswapdがスリープ状態になる前に解放する必要があるメモリ量を定義します。
単位は10,000の分数です。デフォルト値10は、透かし間の距離がノード/システムで使用可能なメモリの0.1%であることを意味します。最大値は1000で、これはメモリの10%です。
直接収集(allocstall)に入るか、またはkswapdが早期にスリープ状態になる(kswapd_low_wmark_hit_quickly)スレッドの割合が高いことは、待機時間の理由でkswapdによって維持される利用可能なページ数がシステムで発生する割り当てバーストと比較して少なすぎる意味できます。その後、このノブを使用してkswapdの攻撃性を適切に調整できます。
proc:meminfo:利用可能なメモリのより保守的な見積もり
MemAvailable
の項目は、/proc/meminfo
スワッピングを引き起こすことなく、どのくらいのメモリを割り当てることができるかをユーザーに尋ねるメッセージを表示するためのものであるため、ユーザー空間で使用できないサブウォーターマーク領域を除外します。ただし、ユーザースペース割り当ての場合、ユーザー
kswapd
スペースで特定量のDMAおよびDMA32メモリを予約するページアロケータの低メモリ保護の組み合わせにより、利用可能なページが最高透かしに達するまで実際にリサイクルが行われます。MemAvailableを計算するときに、使用可能なページ数からユーザースペースで利用できないページの総数を減算します。
Linuxコード
これを変更すると、「機会交換」が効果的に無効になるという主張がswappiness
時々あります。0
これは興味深い調査方法を提供します。いわゆる「機会交換」があり、交換の有無に応じて調整できる場合は、すべての読み取りの呼び出しチェーンを見つけて追跡できますvm_swappiness
。設定されていないと仮定して、検索スペースを減らすことができますCONFIG_MEMCG
(つまり、「メモリcgroup」は無効になります)。呼び出しチェーンは次のとおりです。
shrink_node_memcg
「これは、より自由なプライマリノード固有のページです。kswapdと直接リサイクルで使用されます」と説明されています。つまり、この関数は無料ページ。後で解放できるようにページを交換するためにコピーしようとしません。しかし、私たちがこれを考慮しなくても:
上記のチェーンは、次のように3つの異なる関数から呼び出されます。予想どおり、呼び出しサイトを直接リサイクルとkswapdに分けることができます。直接リサイクルでは、「機会主義的な交換」を行うことは意味がありません。
-
/* *ページ割り当てプロセスのための直接回収パス。私たちしかいない *呼び出し元の割り当てを満たす領域からページを回収しようとします。 *必要です。 * *特定の領域が固定ページでいっぱいであると見なされる場合は、その領域にインジケータを提供してください。 *スキャン後にあきらめてください。 */ 静的無効収縮面積
-
*kswapd は、使用可能な最高値以下のページ・ノードを縮小します。 *現在、アンバランス地域です。 * * kswapdが要求したページ数以上をスキャンした場合はtrueを返します。 * リサイクルやページの書き換えにより進行不足の場合。 *検索優先順位を上げる必要があるかどうかを判断するために使用されます。 */ 静的ブールkswapd_shrink_node
-
* kswapdの場合、Balance_pgdat()はその地域のノード全体でページをリサイクルします。 *発信者は、少なくとも1つの場所が利用可能になるまでこの地域を使用できます。 *バランス。 * *kswapd がリサイクルを完了する順序を返します。 * * kswapdはhighmem->normal->dmaの方向に領域をスキャンします。スキップします。 * free_pages > high_wmark_pages(zone)の領域、しかし一度領域 * free_pages <= high_wmark_pages(zone) 見つかった、この領域のすべてのページ *以下の場合、無料ゾーンが1つ以上埋め込まれるまで埋立対象となります。 *バランス。 */ 静的整数Balance_pgdat
したがって、一般的な理論は、すべてのメモリ割り当てが利用可能なメモリですぐに満たされても、kswapdが何らかの方法で目を覚ますということです。私は使い方を見て、wake_up_interruptible(&pgdat->kswapd_wait)
そのような覚醒を見ませんでした。
答え2
いいえ、Linuxには機会主義的な交換のようなものはありません。私はこの問題を研究するのに時間を費やし、すべてのソース(教科書、カーネル開発者メーリングリストの電子メール、Linuxソースコードとコミットコメント、Mel Gormanとの一部のTwitter交換)で同じことを伝えます。 Linux 専用メモリのリサイクル ある種の記憶ストレスに対する反応です(明らかな休止状態を除く)。
このトピックに関するすべての一般的な誤解は、おそらく1つの簡単な事実に由来します。 Linux は、スワッピングを開始する前に空きメモリの最後のバイトまで待つことはできません。極端な形式のメモリの枯渇から保護するには、ある種のバッファリングが必要であり、そのバッファのサイズに影響を与える可能性があるいくつかの調整可能なパラメータがありますvm.min_free_kbytes
。しかし、それは「これ以上やることがないので交換する」とは異なります。
残念ながら、ページフレーム回収アルゴリズムは2.6以降より複雑になりましたが(Mel Gormanの本で詳しく説明されています)、基本的なアイデアはほぼ同じです。ページリカバリは失敗した割り当てによってトリガされ、次に目が覚めるか、kswapd
メモリ不足、割り当てフラグ、およびその他の要因に基づいてページを同期的に解放します。
十分な空きメモリが残っている間にページ割り当てが失敗し始める最も明白な理由は、連続したメモリが必要になることです。実際には、要求を満たすためにメモリが断片化されすぎている可能性があります。歴史的に、Linuxカーネル開発者は、継続的な割り当ての必要性を避けるために多くの努力を払ってきました。それにもかかわらず、一部のデバイスドライバはまだこれを行う必要があります。これは、マルチページメモリのI / O(分散収集DMA)を実行できない、またはドライバ開発者側のコーディングが混乱する可能性があるためです。 THP(透明な巨大ページ)の出現は、物理的に隣接するブロックにメモリを割り当てる必要があるもう1つの理由を提供します。
同じ時期に導入された領域圧縮は、メモリ断片化の問題を解決するのに役立つと予想されていますが、常に望ましい効果を得ることはできませんでした。
特定の状況で正確に何が起こっているのかを理解するのに役立つさまざまな追跡ポイントがありますvmscan
。特定の呼び出しスタックがある場合は、リモートで関連しているように見えるものをスキャンするよりも、Linuxカーネルコードで必要なものを常に簡単に見つけることができます。 。