CXLメモリ拡張とプーリング
サーバーのメモリ容量とコストのジレンマが解ける仕組みが分かります。CXL.memによる拡張・プーリングと、新たなレイテンシ階層の設計判断を原理から押さえられます。
- 1.CXL.memはPCIeの物理層にキャッシュコヒーレントなロード/ストア意味論を載せ、DRAMをCPUソケット外へ拡張・プールする。
- 2.拡張メモリはNUMAノードとして見え、既存のノード間レイテンシ階層にCXLという新しい遠い階層が加わる。
- 3.OSはCXLメモリをホットプラグ可能な階層として扱い、tieringでアクセス頻度に応じページを昇格・降格させる。
PCIeの上にコヒーレンシを載せる
サーバーのメモリ容量は長らく「CPUソケットに直結したDIMMスロットの数」に縛られてきました。コア数が増えてもメモリチャネル数はソケット当たり一定で、コア当たりの帯域・容量比が下がり続ける——これがメモリキャパシティの壁です。増設したくても、DIMMスロットが埋まっていれば残る手段はソケットを増やす(=コストも増やす)しかありませんでした。
CXL(Compute Express Link) はこの壁を、PCIeの物理層・電気的インターフェースを再利用しながら、その上にキャッシュコヒーレントなロード/ストア意味論を載せることで越えます。PCIeそのものはIOデバイス向けのパケット転送プロトコルで、CPUキャッシュとの一貫性維持や、キャッシュライン粒度の低遅延アクセスは想定していません。CXLは同じ物理層の上に3つのサブプロトコルを多重化します。
CXL.io : 従来のPCIe相当(デバイス発見・設定・割り込み)
CXL.cache: デバイスがホストのメモリをキャッシュする経路(コヒーレント)
CXL.mem : ホストがデバイス側メモリをロード/ストアで直接読み書きする経路
このうちメモリ拡張・プーリングを支えるのが CXL.mem です。デバイス(CXLメモリコントローラを積んだモジュールやアプライアンス)が持つDRAMを、CPUから見て自ソケットのDIMMと同様にバイトアドレス指定でロード/ストアできるメモリ領域として見せます。ファイルI/Oのように読み書きするのではなく、mmapされたページと同じ感覚でCPU命令から直接触れる点が、既存のストレージ拡張(NVMe等)との決定的な違いです。
PCIeはレーン当たりの帯域が世代ごとに倍増し続けるコネクタ・信号規格として広く普及済みです。CXLは新しい配線規格をゼロから作るのではなく、この枯れた物理層に低遅延のトランザクション層を足すことで、既存のスロット形状・スイッチ・リタイマーのエコシステムに乗ったまま普及できます。CXL 3.xはPCIe 6.0の物理層(PAM4変調、x16レーンで片方向120GB/s超級)を前提にしています。
プーリング:メモリをソケットの外で共有する
CXL.memのもう一段の応用がメモリプーリングです。複数のホスト(サーバー)が、CXLスイッチを介して1つの共有メモリアプライアンスに接続し、そのプールから必要な分だけメモリ領域を論理的に切り出して割り当てられます。
[Host A]--\ +------------------+
[Host B]----- CXLスイッチ -----| メモリプール |
[Host C]--/ | (複数のDRAM/CXLメモリモジュール) |
+------------------+
各ホストへは、プールの一部が専用の物理アドレス範囲として見える
プーリングが解くのはメモリの取りこぼしです。個々のサーバーにDIMMを固定搭載する構成では、ワークロードごとの余剰メモリは他ホストへ融通できず遊びます。プールから動的に切り出せれば、需要が増したホストへ容量を再配分でき、クラスタ全体でのメモリ利用率が上がります。ここでの切り出し・返却は、後述するホットプラグの経路そのものです。
プーリングは「同じ物理メモリ領域を複数ホストが同時にコヒーレントに読み書きする」こととは異なります。基本形は、プールの中の各領域はある時点で1ホストにのみ排他的に割り当てられる(fabric-attached memoryのパーティショニング)方式です。真の複数ホスト共有・コヒーレンスはCXL 3.xで規定される、より高度な機能に属し、要求されるスイッチ・アプライアンス側の対応も重くなります。
NUMAとの関係:新しい「遠い」階層が増える
CXL接続メモリはOSからどう見えるでしょうか。答えは単純で、追加のNUMAノードとして扱われます。NUMAとメモリアクセス局所性で見た「自ノードは近い・他ノードは遠い」という非対称モデルの延長線上に、CXLというもう一段遠いノードが加わる形です。
[ローカルDRAM (Node0)] < [他ソケットのDRAM (Node1, インターコネクト経由)] < [CXLメモリ (NodeN)]
最速・最小遅延 中間(既存のNUMA遠隔ノード) 最も遅い・帯域も制約されがち
CXL.memの遅延はローカルDRAMの数倍程度に達し、既存のソケット間リモートアクセス(インターコネクト1ホップ)よりもう一段重くなるのが典型です。理由はロード/ストアの経路がPCIeレーン・CXLスイッチ・リタイマーを跨ぐぶん、物理的なホップ数と変換段が増えるためです。SLIT(System Locality Information Table)で表現される距離値も、CXLノードには既存のリモートノードよりさらに大きな値が割り当てられます。
レイテンシは確実に劣化しますが、帯域は構成次第でローカルDRAMに近い値を出せる場合があります。CXLレーン数を積めば集約帯域は伸びるため、「遅いが太い」メモリ階層になり得ます。これはレイテンシ・レジデントなワークロード(乱数アクセスの多いポインタ追跡系)とは相性が悪く、逆にストリーミング的な大容量スキャンには向く、という遅延と帯域を切り分けた設計判断を要求します。
Tiering:階層としてのメモリを使いこなす
複数の遅延特性を持つメモリノードが混在する環境で、どのページをどの階層に置くかを決める考え方がメモリTieringです。発想はページ置換アルゴリズムがページをメモリとディスクの間で出し入れするのと似ていますが、Tieringは「メモリとメモリの間」——高速な近傍ノードと低速なCXLノードの間でページを動かす点が異なります。
Tieringの基本ループ:
1. アクセス頻度・最終アクセス時刻を階層ごとに追跡
2. 高頻度アクセスページ → 近傍(高速)ノードへ昇格(プロモーション)
3. 低頻度・冷えたページ → CXL等の遠方(低速)ノードへ降格(デモーション)
4. 昇格先の空き不足時は、そちらの冷えたページを先に降格して枠を空ける
この仕組みはNUMAの自動NUMAバランシングが使うアクセス傾向のサンプリング(ページテーブルエントリを意図的にアクセス不可にしてフォルトで観測する手法)を土台に拡張されます。違いは、単に「近いノードへ寄せる」だけでなく、容量が大きく遅いCXL階層を、価値ある退避先・拡張先として積極的に使うことです。Linuxカーネルの memory tiering 機構は、ノードごとに階層のランクを定義し、ホットなページ(頻繁に触られるページ)は上位階層に留め、コールドなページはCXL階層へ降格させることで、実効的な「近傍メモリの容量」を体感上広げます。
昇格・降格はページのコピーとTLBシュートダウンを伴う実コストです。判定を短い観測窓で行うと、一時的にしかアクセスされないページまで昇格させて枠を無駄にしたり、逆に頻繁に往復する振動を招きます。CXL階層の追加は、この種の誤判定コストが以前のNUMAより一段深刻になる点に注意が必要です。判定の閾値やスキャン間隔のチューニングが、実運用でのTieringの効果を大きく左右します。
ホットプラグ可能な大容量メモリとしての運用
CXLメモリのもう1つの実務上の価値が、稼働中の着脱可能性です。ホットプラグ機構で見たセクション単位のオンライン/オフライン化と同じ枠組みで、CXLデバイスは論理的なメモリブロックとして後から追加・撤去できます。追加時は新規セクションの struct page を起こしてゾーンへ編入し、撤去時は該当範囲のページをすべて退避(reclaimまたはマイグレーション)してから外す——原理は物理DIMMのホットプラグと同一です。
ここでもZONE_MOVABLE の考え方が効きます。CXLメモリを抜く可能性がある運用(プールへの返却、障害デバイスの切り離し)を前提にするなら、そこには移動不可なページ(カーネルのスラブ、pinされたDMAバッファ等)を置かない設計が必要です。プーリングでホストへ動的に貸し出されたCXL領域は、まさにこの前提で運用されることが多く、OSからは「後で確実に返す必要がある、比較的遅いホットプラグ可能なメモリ」として扱われます。
CXLメモリ拡張の急所は4点です。(1) CXL.memはPCIe物理層の上にコヒーレントなロード/ストアを載せる、ファイルI/Oとは異なる経路である。(2) プーリングは複数ホストへの動的な排他的割当が基本形で、真の同時共有は別機能。(3) OSからは追加のNUMAノードとして見え、既存のリモートノードよりさらに遠い新階層になる——遅延は劣るが帯域は構成次第で健闘し得る。(4) Tieringが観測ベースでページを昇格・降格させ、ホットプラグ機構がZONE_MOVABLEを前提に着脱を支える。
まとめ
- CXLはPCIe物理層の上にコヒーレントなロード/ストア意味論(CXL.mem)を載せ、ソケット外のDRAMをバイトアドレス指定で直接拡張・プーリングする。
- プーリングは複数ホストが共有アプライアンスから容量を動的に切り出す方式で、基本は排他的割当。メモリ利用率の取りこぼしを解消する。
- CXLメモリはNUMAノードとして見え、既存のリモートノードよりさらに遠い新しいレイテンシ階層を作る。遅延は劣化するが帯域は構成次第で確保できる。
- Tieringはアクセス頻度に応じページを近傍/CXL間で昇格・降格させ、ホットプラグ機構(ZONE_MOVABLE等)がCXLメモリの安全な着脱を支える。
OS Article
CXLメモリ拡張とプーリングを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
CXL
比較で見る軸
難易度: advanced / カテゴリ: OS / タグ数: 6
導入後に効く点
拡張メモリはNUMAノードとして見え、既存のノード間レイテンシ階層にCXLという新しい遠い階層が加わる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- OS
- タグ数
- 6
判断チェックリスト
- 自社の用途が「CXL / メモリ」に近いか確認する。
- 強みである「CXL.memはPCIeの物理層にキャッシュコヒーレントなロード/ストア意味論を載せ、DRAMをCPUソケット外へ拡張・プールする。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。