プログラムがメモリを要求したが、十分な空きメモリが残っていないとします。 Linuxが応答する方法はいくつかあります。 1つの応答は、最近アクセスされていない他の使用済みメモリを選択し、この非アクティブなメモリをスワップに移動することです。
しかし、これを超える記事やコメントがたくさんあります。彼らは、大量の空きメモリがある場合でも、Linuxはスワップするために非アクティブなメモリを書き込むことを決定することがあると言います。事前にスワップに書き込むことは、最終的にこのメモリを使用したいときに、ディスクの書き込みを待つ必要がないことを意味します。彼らは、これはパフォーマンスを最適化するための意図的な戦略だと言っています。
彼らは正しいですか?それとも神話ですか?ソースを引用します。
次の定義を使用して、この質問を理解してください。
- 交換
- 無料 memory –freeコマンドによって表示される「空き」メモリ。これは
MemFree
です/proc/meminfo
からの値 。/proc/meminfo
カーネルによって提供される仮想テキストファイルです。 proc(5)またはRHELドキュメントを参照してください。 - 大量の空きメモリがある場合でも –議論の目的で、10%を超える空きメモリがあると想像してください。
参照
いくつかの検索用語は次のとおりです。linux「機会的スワッピング」OR(「システムにやるべきことがないとき」または「やるべきことがないとき」または「システムがアイドル状態のとき」または「アイドル時間中」にスワッピング)
Googleで2番目に高い結果で、StackExchangeユーザーは「RAMに十分な空き容量があるのになぜスワップを使用するのですか?」と質問し、free
の結果をコピーします。 約20%の空きメモリを示すコマンド。この特定の質問への回答として、この回答は非常に投票されていると思います:
Linuxは、RAMがいっぱいになる前にスワッピングを開始します。これは、
パフォーマンスと応答性を向上させるために行われます:
プログラムメモリを格納するよりもディスクキャッシュにRAMを使用する方がよい場合があるため、パフォーマンスが向上します。そのため、しばらく使用されていない
プログラムを交換し、代わりに頻繁に使用される
ファイルをキャッシュに保持することをお勧めします。応答性は、メモリがいっぱいで一部のプログラムが実行されているときではなく、システムがアイドル状態のときにページをスワップアウトして
、タスクを完了するためにより多くのRAMを要求することによって改善されます。もちろん、スワッピングはシステムの速度を低下させますが、
スワッピングの代わりにスワッピングを行うのではなく、RAMを増やすか、RAMの使用量を減らします。
Googleでの最初の結果は、上記の質問の重複としてマークされています:-)。この場合、質問者は7GBのMemFree
を示す詳細をコピーしました 、16GBのうち。質問には、それ自体が受け入れられ、賛成された回答があります:
空きメモリがない場合にのみスワッピングするのは、
swappiness
を設定した場合のみです。 それ以外の場合、アイドル時間中にカーネルはメモリを交換します。これを行う際に、データはメモリから削除されませんが、スワップパーティションにコピーが作成されます。これは、メモリが使い果たされた場合に、その場でディスクに書き込む必要がないことを意味します。この場合、カーネルはすでにスワップされているメモリページを上書きするだけで、データのコピーがあることがわかります。
swappiness
パラメータは基本的に、これを実行する量を制御するだけです。
他の引用は、スワップされたデータがメモリにも保持されていることを明示的に主張していません。ただし、20%の空きメモリがある場合でもスワッピングを行う場合は、そのアプローチを好むようです。そうする理由は、パフォーマンスを向上させるためです。
私の知る限り、Linuxはメインメモリとスワップスペースの両方に同じデータのコピーを保持することをサポートしています。
また、「日和見スワッピング」は「アイドル時間中に」発生するという一般的な主張にも気づきました。この機能は一般的にパフォーマンスに優れていることを私に安心させるのに役立つはずだと理解しています。上記の定義にはこれを含めません。これは、明確な質問をするのに十分な詳細がすでにあると思うからです。これを必要以上に複雑にしたくありません。
元の動機
ギガバイトの空きメモリがある場合、上部に「swout」(スワッピング)が表示されます。なぜですか?
空きメモリが十分にあるときにLinuxがスワップに書き込むというこのような報告がいくつかあります。 「日和見スワッピング」はこれらのレポートを説明するかもしれません。同時に、少なくとも1つの代替原因が提案されました。考えられる原因を調べるための最初のステップとして:Linuxは上記で定義された「日和見スワッピング」を実行しますか?
私が報告した例では、質問に回答しました。原因は日和見的な交換ではありませんでした。
承認された回答:
Linuxは、この質問で定義されている「日和見スワッピング」を行いません。
次の主要な参考資料では、概念についてはまったく触れていません。
- Linux VirtualMemoryManagerについて理解します。メル・ゴーマンによるオンライン本。 Linux2.6.0のリリース直前の2003年に作成されました。
- Documentation / admin-guide / sysctl/vm.rst。これは、Linux仮想メモリ管理の調整可能な設定に関する主要なドキュメントです。
具体的には:
10.6ページアウトデーモン(kswapd)
歴史的に
kswapd
以前は10秒ごとにウェイクアップしていましたが、現在は、ゾーン内の空きページのpages_low数に達したときにのみ、物理ページアロケータによってウェイクアップされます。 […]極端なメモリプレッシャーの下で、プロセスはkswapd
の作業を行います 同期的に。 […]kswapd
pages_highウォーターマークに達するまでページを解放し続けます。
上記に基づいて、空きページ数が「最高水準点」よりも多い場合、スワップは発生しないと予想されます。
次に、これはkswapd
の目的を示しています より多くの無料ページを作成することです。
kswapd
の場合 スワップするメモリページを書き込み、すぐにメモリページを解放します。 kswapdはスワップされたページのコピーをメモリに保持しません 。
Linux 2.6は、「rmap」を使用してページを解放します。 Linux 2.4では、話はもっと複雑でした。ページが複数のプロセスで共有されている場合、kswapdはページをすぐに解放できませんでした。これは古代の歴史です。リンクされている投稿はすべてLinux2.6以降に関するものです。
スワップピネス
このコントロールは、カーネルが
メモリページをどれだけ積極的にスワップするかを定義するために使用されます。値を大きくすると攻撃性が高まり、値を低くするとスワップの量が減少します。
値0は、カーネルに
空きページとファイルバックページの量が増えるまでスワップを開始しないように指示します
ゾーンの最高水準点よりも低いです。
この引用は、特別な場合を説明しています。swappiness
を構成する場合 となる値 。この場合、キャッシュページの数が最高水準に達するまで、スワッピングを追加で期待するべきではありません。つまり、カーネルはスワッピングを開始する前に、ほとんどすべてのファイルキャッシュを破棄しようとします。 (これにより、大幅な速度低下が発生する可能性があります。ファイルキャッシュが必要です!ファイルキャッシュは、実行中のすべてのプログラムのコードを保持するために使用されます🙂
透かしとは何ですか?
上記の引用は疑問を投げかけます:私のシステムの「透かし」メモリ予約はどれくらいですか?回答:「小規模な」システムでは、デフォルトのゾーン透かしはメモリの3%にもなる可能性があります。これは、「最小」ウォーターマークの計算によるものです。大規模なシステムでは、透かしの割合は小さくなり、メモリの0.3%に近づきます。
したがって、10%を超える空きメモリを備えたシステムに関する質問の場合、この透かしロジックの正確な詳細は重要ではありません。
個々の「ゾーン」の透かしは、/proc/zoneinfo
に表示されます。 、proc(5)に記載されているとおり。私のzoneinfoからの抜粋:
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の全量を保護するために実行されます。デフォルトのlowmem_reserveは、RAMの最初の4GiB(DMA32ゾーン)の約1/256であるため、通常は約16MiBです。
Linuxコードのコミット
mm:メモリに比例してkswapd透かしをスケーリングします
[…]
ウォーターマークスケールファクター:
この要因は、kswapdの攻撃性を制御します。これは、
kswapdがウェイクアップされる前にノード/システムに残っているメモリの量と、
kswapdがスリープ状態に戻る前に解放する必要があるメモリの量を定義します。単位は10,000の端数です。デフォルト値の10は、透かし間の距離が
ノード/システムで使用可能なメモリの0.1%であることを意味します。最大値は1000、つまりメモリの10%です。直接再利用(allocstall)またはkswapdに入るスレッドの割合が高い(allocstall)
時期尚早にスリープする(kswapd_low_wmark_hit_quickly)ことは、
待ち時間の理由でkswapdが維持する空きページの数が
少なすぎることを示している可能性があります。システムで発生する割り当てバースト。このノブ
を使用して、それに応じてkswapdの攻撃性を調整できます。
proc:meminfo:利用可能なメモリをより保守的に見積もる
MemAvailable
/proc/meminfo
のアイテム これは、スワッピングを発生させずに
どのくらいのメモリを割り当てることができるかについてのヒントをユーザーに提供することです。そのため、ユーザースペースで使用できないゾーンの低透かしを
除外します。ただし、ユーザースペースの割り当てについては、
>kswapd
空きページが最高水準点と
ページアロケータのlowmem保護の組み合わせに達するまで、実際に
再利用されます。これにより、一定量のDMA
とDMA32メモリもユーザースペースから保護されます。MemAvailableを計算するときに、
空きページ数から、ユーザースペースで利用できないことがわかっている全額を差し引きます。
Linuxコード
swappiness
を変更すると主張されることがあります へ 「日和見スワッピング」を効果的に無効にします。これは、興味深い調査手段を提供します。 「日和見スワッピング」と呼ばれるものがあり、swappinessで調整できる場合は、
vm_swappiness
を読み取るすべてのコールチェーンを見つけることで追跡できます。 。 CONFIG_MEMCG
を想定することで、検索スペースを減らすことができることに注意してください。 が設定されていません(つまり、「memorycgroups」が無効になっています)。コールチェーンは次のようになります:
- vm_swappiness
- mem_cgroup_swappiness
- get_scan_count
- shrink_node_memcg
- shrink_node
shrink_node_memcg
「これは基本的なノードごとのページフリーです。 kswapdと直接再生の両方で使用されます。」つまりこの関数は、無料の数を増やします ページ。スワップするためにページを複製しようとはしていないので、後で解放することができます。しかし、それを割り引いても:
上記のチェーンは、以下に示す3つの異なる関数から呼び出されます。予想どおり、コールサイトを直接再生v.sに分割できます。 kswapd。直接回収で「日和見スワッピング」を実行することは意味がありません。
-
/* * This is the direct reclaim path, for page-allocating processes. We only * try to reclaim pages from zones which will satisfy the caller's allocation * request. * * If a zone is deemed to be full of pinned pages then just give it a light * scan then give up on it. */ static void shrink_zones
-
* kswapd shrinks a node of pages that are at or below the highest usable * zone that is currently unbalanced. * * Returns true if kswapd scanned at least the requested number of pages to * reclaim or if the lack of progress was due to pages under writeback. * This is used to determine if the scanning priority needs to be raised. */ static bool kswapd_shrink_node
-
* For kswapd, balance_pgdat() will reclaim pages across a node from zones * that are eligible for use by the caller until at least one zone is * balanced. * * Returns the order kswapd finished reclaiming at. * * kswapd scans the zones in the highmem->normal->dma direction. It skips * zones which have free_pages > high_wmark_pages(zone), but once a zone is * found to have free_pages <= high_wmark_pages(zone), any page in that zone * or lower is eligible for reclaim until at least one usable zone is * balanced. */ static int balance_pgdat
したがって、おそらく、すべてのメモリ割り当てが空きメモリからすぐに満たされている場合でも、kswapdが何らかの形でウェイクアップされているという主張です。 wake_up_interruptible(&pgdat->kswapd_wait)
の使用法を調べました 、そして私はこのような目覚めを見ていません。