ソケット間インターコネクトの原理 ─ UPI/Infinity Fabric
2ソケットなのに性能が伸びない、リモートメモリで遅くなる謎を解きたい。UPIやInfinity Fabricがソケットをコヒーレントに束ねる原理と、NUMA遅延・スケール限界の発生源を押さえれば、配置と設計の勘所が掴めます。
- 1.UPI(Intel)やInfinity Fabric(AMD)はソケット間を結ぶコヒーレントリンクで、物理層・リンク層・プロトコル層を重ね、別ソケットのキャッシュ/メモリまでMESI系の一貫性を1つのアドレス空間として延ばす。
- 2.リモートメモリの遅延は「リンク往復+ディレクトリ/スヌープによる所有権確認」が源で、別ソケットのDRAMはローカルの約1.5〜2倍遅い。これがNUMAの距離差の正体。
- 3.全対全のスヌープはソケット数の2乗で増えるため、スヌープフィルタやディレクトリで照会を間引いても2〜8ソケット程度が実用上限。それ以上はファブリックスイッチや非対称トポロジへ移る。
なぜソケットを「ただつなぐ」では済まないのか
1枚のマザーボードに2つ以上のCPUソケットを載せたとき、各ソケットは自分専用のメモリコントローラとDRAMを持ちます。ソフトウェアからは1つの連続した物理アドレス空間に見せたい。だが各ソケットのキャッシュは独立しており、ソケットAがあるキャッシュラインを書き換えても、ソケットBの古いコピーは放っておけば矛盾します。ソケットをまたいでもキャッシュコヒーレンシを保つことが、マルチソケットの大前提です。
これを担う専用リンクが、IntelのUPI(Ultra Path Interconnect、QPIの後継)、AMDのInfinity Fabricです。汎用I/OのPCIeとは目的が違い、コヒーレンシトラフィック(読み出し要求・所有権要求・無効化・スヌープ応答)を低遅延で運ぶことに特化しています。
1つのソケット内では、コア・LLCスライス・メモリコントローラがリング/メッシュのオンチップネットワークで結ばれます。ソケット間リンク(UPI/IF)は、そのオンチップ網どうしを橋渡しする上位のファブリックです。AMDのInfinity Fabricはチップレット内(CCD間)にも同じプロトコルを使う点が特徴で、ソケット内とソケット間で一貫した仕組みを使い回します。
レイヤ構造 ─ 物理層からコヒーレンシまで
UPI/IFは、ネットワークのように層構造で設計されます。下から積み上げると役割が分離されます。
| 層 | 担うこと | 具体例 |
|---|---|---|
| 物理層 | 差動シリアルレーンで電気信号を運ぶ | 数十Gbpsのレーンを複数本束ねる |
| リンク層 | フリット単位の転送・CRC・リトライ・フロー制御 | 誤り検出と再送で信頼性を確保 |
| プロトコル層 | コヒーレンシメッセージの意味を定義 | 読み出し/所有権要求・スヌープ・無効化 |
物理層はPCIeと同様の差動シリアル方式ですが、転送単位は**フリット(flit)**と呼ぶ固定長の小片です。リンク層がフリットにCRCを付けて誤りを検出し、壊れれば再送します。最上位のプロトコル層が「このラインの所有権がほしい」「あなたのコピーを無効化せよ」といったコヒーレンシ意味論を運びます。層を分けることで、物理層の世代更新(速度向上)とプロトコルの安定を独立に進められます。
ソケット間リンクのスタック(UPI/Infinity Fabric)
プロトコル層 : Read/RFO/Snoop/Invalidate … 一貫性メッセージ
リンク層 : フリット化・CRC・リトライ・クレジット制御
物理層 : 差動レーン束(高速シリアル)
ソケットA ─[リンク]─ ソケットB を、この3層で結ぶ
スヌープフィルタとディレクトリ ─ 無駄な照会をどう減らすか
ソケットAのコアが、あるラインを書きたい(所有権がほしい)とします。素朴には全ソケットへスヌープをブロードキャストし「このコピーを持っていたら無効化せよ」と問い合わせます。これは確実ですが、ソケット数が増えると問い合わせトラフィックが膨らみます。そこで2つの間引き機構が使われます。
スヌープフィルタは「他ソケットがどのラインをキャッシュし得るか」を要約して保持し、明らかに誰も持たないラインへのスヌープを省きます。ディレクトリはより踏み込み、各ラインのホーム(そのアドレスを所有するメモリ側)に「今どのソケットがコピーを持つか/状態は何か」を記録し、実際に持つ相手にだけ無効化をユニキャストします。この発想はコア間のディレクトリ方式コヒーレンシをソケット粒度へ拡張したものです。
| 方式 | 通信パターン | ソケット増の効き方 | コスト |
|---|---|---|---|
| ブロードキャストスヌープ | 全ソケットへ一斉問い合わせ | ソケット数の2乗で増大 | リンク帯域 |
| スヌープフィルタ | 持たないソケットを省く | 無駄スヌープを削減 | フィルタの記憶域 |
| ディレクトリ | 持つソケットへユニキャスト | 共有者数だけに依存 | ディレクトリの記憶域 |
ソケットAが書き込み所有権(RFO)を得る流れ(ディレクトリ有り)
1. A → ホーム : このラインのRFO(書きたい)
2. ホーム : ディレクトリ照会 → 共有者はBだけと判明
3. ホーム → B : 無効化スヌープ(ブロードキャストしない)
4. B → ホーム : 無効化完了の応答
5. ホーム → A : 所有権付与+最新データ
→ 持たないソケットには一切問い合わせが飛ばない
ソケット間では1要求が複数往復するため、コア内のMESIに加え、応答待ちの**過渡状態(transient state)が必要です。さらにIntelは所有権の譲渡を表すF(Forward)**状態を導入し、複数共有者のうち1つだけが代表してデータを供給する役を担わせ、応答の重複を抑えます。状態数の増加は、距離が生む往復遅延の裏返しです。
NUMAのリモート遅延はどこから来るのか
各ソケットが自分のメモリを持つ構成は、本質的に**NUMA(Non-Uniform Memory Access)**です。あるコアから見て、自ソケットのDRAM(ローカル)と他ソケットのDRAM(リモート)で遅延が異なります。リモートアクセスの遅延は、おおむね次の合算です。
- リンク往復:要求とデータが少なくとも1回、ソケット間リンクを越える物理的な飛行時間。
- ホーム/ディレクトリ照会:所有権と共有者を確認する処理。リモートメモリでも、最新コピーが別ソケットのキャッシュにあれば、そこからの転送(キャッシュ間転送)が加わる。
- オンチップ網の通過:両ソケット内のメッシュ/リングを横断する時間。
| アクセス先 | おおよその相対遅延 | 経路 |
|---|---|---|
| ローカルDRAM | 基準(約80〜100ns) | 自ソケット内で完結 |
| リモートDRAM(1ホップ) | ローカルの約1.5〜2倍 | ソケット間リンクを1回越える |
| リモートキャッシュからの転送 | 状況により更に増加 | 別ソケットのキャッシュ→リンク→自コア |
ここで重要なのは、リモートが遅いのはDRAMが遅いからではなく、リンクとコヒーレンシ確認が間に挟まるからだという点です。だからこそOSはメモリをアクセスするコアと同じソケットに割り当てよう(first-touchポリシー)とし、スレッドとメモリのソケット親和性を保つことが性能を左右します。読み書きが頻繁に共有されるデータは、ソケットをまたぐとフォルスシェアリング同様、無効化往復が一気に増えて崩れます。
複数ソケットのスレッドが同じラインを交互に書くと、書くたびに別ソケットのコピーを無効化するスヌープがリンクを往復します。ローカルでも痛いこの「ピンポン」が、ソケット間ではリンク遅延ぶん何倍にも拡大します。メモリ一貫性モデルの理解と、共有データのソケット局所化(シャーディング)が対策の要です。
ソケット数スケールの限界
なぜ多くのサーバーが2ソケット、せいぜい4〜8ソケットで止まるのか。理由はコヒーレンシの配線とトラフィックの増え方にあります。全ソケットを直接リンクで結ぶ全対全トポロジでは、必要なリンク本数はソケット数Nに対して N×(N-1)/2 本となり、ほぼNの2乗に比例して増えます。2ソケットなら1本、4ソケットなら6本、8ソケットなら28本のリンクが要り、各CPUのリンクポート数(物理的なピンとレーン)が早々に枯渇します。
全対全リンク数の増え方(コヒーレント結合)
2ソケット : 1本
4ソケット : 6本
8ソケット : 28本
→ ポート数・配線・スヌープトラフィックが2乗的に圧迫
直接結べないソケットへは他ソケットを経由(マルチホップ)するため、遠いソケットほど遅延が増え、NUMAの距離が階層化します。スヌープフィルタやディレクトリでトラフィックは間引けても、リンクポート数とマルチホップ遅延という物理制約は残ります。これを越えるには、ソケット間を専用のファブリックスイッチ(外部ノードコントローラ)で束ねる非対称トポロジへ移行し、グルーピングして階層化します。だが階層が増えるほど最遠ノードの遅延が伸び、コヒーレンシ維持のコストも上がるため、ある規模からはコヒーレンシを諦めて疎結合クラスタにする方が割に合います。これがスケールアップ(大きな1台)とスケールアウト(多数の小さな台)の分岐点です。
「UPI/Infinity Fabricはソケット間のコヒーレントリンクで物理/リンク/プロトコルの層構造」「スヌープフィルタとディレクトリで不要な問い合わせを間引く」「リモートメモリ遅延=リンク往復+所有権確認で、ローカルの約1.5〜2倍=NUMAの正体」「全対全スヌープはソケット数の2乗で増えるため2〜8ソケットが実用上限」の4点が核心。リモートが遅いのはDRAMでなく経路が理由、という因果を言えると強いです。
まとめ
- UPI/Infinity Fabricはソケット間を結ぶコヒーレントリンクで、物理層・リンク層・プロトコル層を重ね、別ソケットのキャッシュ/メモリまで一貫性を1つのアドレス空間として延ばす。
- 全対全のブロードキャストスヌープは重いため、スヌープフィルタで無駄を省き、ディレクトリで持つ相手にだけ無効化をユニキャストして照会を間引く。応答の往復が増えるぶんMESIに過渡状態やForward状態が足される。
- リモートメモリ遅延は「リンク往復+ディレクトリ/スヌープによる所有権確認」が源で、ローカルの約1.5〜2倍。これがNUMAの距離差の正体であり、ソケット親和な配置が性能を決める。
- コヒーレンシ配線とスヌープはソケット数の2乗で重くなり、リンクポートとマルチホップ遅延が律速になるため2〜8ソケットが実用上限。それ以上はファブリックスイッチや、いっそ疎結合クラスタへ移る。
ソケット内のコア間一貫性はキャッシュメモリの原理とディレクトリ方式コヒーレンシが、書き込み共有が崩れる仕組みはフォルスシェアリングが、観測順序の保証はメモリ一貫性モデルが掘り下げます。
CPU/メモリ/ディスク Article
ソケット間インターコネクトの原理 ─ UPI/Infinity Fabricを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
UPI
比較で見る軸
難易度: advanced / カテゴリ: CPU/メモリ/ディスク / タグ数: 6
導入後に効く点
リモートメモリの遅延は「リンク往復+ディレクトリ/スヌープによる所有権確認」が源で、別ソケットのDRAMはローカルの約1.5〜2倍遅い。これがNUMAの距離差の正体。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- CPU/メモリ/ディスク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「UPI / Infinity Fabric」に近いか確認する。
- 強みである「UPI(Intel)やInfinity Fabric(AMD)はソケット間を結ぶコヒーレントリンクで、物理層・リンク層・プロトコル層を重ね、別ソケットのキャッシュ/メモリまでMESI系の一貫性を1つのアドレス空間として延ばす。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。