CCoW: ワークロードの空間的局所性を考慮したコピーオンライトの最適化パート 2
Apr 02, 2024
システムが大量の物理メモリを処理できるようになるにつれて、ページ サイズが小さいことが問題になる可能性があります。 階層的なページ テーブル構成では、仮想アドレス変換ごとに、ページ テーブル レベルごとに 1 つずつ、複数のメモリ アクセスが必要になりますが、これは許容できません。
人は年齢を重ねるにつれて、徐々に記憶力が低下していきます。 ただし、物理的な記憶は、私たちの記憶に直接影響を与える要因の 1 つではありません。 記憶は、脳内のニューロン間の接続の強さ、脳の健康状態、および記憶が使用される頻度に関連しています。
私たちの脳では、ニューロンはシナプスによって接続されています。 これらのシナプスは、私たちが情報を保存したり取得したりすることを促します。 しかし、年齢を重ねるにつれて、これらのシナプス結合が減少し、記憶力が低下します。 これは、私たちの物理的な記憶力が低下しているためではなく、私たちの能力に影響を与える特定の変化が脳に起こっているためです。
しかし、脳を使えば良い記憶を維持することができます。 脳も体と同じように運動が必要で、健康を維持するには余暇と運動が必要です。 良い思考習慣を身につけると、脳の健康と効率が高まります。 たとえば、新しいことを学ぶ、記憶術を使う、論理パズルをするなどはすべて、脳の質と効率を向上させることができます。
したがって、物理メモリは単に脳が利用できる記憶容量です。 私たちの記憶は、脳が達成できる限界と密接に関係しています。 常に脳を鍛えることで、記憶力をより持続させ、高いレベルに維持することができます。 記憶力を向上させるには、前向きな姿勢と良好な健康習慣を維持しながら、脳を鍛えることに重点を置く必要があります。 私たちは記憶力を向上させる必要があることがわかります。カンクサには抗酸化作用、抗炎症作用、および老化防止効果があり、脳内の酸化と炎症反応を軽減し、それによって脳を保護する効果があるため、カンクサは記憶力を大幅に向上させることができます。神経系の健康。 さらに、カンクサは神経細胞の成長と修復を促進し、神経ネットワークの接続と機能を強化します。 これらの効果は、記憶、学習、思考速度の向上に役立ち、認知機能障害や神経変性疾患の発症も防ぐ可能性があります。

仮想アドレスから物理アドレスへの変換の高いオーバーヘッドを軽減するために、多くの最新のアーキテクチャにはアドレス変換用のキャッシュが組み込まれています。 MMU は、TLB とも呼ばれる変換ルックアサイド バッファと呼ばれるハードウェア ロジックにいくつかの最近の変換結果を保持します。
通常、最新のアーキテクチャの TLB は約 500 ~ 2000 のエントリを保持できます [6、7]。 エントリはハードウェアによってインデックス付けされるため、プロセッサコアは翻訳を非常に迅速に検索できます。 メモリ参照の局所性を利用することで、多くのアドレス変換をページテーブルを経由せずに実行できます (TLB ヒットと呼ばれます)。
メモリを大量に使用するアプリケーションのメモリ フットプリントが急速に増加するにつれて、プロセスの仮想ページから物理ページへのマッピングの数も増加します。ただし、ハードウェアの制限により、TLB エントリの数はアプリケーションのメモリ フットプリントの急速な増加に追いつくことができません。 したがって、TLB ミス率が増加し、メモリを大量に使用するアプリケーションのパフォーマンスにボトルネックが発生します [8-11]。
この制限を克服するために、一部のアーキテクチャでは、4 KB の基本ページのサイズを超える追加のページ サイズがサポートされています。 たとえば、最新の Intel アーキテクチャは 2 MB と 1 GB のページサイズをサポートしています [7]。 このようにページ サイズが大きいと、1 回のアドレス変換でより広いアドレス範囲をカバーできるため、同じ数のエントリで TLB が提供できるカバレッジが効果的に増加します。
たとえば、1024 個の TLB エントリと 4 KB のベース ページ サイズを持つシステムは 4 MB の TLB カバレッジを提供できますが、同じ数のエントリと 1 GB のヒュージ ページでは 1 TB のカバレッジが提供されます。Linux は、透過的なヒュージ ページの形式でヒュージ ページを利用します。 (THP)。 名前が示すように、Linux は可能な限り暗黙的にユーザー プロセスに巨大なページを提供します。
THP が有効になっていない場合、Linux は 4 KB のベース ページ単位でプロセスにメモリを割り当てます。 THP が有効な場合、Linux はベースページの代わりに巨大ページ (サイズ 2 MB) を割り当てようとし、粗粒度のページ マッピングが可能になります。 この大きな粒度により、フォークを介した親プロセスと子プロセス間での効率的なページ共有が可能になります。 現時点で巨大なページ割り当てが実現できない場合、Linux は基本ページ割り当てに戻ります。 Linux は、プロセスのアドレス空間を定期的にスキャンしてベース ページを見つけ、それらを巨大なページに統合します。

