キャッシュメモリは、コンピューティングとデータ処理において重要な役割を果たします。実際、現代のコンピューターシステムがデータをすばやく簡単にアクセスできるよう保存するために使う、極めて重要なコンポーネントです。デスクトップPCやデータセンターからクラウドベースのコンピューティングリソースまで、あらゆるものが、キャッシュメモリとも呼ばれる高速なスタティック・ランダム・アクセス・メモリ(SRAM)を使用しており、中央処理装置(CPU)と連携して動作します。
コンピューターの高速な動作は、RAMの性能やプロセッサーの処理能力によるものと考えられがちですが、キャッシュメモリもデバイス全体の性能に大きく直接的な影響を与えます。
この記事では、キャッシュメモリの仕組み、さまざまな種類、そしてコンピューターシステムを円滑に動作させるうえで不可欠な理由について、理解を深めます。
キャッシュメモリの仕組み
一部のコンピューターにはSSDキャッシュメモリが搭載されています。フラッシュメモリキャッシュとも呼ばれ、永続ストレージがデータを処理できるようになるまで一時的にデータを保存し、デバイスの性能を高めます。
しかし、情報の取り出しと処理を担うCPUは、一般的なRAMよりも大幅に高速です。そのため、RAMから受信した命令を読み取ろうとしている間、ユーザーは待たされることがあります。これにより、性能と速度が低下します。
キャッシュメモリは、これを防ぐための解決策です。CPUの近くに、容量は小さいものの高速なSRAMを搭載することで実現します。
SRAMは、RAM上の特定のメモリアドレスにあるデータや命令を取得し、元のアドレスの記録とともに一時的にキャッシュメモリへコピーします。その結果、CPUが待たされることがなくなり、キャッシュが読み取り性能の向上に使われる理由となっています。
ただし、どのデバイスでもキャッシュメモリの容量はRAMやCPUの計算能力と比べて小さいため、必要なデータをすべて保持できるとは限りません。状況に応じて、「キャッシュヒット」または「キャッシュミス」と呼ばれる結果になることがあります。
メモリキャッシュヒット
CPUがキャッシュメモリから命令を読み出し、対応する情報を見つけた場合、これはキャッシュヒットと呼ばれます。キャッシュメモリはCPUに近く高速であるため、CPUにデータや命令を提供し、処理を開始できるようにします。
キャッシュヒットが発生すると、キャッシュメモリはCPUとメインRAMの間にある高速な仲介役およびキューとして機能します。RAMやメモリへの書き戻しが必要なデータや命令を扱う処理は、RAMが応答できるようになるまで、まずキャッシュメモリを経由します。これにより、CPUがRAMの応答を待って速度を落とすことがなくなります。
この対応付けがどのように行われるかは、キャッシュメモリの書き込みポリシーによって異なります。「ライトスルー」と呼ばれるポリシーはその一つです。これは最も単純で分かりやすい方式で、キャッシュメモリに書き込まれたものはすべてRAMにも書き込まれます。
「ライトバック」ポリシーでは、キャッシュメモリに書き込まれたデータをすぐにRAMへ書き戻すのではなく、キャッシュメモリに書き込まれたデータを、その間「ダーティー」としてマークします。
これは、そのデータがRAMから取得した元のデータや命令と異なることを示します。キャッシュメモリから削除されるときに初めてRAMへ書き込まれ、元の情報を置き換えます。
中間的なキャッシュメモリ書き込みポリシーには、「ダーティー」な情報をキューに入れ、まとめてメインRAMへ書き戻すものもあります。複数回に分けて個別に書き込むよりも効率的な方式です。
メモリキャッシュミス
CPUがキャッシュメモリ上の情報や命令を読み出そうとしても必要なデータが見つからず、ハードドライブやRAMに直接アクセスしなければならない場合、これはキャッシュミスと呼ばれます。この場合、RAMやハードドライブの速度に合わせて動作しなければならないため、デバイスの処理速度と効率が低下します。
その後、必要な情報や命令がRAMから正常に取得されると、CPUで処理される前に、まずキャッシュメモリへ書き込まれます。
これは主に、CPUが最近使用したデータや命令は、依然として重要で、すぐに再びアクセスされる可能性が高いためです。キャッシュメモリに書き込んでおけば、CPUは同じデータを取得するためにRAMやハードドライブへもう一度戻る必要がありません。
まれに、一部のデータタイプがキャッシュ不可としてマークされることがあります。これは、CPUがRAMやハードドライブから手動で取得した場合でも、不要なデータによって貴重なキャッシュメモリ領域が占有されるのを防ぐためです。
キャッシュメモリの「追い出し」
キャッシュメモリの容量は、RAMやハードドライブと比べると極めて小さいものです。RAMの容量は2GBから64GB、一般的なコンシューマーデバイスのハードドライブは平均で1TBから2TBに達する一方、キャッシュメモリの容量は2KBから数メガバイトです。
このストレージ容量の大きな違いにより、CPUがまだ情報を取り込む必要があるのに、キャッシュメモリがいっぱいになることがあります。「追い出し」とは、キャッシュメモリからデータを削除し、そこに書き込む必要がある情報のための空きを作る処理です。
どのデータを追い出すかは、最もよく使われ、重要な情報を基準に「置換ポリシー」によって決定されます。
置換ポリシーにはいくつかの方式があります。最も一般的なものの一つが、最終使用時刻が最も古いものを置き換える(LRU)ポリシーです。このポリシーでは、最近使われていないデータや命令は、より最近使われたものに比べ、近い将来に必要となる可能性が低いと判断されます。
キャッシュメモリの2種類
キャッシュメモリは、物理的な位置とデバイスのCPUとの距離に応じて、2つのカテゴリーに分けられます。
- プライマリーキャッシュメモリ:メインキャッシュメモリとも呼ばれるプライマリーキャッシュメモリは、CPUと同じダイ上に配置されたSRAMで、可能な限りCPUの近くに搭載されます。CPUとRAMの間で情報を保存・取得する際に一般的に使われるタイプです。
- セカンダリーキャッシュメモリ:セカンダリーキャッシュメモリは、プライマリーキャッシュメモリと同じハードウェアです。ただしCPUからより離れた場所に配置され、必要なときにCPUが利用できる予備のSRAMとして機能します。
システム内の物理的な位置を表す用語としては正確ですが、現在ではどちらも使われていません。現代のキャッシュメモリは、問題なくCPUと同じダイ上に配置できるほど小さく、十分な容量を持つよう製造できるためです。代わりに、現代のキャッシュメモリはレベルで呼ばれます。
キャッシュメモリの3つのレベル
現代のコンピューターシステムには複数のキャッシュメモリがあり、それぞれプロセッサーコアとのサイズや距離が異なるため、速度も異なります。これらはキャッシュレベルと呼ばれます。
最も小さく高速なキャッシュメモリはレベル1キャッシュ、またはL1キャッシュと呼ばれ、次にL2キャッシュ、続いてL3キャッシュがあります。現在、ほとんどのシステムにはL3キャッシュが搭載されています。IntelはSkylakeチップの導入以降、一部のプロセッサーにL4キャッシュメモリも追加しています。ただし、一般的ではありません。
レベル1キャッシュ
レベル1キャッシュはCPUそのものに直接組み込まれているため、最も高速なキャッシュメモリです。ただし同じ理由から、容量は大きく制限されています。CPUと同じクロック速度で動作するため、情報や命令の要求・保存時にRAMを補う優れたバッファーとなります。
L1キャッシュは通常、命令用(L1i)とデータ用(L1d)の2つに分けられます。これは、プロセッサーが使用するさまざまなフェッチ帯域幅に対応するためです。多くのソフトウェアは命令よりもデータに多くのキャッシュを必要とする傾向があります。
最新のデバイスのキャッシュ容量は64KBで、L1iが32KB、L1dが32KBです。クアッドコアプロセッサーでは、L1キャッシュメモリの合計は256KBになります。
レベル2キャッシュ
レベル2キャッシュもCPUチップ内部に配置されることが多いものの、コアから見てL1より離れた場所にあります。L1よりも大幅に安価で、サイズと容量が大きく、1コアあたり128KBから8MBの範囲になります。
場合によっては、L2キャッシュメモリがコプロセッサーとも呼ばれる別の処理チップに実装されることもあります。
レベル3キャッシュ
レベル3キャッシュメモリは、ラストレベルキャッシュ(LLC)と呼ばれることもあり、CPUの外部に配置されますが、依然としてCPUの近くにあります。L1やL2キャッシュよりもはるかに大容量ですが、やや低速です。
もう一つの違いは、L1とL2のキャッシュメモリがそれぞれのプロセッサーコア専用で、共有できない点です。一方、L3はすべてのコアから利用できます。そのため、データ共有やコア間通信、場合によっては設計次第でグラフィックス処理装置(GPU)のキャッシュとの連携において重要な役割を果たします。
容量については、現代のデバイスのL3キャッシュは、1コアあたり、またはデバイスの仕様に応じて10MBから64MBの範囲になる傾向があります。
キャッシュマッピングとは?
キャッシュメモリは非常に高速で、ソフトウェアのコンピューティング処理に対する要求の高まりとともに大容量化が進んでいるため、必要な情報を取得する仕組みが必要です。そうでなければ、CPUは実際に処理する代わりに、メモリ上で適切な命令を探すことに時間を費やしてしまいます。
プロセッサーは、読み出したいデータや命令があるRAMのメモリアドレスを把握しています。そのRAMのメモリアドレスへの参照と、関連するデータや命令がキャッシュメモリ内にあるかを検索する必要があります。
RAMから取得したデータや命令をキャッシュメモリに対応付ける方法は数多くあり、それぞれ重視する要素が異なります。たとえば検索時間を短縮すると正確性が低下し、キャッシュヒットの可能性も下がります。一方、キャッシュヒットの可能性を最大化すると、平均検索時間も長くなります。
速度と正確性の妥協点に応じて、キャッシュマッピング手法には3つの種類があります。
ダイレクトキャッシュマッピング
ダイレクトキャッシュマッピングは、最も単純で分かりやすい情報復元手法です。この方式では、RAMのアドレスに基づいて、各メモリーブロックをキャッシュ内の特定のラインに割り当てます。
これにより、CPUは必要な情報があるかどうかを確認するために、この1つのブロックだけを検索すれば済みます。ただし、その正確な場所に保存されていなければ、CPUはキャッシュミスと判断し、RAMから直接情報を検索して取得します。
ダイレクトマッピングは、特に高性能なデバイスや、キャッシュメモリとCPUに流れ込むデータや命令の量が多い環境では、非常に非効率です。
連想キャッシュマッピング
連想キャッシュマッピングは、ダイレクト方式とは正反対です。RAMからデータや命令を取得する際、どのブロックもキャッシュメモリ内の任意のラインに入ることができ、配置場所はランダムになります。CPUが特定の情報を検索するときは、探している情報が含まれているかどうかを確認するため、キャッシュメモリ全体を調べなければなりません。
この方式ではキャッシュヒット率が高くなり、CPUがRAMから直接情報を取得することはほとんどありません。しかし、キャッシュメモリとの通信だけで節約できる時間が、命令を必要とするたびにすべてのラインを検索する時間によって失われます。
セットアソシアティブキャッシュマッピング
セットアソシアティブキャッシュマッピングは、ダイレクトキャッシュマッピングと連想キャッシュマッピングの折衷方式です。キャッシュヒットを最大化しながら、リクエスト1件あたりの平均検索時間を最小限に抑えることを目指します。これを実現するため、RAMから取得した各データブロックは、限られた数の異なるキャッシュメモリブロックにのみ対応付けられます。
これはNウェイ・セットアソシアティブキャッシュマッピングとも呼ばれます。各情報や命令には、対応付けられ、後からCPUが見つけられるブロックがN個あります。
2ウェイ・セットアソシアティブマッピングシステムでは、RAMはキャッシュメモリ内の2か所のいずれかにデータを配置できます。この場合、キャッシュヒットの可能性は高まりますが、CPUは候補となるブロックを2倍確認する必要があるため、平均検索時間も2倍になります。
4ウェイ・セットアソシアティブマッピングシステムではRAMに4つの候補ブロックが与えられ、8ウェイでは8つ、16ウェイでは16通りの候補が提供されます。Nの値が大きいほどキャッシュヒットの可能性は高まりますが、CPUがデータブロックを平均して復元する時間は長くなります。
Nの値はデバイスと用途に応じて調整され、時間とキャッシュヒットのバランスが取れる比率が選ばれます。
キャッシュメモリの活用例3選
キャッシュメモリはオンプレミス環境や個人用デバイスだけでなく、データセンターのサーバーやクラウドコンピューティングサービスでも広く使われています。ここでは、キャッシュメモリのソリューションを示す例をいくつか紹介します。
Beat
Beatはギリシャ発の配車アプリで、世界全体で70万人を超えるドライバーと2,200万人のアクティブユーザーを抱えています。2011年に設立され、現在では主にアルゼンチン、チリ、コロンビア、ペルー、メキシコで利用される、ラテンアメリカで最も急成長しているアプリです。
急成長期、Beatのアプリではデータ配信システムのボトルネックが原因で障害が発生し始めました。同社はすでにAWSを利用し、Amazon ElastiCacheを導入していましたが、設定のアップグレードが急務となっていました。
「インスタンス間でトラフィックを好きなだけ分散し、基本的に水平方向にスケールできました。以前のソリューションではできなかったことです」と、BeatのシニアエンジニアリングマネージャーであるAntonis Zissimos氏は話します。「新しいクラスターモードへの移行と、新しい標準Redisライブラリの利用により、スケーリングのニーズに応え、エンジニアが行わなければならない作業の数を減らせました」
Beatは2週間足らずでElastiCacheをリセットし、ノードあたりの負荷を25~30%削減、コンピューティングコストを90%削減し、キャッシュレイヤーに費やすスタッフの時間を90%削減しました。
Sanity
Sanityは、コンテンツを構造化データとして扱うことで、開発者がコンテンツをより適切に統合できるよう支援するソフトウェアサービスおよびプラットフォームです。米国とノルウェーに本社を置き、高速で柔軟なオープンソースの編集環境であるSanity Studioは、完全にカスタマイズ可能なユーザーインターフェース(UI)と、ライブホスト型のデータストレージをサポートします。
プラットフォームを利用する開発者にコンテンツをリアルタイムかつ高速に配信するため、Sanityは配信を最適化する必要がありました。Google Cloudと連携し、世界各地の主要なエンドユーザー向けインターネットサービスプロバイダー(ISP)の近くにある複数のサーバーでコンテンツをキャッシュするため、Cloud CDNを導入しました。
「Google Kubernetes Engineを利用し始めて2年になりますが、スケーラビリティに関する多くの悩みを解消できました」と、Sanityの共同創業者兼CTOであるSimen Svale Skogsrud氏は話します。「世界中のユーザーをサポートできるよう業務を拡張しながら、本来なら午前3時に私たちを起こすような問題にも対応できています」
Sanityは現在、Google Kubernetes Engineを利用して5倍のトラフィックを処理し、世界中のエッジキャッシュインフラストラクチャを通じて高速化されたデータ配信をサポートできるようになっています。
SitePro
SiteProは、石油・ガス業界向けに革新的なエンドツーエンドのアプローチで、現場でのリアルタイムデータ取得を実現する自動化ソフトウェアソリューションです。米国を拠点とし、完全にインターネットベースのソリューションで、かつては同国で最も豊かな産油地域のほぼ半分を管理していました。
繊細な業務の管理を維持するため、SiteProはMicrosoft Azureの支援を求め、Azure Cache for Redisを導入して業務を強化しました。現在、SiteProはグリーンテクノロジーや、より環境に配慮したサービス・製品への投資を始められる段階にあります。
「Azure Cache for Redisだけが、必要なスループットを実現できました」と、Aaron Phillips氏(SiteProの共同CEO)は述べます。「Azure Cosmos DBとAzure Cache for Redisを組み合わせて以来、輻輳が発生したことは一度もありません。どちらも驚異的なスケールが可能です」
「Azure Cache for Redisのスケーラビリティは、他の業界へ進出できるようになるまでのスピードにおいて、大きな役割を果たしました」
Azureのおかげで、SiteProはアーキテクチャを簡素化し、データ品質を大幅に向上させることができました。現在では、コストを増加させることなく、タイミングのずれも解消しています。
続きを読む:メモリ管理における5つの主要トレンド
キャッシュメモリでデバイスの処理を高速化
キャッシュメモリは、CPUがRAMやハードディスクに頼ることなく、情報や命令を繰り返し取得できる一時的なストレージハードウェアです。コンピューターやサーバーでは、処理時間を短縮するため、デバイスのコアの内部、または物理的に可能な限りコアに近い場所に組み込まれています。
キャッシュメモリは、デバイスのCPUとの近さに応じて、L1、L2、L3の各レベルに分類されます。一般的なデバイスには、コアごとに各レベルのキャッシュが複数搭載されており、容量が大きいほどデバイスの計算処理は高速になります。
速度は、キャッシュメモリのマッピング方式や、時間と情報検索の精度のどちらを優先するかにも大きく左右されます。方式には、ダイレクトマッピング、連想マッピング、セットアソシアティブマッピングの3つがあります。