1. 序章

このチュートリアルでは、キャッシュに書き込み操作を実装するさまざまな方法について学習します。 それぞれの方法の利点を検討し、評価する基準について説明します。

ただし、その前に、キャッシングに関するいくつかの基本事項を更新しましょう。

2. キャッシュ

一般に、キャッシュは、一部のストレージへの便利なアクセスを提供するファサードコンポーネントです。 通常、キャッシュストレージはより高速で高価であるため、より少ない量で利用できます。 場合によっては、ソースストレージとは異なり、キャッシュストレージは設計したシステムによって所有されることがあります。

キャッシュの目的は、レイテンシー(単一の操作を実行する時間間隔)とスループット(操作処理速度)の両方を改善することです。ハードウェアで両方のキャッシュを使用できます(例: CPUキャッシュ)およびソフトウェア(例: RAMを使用してSSDなどのセカンダリストレージからデータをキャッシュするページキャッシュ)レベル。

要求されたデータがキャッシュストレージにある場合、キャッシュhitが発生します。 そうしないと、キャッシュmissが発生します。

Eviction は、キャッシュからデータを削除するときです。 これは、データが未使用であるか、かさばっている、または単にデータを保存し続けるのが非効率的であると見なしていることが原因である可能性があります。 有効期限が切れたデータと有効期限が切れていないデータの両方で、エビクションが発生する可能性があります。

これは、 invalidation、とは異なります。これは、キャッシュから直接削除するか、要求されたときにバッキングストアからデータを更新する手段を提供することにより、キャッシュ内のエントリを無効として宣言するプロセスを指します。

3. ポリシーを書く

キャッシュの書き込みポリシーは、書き込み操作の実行中のキャッシュの動作です。 キャッシュの書き込みポリシーは、キャッシュによって公開されるさまざまなさまざまな特性のすべてにおいて中心的な役割を果たします。 次に、3つのポリシーを見てみましょう。

  • ライトスルー
  • ライトアラウンド
  • 返事を書く

4. ライトスルー

最初に一貫性を確保するようにキャッシュを設計するとします。 つまり、応答をクライアントに送り返す前に、バッキングストアを同期的に更新する必要があります。

要求されたエントリがキャッシュに見つからない場合は、最初にキャッシュストレージにエントリを作成します。

これは実装するのが最も簡単なポリシーであり、ライトスルーと呼びます。

5. ライトアラウンド

現在、ライトスルーは、書き込まれたデータがすぐにアクセスされると予想される場合に最適な結果を提供します。 キャッシュの使用パターンによっては、これが当てはまらない場合があります。

直後に読み取り操作が予期されない場合、キャッシュは使用していないエントリで汚染されます。キャッシュの汚染を回避するために、キャッシュミスの場合にキャッシュエントリの割り当てをバイパスする場合があります

このポリシーを「書き込みなしの割り当てによるライトスルー」またはライトアラウンドと呼びます。

ライトスルーキャッシュのさらに別のバリエーションは、write-invalidateポリシーです。 このモードでは、書き込み操作がバッキングストアに直接送信されるとともに、キャッシュがヒットした場合にキャッシュデータエントリが無効になります。

6. 返事を書く

ライトスルーは最高の一貫性を提供しますが、書き込み操作の待ち時間には役立ちません。キャッシュは、バッキングストアが更新された後にのみクライアントに応答を返します。

高速キャッシュストレージを利用して、これも合理化することができます。 これを行うには、バッキングストアを更新する前に応答を返す必要があります。 この場合、バッキングストアの更新は別のシーケンスで非同期的に行われます。

このようなシーケンスは、応答が返される直前、定期的に、またはキャッシュエントリダーティステートに基づいてキャッシュエビクションに統合されるなど、いくつかの方法で開始できます。 CPUキャッシュの場合、状態インジケータとしてダーティビットを使用します。 ソフトウェアキャッシュでは、通常、応答が返される前の非同期キックオフが推奨されます。

このタイプのポリシーをライトバックまたはライトビハインドと呼びます。

非同期更新により、応答性が向上するだけでなく、たとえばソースストレージ更新のバッチ処理を使用してスループットを向上させることができます。

実装がより困難なライトバックに加えて、一貫性の問題が発生する可能性があります。 揮発性メモリにキャッシュがあると、ライトバックが完了する前に停電が発生すると、データが失われます。

ライトバックの実装では、さらに微妙な問題も発生します。 キャッシュインスタンスだけでなく、別のキャッシュインスタンスまたは直接書き込み操作のいずれかによって他の手段を使用してソースストレージにアクセスする場合を検討してください。 バッキングストアにまだ書き込まれていないデータは、直接書き込み操作が完了した後にのみストアに到達する可能性があります。

これが起こらないようにするには、操作の順序をある程度維持する必要があります。 これをこの手法と呼びますトランザクションのシリアル化。

この種の問題に対処するための一連の手法と概念自体の両方を考慮して、キャッシュコヒーレンスという用語を使用します。

7. 書き込み割り当ての決定

キャッシュミスのためにキャッシュをバイパスするようにライトスルーポリシーを変更したのと同じ方法で、ライトバックポリシーを調整できます。 このタイプの選択は、書き込み割り当てとして知られています。

  • 書き込み割り当てまたはフェッチオンライトは、後続のバッキングストア操作の前にキャッシュにデータを入力する決定です。
  • 書き込みなし割り当てまたは書き込みなしは、キャッシュをバイパスしてバッキングストア操作を続行する決定です。

バッキングストアを更新するシーケンストリガーによっては、no-fetch-on-writeをライトバックに適用するのが難しい場合があります。 その結果、書き込み時のフェッチは通常、書き戻しとペアになりますが、書き込み時のフェッチなしはライトスルーに適用されることが多くなります。

8. トレードオフを理解する

キャッシュを最初から設計する場合でも、利用可能な多くのキャッシュの1つを使用する場合でも、どのようなポリシーがニーズに最も適しているかを理解する必要があります。 最大の一貫性を実現したい場合は、ライトスルーを使用することをお勧めします。

書き込み操作に高いパフォーマンスを提供する必要がある場合は、ライトバックポリシーを検討する場合があります。 書き戻しポリシーで一貫性の問題が発生する可能性があるため、それらにも対処する必要があります。

さらに、読み取り/書き込みの頻度とデータの局所性に関するキャッシュアクセスパターンは、ポリシーの選択と書き込みの割り当ての決定に影響を与える可能性があります。

9. 結論

この記事では、キャッシュで使用されるさまざまな書き込みポリシーについて説明しました。

この決定がもたらす課題と、いくつかの既知の手法の長所と短所について説明しました。

最後に、どこにでも適用すべき種類のポリシーに対する普遍的な答えはないことがわかりました。 具体的な選択は、要件の焦点、アクセスパターン、および利用可能なリソースによって異なります。