巨大ページの欠点をさらに隠しながら、パフォーマンスを向上させることを試みる研究が行われています。 Ingens [12,13] は、クリティカル パスから外して巨大なページを非同期的に準備することを提案しています。
Hawkeye [14] は、メモリ アクセス パターンに基づいたきめ細かいヒュージ ページ プロモーション スキームを提示し、最小限のヒュージ ページ プロモーションでパフォーマンスを最大化します。 朱ら。 [15] ヒュージ ページを使用するプロセスを一般化し、ヒュージ ページのライフサイクルを最適化します。 パートら。 [16] はヒュージ ページにホールを許可し、ヒュージ ページのメモリ管理に柔軟性をもたらします。
しかし、この巨大なページは両刃の剣です。 管理単位のサイズが増加したため、ページ割り当ては内部断片化の影響を受けます。 割り当てられたアドレス範囲が巨大なページ サイズより小さい場合、ページの残りの部分は利用できず、無駄になってしまいます。 このいわゆるメモリの膨張により、巨大なページを持つシステムではメモリ使用率が大幅に減少する可能性があります [12-17]。
ページ サイズの増加は、プログラムのパフォーマンスにも悪影響を与える可能性があります。 最新の OS は、プロセス間で効率的にメモリを共有するために、コピーオンライト方式を広範囲に採用しています。 ただし、CoW は基本ページ粒度でのみ処理されます。
したがって、巨大ページ上の CoW を処理するには、巨大ページを基本ページに分割し、障害のあるページのみをコピーします。 巨大なページの分割にはかなりの時間がかかるため、断続的なロング ページ フォールトの処理が発生します。 この意味で、一部のアプリケーションは、メモリを大量に消費するアプリケーションであっても、安定したパフォーマンスとメモリ使用率のためにヒュージ ページの使用を推奨しません [4,18]。
一般に、プロセス アドレス空間にはアドレス空間の範囲があり、その範囲内のすべてのページが同じ許可と特性を持ちます。 管理のために、最新の OS は通常、そのようなアドレス空間の範囲を表す「仮想メモリ領域 (VMA)」の概念を採用しています。 プロセス アドレス空間内のページは、その起源に従って分類できます。

