PFC と DCQCN:ロスレスイーサネットの輻輳制御
RoCE が要求する「パケットを落とさない網」を、PFC のバックプレッシャと DCQCN のレート制御でどう作るかが原理から分かる。デッドロックや PFC ストームという落とし穴の生まれ方まで押さえられる。
- 1.PFC(IEEE 802.1Qbb)は優先度クラスごとに PAUSE フレームで上流を止め、バッファ溢れによる廃棄をなくす。停止はホップ単位のバックプレッシャで、トランスポートではなくリンク層の機構。
- 2.PFC は循環バッファ依存による永続デッドロック、PAUSE の連鎖伝播(PFC ストーム)、無関係フローまで巻き込む HOL ブロッキングを生む。だから常用ではなく最後の保険として使う。
- 3.DCQCN は ECN マークを起点に CNP で送信元へ通知し、DC-QCN のレート制御(速い減速・段階的な増速)でフロー単位に送出量を絞る。PFC が発火する前に混雑を解消するのが設計思想。
ロスレスはなぜ必要か:RoCE が課す前提
RDMA と RoCE で見たとおり、RoCEv2 のトランスポート(InfiniBand 由来)は TCP の CUBIC/BBR のような洗練された損失回復を持ちません。古典的な実装は go-back-N 的で、1パケットの欠落が以降のまとめ再送を招き、スループットが崖のように落ちます。つまり RoCE が高性能を出す条件は そもそもスイッチがパケットを廃棄しないこと、すなわち ロスレスイーサネット です。
通常のイーサネットスイッチは出力バッファが溢れれば容赦なく廃棄します(テールドロップ)。これを「廃棄ではなく送出を止める」方式に置き換えるのが PFC で、止めきれない混雑をエンドツーエンドで先回りして解消するのが DCQCN です。両者は層も粒度も役割も異なり、組み合わせて初めてロスレス網が成立します。
PFC:優先度別の PAUSE バックプレッシャ
PFC(Priority Flow Control, IEEE 802.1Qbb) は、古いリンク全体を止める 802.3x PAUSE を 8つの優先度クラス(PCP 値 0〜7)ごとに独立して止められる ように拡張したものです。あるクラスの入力バッファが上側閾値(XOFF 水位)に達すると、スイッチは上流ポートへ PFC フレームを送り、そのクラスだけ送出を一時停止させます。下側閾値(XON 水位)まで掃けたら再開を促します。
下流スイッチ: 入力キュー(優先度3)が XOFF 水位に到達
── PFC PAUSE(class=3, quanta=N) ──▶ 上流スイッチ
上流スイッチ: 優先度3のフレーム送出を停止(他クラスは流し続ける)
下流スイッチ: キューが XON 水位まで掃けたら送出再開を許可
ポイントは2つ。第一に、PFC は リンク層(ホップ単位)のバックプレッシャ で、隣接スイッチ間の1ホップを止めるだけです。混雑が解けなければ停止は上流へ、さらにその上流へと 連鎖 します。第二に、止めるのは廃棄しないためであり、バッファに「先回りの余白」が要る。PAUSE を出してから上流が止まるまでに、ケーブル長ぶんの伝搬遅延と既に線路上を飛んでいるフレームが届きます。この インフライト分を吸収できるヘッドルーム を XOFF 水位の上に確保しておかないと、PAUSE を出した後にバッファが溢れて結局廃棄します。リンクが長い・速いほどヘッドルームは増えます。
全トラフィックを一律に止めると、RoCE と通常 TCP が同じリンクで殴り合います。PFC はクラスを分け、RoCE を載せた優先度だけをロスレス扱い(PFC 有効)にし、TCP など損失耐性のあるトラフィックは従来どおり廃棄ベースで流すのが定石です。RoCE 用クラスの DSCP/PCP マッピングを揃える設計は QoS(CoS/DSCP) の知識がそのまま効きます。
PFC の副作用:HOL ブロッキング・ストーム・デッドロック
PFC は「廃棄をなくす」代わりに、廃棄が担っていた 暗黙の輻輳解消 を失います。その歪みが3つの病理として現れます。
| 副作用 | 発生機序 | 影響 |
|---|---|---|
| HOL ブロッキング | PAUSE はクラス単位のため、同じ優先度の無関係フローも巻き添えで止まる | 混雑の犯人でないフローまで遅延・スループット低下 |
| PFC ストーム | 1点の混雑やバグ・ループで PAUSE が上流へ連鎖伝播し広範囲が停止 | 網全体が固まり、被害が震源から遠方まで拡大 |
| PFC デッドロック | 複数スイッチの停止依存が循環し、互いの解除を永久に待つ | PAUSE が永続化し該当クラスの通信が完全停止 |
HOL ブロッキング は、PFC が個別フローではなく優先度クラス全体を止めることから生じます。出力が詰まった1フローのために PAUSE が出ると、同クラスを共有する無関係なフローまで上流で堰き止められます。
PFC ストーム は、ある1点の停止が PAUSE を上流へ送り、上流もバッファが埋まって更に上流へ PAUSE を出す、という伝播が広域に及ぶ現象です。NIC のバグや L2 ループで PAUSE が止まらなくなると、震源から遠いリンクまで巻き込まれて網が固まります。
最も厄介なのが PFC デッドロック です。Clos/Fat-Tree のような多段網で、リンク障害後の経路迂回などにより一時的にトラフィックが循環経路を取ると、スイッチ A は B の解除を待ち、B は C を、C は A を待つ——という 循環バッファ依存(cyclic buffer dependency, CBD) が成立し得ます。テールドロップなら廃棄が依存を断ち切りますが、ロスレスでは廃棄しないため、誰も先に進めず PAUSE が 永久に解除されません。トラフィックが消えてもデッドロックは自然回復しないのが本質的な怖さです。
通常の輻輳は送信を止めれば解消しますが、PFC デッドロックは循環した停止依存そのものが原因なので、負荷が引いても残ります。対策はトポロジ側で循環を作らせない経路設計(例:上り→下りの順序を強制する up/down ルーティング)や、デッドロック検出時に該当キューを一時的に廃棄モードへ落として依存を断つ実装的緩和です。「ロスレスは廃棄ゼロが目的だが、デッドロック脱出にはあえて廃棄が要る」という逆説が要点です。
DCQCN:ECN で PFC が出る前に絞る
副作用の根は「PFC を常用していること」にあります。理想は PFC が一度も発火しないうちにエンドツーエンドでレートを下げ切る こと。これを担うのが DCQCN(Data Center Quantized Congestion Notification) で、ECN を信号源にしたフロー単位のレート制御です。ECN そのものの仕組みは ECN(明示的輻輳通知)と L4S に譲り、ここでは DCQCN の制御ループを見ます。
DCQCN は3つの役者で回ります。
1. CP(Congestion Point=スイッチ):
出力キュー長が閾値を超え始めると、RED/ECN で確率的に
パケットへ CE マーク(ECN=11)を付ける(廃棄しない)
2. NP(Notification Point=受信 RNIC):
CE マーク付き到着を検出すると、送信元へ
CNP(Congestion Notification Packet)を返す
3. RP(Reaction Point=送信 RNIC):
CNP を受けると送出レートを乗算的に下げる(速い減速)。
CNP が来ない間は段階的にレートを戻す(加法増→超加法増)
CP の閾値(K_min/K_max とマーク率)は PFC の XOFF 水位より手前 に置きます。こうするとキューが浅いうちに CE マークが立ち、送信側が減速するため、バッファが PFC 発火水位に達する前に混雑が収束します。RP のレート調整は AIMD 的ですが、CNP 駆動で減速は速く、回復は段階的(加法増のあと超加法増で本来レートへ近づく)という非対称な形です。輻輳制御の増減バランスという一般原理は AIMD の数理 と地続きで、DCQCN はそれをハードウェア RNIC 上で ECN シグナルに対して回している、と捉えると見通しが立ちます。
DCQCN の効きが遅い(CNP の往復遅延ぶん減速が間に合わない)と、その隙にキューが伸びて PFC が発火します。逆に ECN 閾値を低くしすぎると過剰減速でスループットが出ません。両者は「PFC が出る前に DCQCN が絞り切る」よう水位を協調させる必要があり、ECN 閾値・PFC ヘッドルーム・CNP 生成間隔・レート回復速度が相互に絡みます。RoCE 運用の難所がここに集約されます。
役割分担:保険と主制御
PFC と DCQCN は対立物ではなく 層の違う二段構え です。整理すると次のとおりです。
| 機構 | 層/粒度 | 反応の速さ | 役割 |
|---|---|---|---|
| PFC | L2・優先度クラス/ホップ単位 | 即時(隣接1ホップ) | 廃棄を止める最後の保険 |
| DCQCN | L3・フロー単位/エンドツーエンド | CNP 往復ぶん遅い | 混雑前に送出レートを絞る主制御 |
PFC は反応が即時だが粗く副作用が大きい——だから常用しない。DCQCN は粒度が細かく副作用が小さいが、CNP の往復ぶん反応が遅い——だから取りこぼしを PFC で受ける。DCQCN を主制御、PFC を保険 と位置づけ、保険が発火しない範囲に DCQCN を効かせるのが、ロスレス RoCE 網の設計指針です。
「PFC とは」→ IEEE 802.1Qbb、優先度クラスごとに PAUSE で上流を止め廃棄をなくすホップ単位のバックプレッシャ。「ヘッドルームが要る理由」→ PAUSE 送出後もインフライトのフレームが届くため、その吸収余白が必要。「PFC の3大副作用」→ HOL ブロッキング・PFC ストーム・PFC デッドロック(循環バッファ依存、トラフィックが消えても解けない)。「DCQCN とは」→ CP の ECN マーク→NP の CNP→RP のレート制御という ECN ベースのフロー単位輻輳制御で、PFC 発火前に絞り切るのが狙い。
まとめ
RoCE は損失に弱いため、スイッチが廃棄しないロスレスイーサネットを前提とします。PFC は優先度クラスごとに PAUSE で上流を止めてバッファ溢れの廃棄を防ぎますが、HOL ブロッキング・PFC ストーム・そしてトラフィックが消えても解けない PFC デッドロックという深刻な副作用を持ち、常用には向きません。そこで DCQCN が、スイッチの ECN マークを起点に CNP で送信元へ通知し、RNIC のレート制御で PFC が発火する手前 にフロー単位で送出を絞ります。PFC は即時だが粗い最後の保険、DCQCN は細かいが反応の遅い主制御——両者の水位を協調させ「PFC を出さずに DCQCN で抑える」ことが、ロスレス RoCE 網を安定させる核心です。
ネットワーク Article
PFC と DCQCN:ロスレスイーサネットの輻輳制御を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
PFC
比較で見る軸
難易度: advanced / カテゴリ: ネットワーク / タグ数: 6
導入後に効く点
PFC は循環バッファ依存による永続デッドロック、PAUSE の連鎖伝播(PFC ストーム)、無関係フローまで巻き込む HOL ブロッキングを生む。だから常用ではなく最後の保険として使う。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ネットワーク
- タグ数
- 6
判断チェックリスト
- 自社の用途が「PFC / DCQCN」に近いか確認する。
- 強みである「PFC(IEEE 802.1Qbb)は優先度クラスごとに PAUSE フレームで上流を止め、バッファ溢れによる廃棄をなくす。停止はホップ単位のバックプレッシャで、トランスポートではなくリンク層の機構。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。