一部のページは、「ファイルバックアップページ」と呼ばれる、二次ストレージ上のバッキングファイルからロードできます。 一方、一部のページは裏付けデータなしで動的に設定されます。 この場合、スタックとヒープのページは、いわゆる「匿名ページ」です。
2.2. フォークとコピーオンライト
Fork は、新しいプロセスを作成するための POSIX 標準システム コールの 1 つです。 プロセスが fork システム コールを呼び出すと、呼び出しプロセスの子として新しいプロセスが作成されます。
OS は内部で、呼び出しプロセスのアドレス空間全体を複製することによって子プロセスを作成します。 これは、子プロセスが親プロセスと同じデータで開始する必要があることを意味します。
アドレス空間の重複を効率的に処理するために、ほとんどの最新の OS はコピーオンライト (CoW) 技術を使用しています。 親のアドレス空間を複製するために、OS は各ページをコピーしません。 代わりに、子プロセスのページ テーブルは、親プロセスのページ テーブルをコピーすることによって構築されます。
これにより、親のアドレス空間への共有マッピングが効果的に作成されます。 共有マッピングの作成中に、対応する PTE の許可ビットをクリアすることにより、各ページの書き込み許可が削除されます。
マッピングをコピーすると、親と子の両方が共有ページを自分のページとして読み取ることができます。 プロセスの 1 つがページに書き込みアクセスを行うと、書き込み許可がないため、MMU はページ フォールトをトリガーします。 ページ フォールト ハンドラーでは、OS が新しいページを割り当て、元のページをコピーし、書面による許可を得て、フォールトの原因となったプロセスの対応するページ マッピングを更新します。
この時点で、親と子は同じ仮想アドレス上に異なるデータを持つことができます。このコピーオンライトメカニズムは、多くの仮想メモリ機能を実現するための基本的なキーメカニズムとして広く使用されています。 具体的には、初期化されていないヒープ領域の読み取りは、通常、すべてゼロを含む特別なページであるゼロ ページへの共有マッピングを使用して処理されます。
カーネル同一ページ マージ (KSM) は、システム内の同じページを重複排除する技術です。 OS はシステム内のページをスキャンして、同一のデータを持つページを識別します。 そのようなページが見つかると、OS は 1 ページを除くすべてのページを再利用し、対応するページ テーブルを更新して残りのページを共有します。
処理中、書き込み権限が削除されるため、ページへの後続の書き込みアクセスが識別されてコピーされます。コピーオンライトの効率が高いため、プロセスの作成が効率化され、一部のデータ集約型アプリケーションはこの利点を利用してデータ コピーを作成します。 。
人気のあるメモリ内 Key-Value ストア サービス [4] の 1 つである Redis は、そのようなケースの 1 つです [19]。 Redisis は、主にデータをメモリ内に保持して、高スループットと低遅延を実現するように設計されています。
ただし、一部のアプリケーションでは保存されたデータの永続性が要求され、フォークによってインメモリ設計が再補完されます。 Redis は受信リクエストをメモリ内のインデックスとデータ構造のみに適用し、定期的に fork システム コールを呼び出します。 これにより、元の Redisprocess の重複したメモリ内容を持つ子プロセスが効果的に作成され、呼び出し元のプロセス (つまり、元のプロセス) は受信リクエストの処理を続行します。
子プロセスはその実行を迂回させます。 現在のメモリの内容をスナップショットとして使用し、メモリ内のデータ構造をファイルにシリアル化して、メモリ内のスナップショットの永続性を確保します。 スナップショットをフラッシュした後、子プロセスは終了します。
元のプロセスは同じ方法で別のスナップショットを作成でき、システム クラッシュが発生した場合、最後のスナップショットを読み取ることで Redis を回復できます。フォークは貴重なシステム コールですが、そのオーバーヘッドが批判されています。

バウマンら。 [20] はフォークを分析し、フォークが最新のアプリケーションでパフォーマンスの低下を引き起こすことを発見しました。 たとえば、最新のアプリケーションがより複雑になるにつれて、OS は、POSIX 仕様に準拠するフォーク システムコールの処理を開始するために、約 25 の特殊なケースを考慮する必要があります。 彼らは forksystem コールの問題を要約し、現代のコンピュータに fork system コールが持つべき機能を提案しました。
また、フォークを交換する別の方法も提供します。 趙ら。 [19] は、メモリ フットプリントが大きいアプリケーションではページ テーブルのセットアップに長い時間がかかるため、現在のシステムでのフォークの実装が非効率であると指摘しました。 解決策として、彼らはコピーオンライト技術を一般化し、ページテーブルも通常のページと同様に書き込み時にコピーされるようにしました。
For more information:1950477648nn@gmail.com






