TL

DPDK とユーザー空間ネットワーキングの原理

10Gbps超を1コアで捌けるパケット処理が、カーネルを丸ごと外しポーリングで回す設計から実現する理由を原理で押さえられる。巨大ページ・ロックレスリング・CPUピンニング・PMDの噛み合いまで分かる。

応用DPDKカーネルバイパスポーリング巨大ページNFV最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.DPDKはカーネルのネットワークスタックと割り込みをバイパスし、NICをユーザー空間プロセスへ直接マップしてポーリングで回す方式で、割り込み・コピー・システムコール・コンテキストスイッチを排して数千万pps級のパケット処理を1コアで実現する。
  • 2.高速化はPMD(ポーリングモードドライバ)がCPUを100%使ってリングを回し続けること、巨大ページでTLBミスとページフォルトを潰すこと、ロックレスリングでコア間受け渡しのロックを消すこと、CPUピンニングとNUMA局所化でキャッシュとメモリ帯域を守ることの組み合わせで成り立つ。
  • 3.代償はポーリングがアイドル時もコアを焼き続けること、カーネルのプロトコル機能(TCP・ルーティング・iptables等)を自前で用意する必要があること、NICがプロセスに専有されることで、低pps汎用用途より高pps特化用途(仮想スイッチ・NFV・パケット処理基盤)に向く。

なぜカーネルを外すのか

10Gbpsの回線を最小サイズ(64バイト)のフレームで埋めると、毎秒約1480万パケット(14.88Mpps)になります。1パケットあたりに使えるのは約67ナノ秒です。一方、Linuxカーネルの標準的な受信経路では、1パケットごとに割り込み(あるいはソフトIRQ)、skb(ソケットバッファ構造体)の確保、プロトコルスタックの通過、ソケットバッファへのコピー、recvmsg() のシステムコールとコンテキストスイッチが積み上がります。これらの固定コストは合計で容易に数百ナノ秒〜マイクロ秒に達し、67ナノ秒の予算をはるかに超えます。割り込み駆動を緩和する カーネルのパケット受信経路:NAPI と割り込み緩和 でも、スタック通過とコピーの本体コストは残ります。

そこで発想を逆転させたのが DPDK(Data Plane Development Kit) です。「カーネルを速くする」のではなく「カーネルを通さない」。NICをユーザー空間プロセスへ直接マップし、割り込みもプロトコルスタックもシステムコールも使わず、ユーザー空間でNICのリングを直接ポーリングしてパケットを刈り取ります。

バイパスする対象を正確に

DPDKが外すのは(1)割り込み、(2)カーネルのプロトコルスタック(IP・TCP/UDP・netfilter等)、(3)システムコールとカーネル/ユーザー境界のコピーとコンテキストスイッチです。NICのハードウェアそのものは使い続けます。逆に言えば、TCPやARP・ルーティングが欲しければアプリ側(または専用ライブラリ)で実装し直すことになります。

PMD:割り込みをやめてポーリングで回す

DPDKの中核が PMD(Poll Mode Driver, ポーリングモードドライバ) です。割り込みを一切使わず、CPUコアが無限ループでNICの受信リングを rte_eth_rx_burst() のような関数で繰り返し問い合わせ続けます。パケットが届いていればまとめて(バーストで)取り出し、なければ即座に次の周回へ入ります。

/* PMD のメインループ(概念)。専有コアが回し続ける */
while (running) {
    nb = rte_eth_rx_burst(port, queue, bufs, BURST_SIZE); /* リングから一括取得 */
    for (i = 0; i < nb; i++)
        process(bufs[i]);                                  /* 自前で処理 */
}

なぜ割り込みより速いのか。割り込みは「いま走っているコードを止めてハンドラへ飛ぶ」操作で、高pps時には NAPI 記事 で触れたとおり receive livelock を招くほど重い。ポーリングは割り込みのコンテキスト保存・復帰が一切なく、CPUは常にパケット処理だけに専念できます。さらにバースト処理により、関数呼び出しや命令キャッシュのウォームアップといった固定コストを 複数パケットで償却 でき、1パケットあたりのオーバーヘッドが下がります。分岐予測も命令・データキャッシュも、同じ短いループを回し続けることで高いヒット率を保てます。

ポーリングはアイドルでもコアを100%焼く

PMDはパケットが来ていなくてもループを回し続けるため、トラフィックがゼロでも該当コアのCPU使用率は常時100%に見えます。これは異常ではなく設計どおりです。電力効率が問題になる用途では、低負荷時だけ割り込みへ戻す省電力モード(rte_power 等)を併用しますが、基本は「コアを1本まるごと差し出す」前提の方式です。

巨大ページ:TLBミスとページフォルトを潰す

高速処理にはメモリアクセスの安定が不可欠です。仮想アドレスを物理アドレスへ変換する TLB(Translation Lookaside Buffer) はエントリ数が限られ、標準の4KBページでは大きなパケットバッファ領域を歩くだけでTLBミスが頻発し、そのたびにページテーブルを辿る遅延(ページウォーク)が入ります。

DPDKは 巨大ページ(HugePages, 2MBや1GB) 上に全メモリを確保します。1ページが大きいほど同じ領域を少ないエントリでカバーでき、TLBミスが激減します。加えて巨大ページは予約時にメモリへ固定(ピン)され、スワップアウトもpage faultも起きません。リアルタイムにパケットを処理する経路では、突発的なページフォルトによる遅延スパイクが致命的なので、これを構造的に排除する意味は大きい。

DPDKはこの巨大ページ上に独自のメモリアロケータ(rte_malloc/mempool)を構築します。mempool はパケットバッファ(mbuf)を事前確保した固定長プールで、ホットパスでは malloc/free を呼ばず、プールから借りて返すだけにします。プールはコアごとのローカルキャッシュを持ち、確保・解放の大半をコア内で完結させてコア間競合を避けます。

ロックレスリング:コア間受け渡しからロックを消す

複数コアでパイプラインを組むと、あるコアが処理したパケットを次のコアへ渡す必要があります。ここで普通のロック(mutex/spinlock)を使うと、競合時のキャッシュライン奪い合いとスピンで遅延が跳ねます。

DPDKの rte_ring はロックを使わない ロックレスなリングバッファ です。固定長の環状配列に対し、生産者・消費者がそれぞれ head/tail ポインタを CAS(Compare-And-Swap) などのアトミック命令で進めます。単一生産者・単一消費者(SPSC)構成なら、生産者と消費者がそれぞれ別のポインタしか触らないため、アトミック命令すら最小化でき、ほぼメモリバリアだけで安全に受け渡せます。これによりロック取得のシステムコールもスリープも発生せず、コア間の受け渡しが定数時間で済みます。

要素解決する遅延要因効く理由
PMD(ポーリング)割り込み・コンテキストスイッチ中断なしで処理に専念しバーストで償却
巨大ページTLBミス・ページフォルト少ないTLBエントリで広域を覆い固定で常駐
rte_ringロック競合・スピンCAS/SPSCでロック取得そのものを排除
mempoolmalloc/free のロック事前確保プールとコアローカルキャッシュ

CPUピンニングとNUMA局所性

最後の鍵が CPUピンニング(コア固定) です。PMDが回るスレッドを特定の物理コアへ固定(アフィニティ設定)し、そのコアをOSスケジューラの対象から外します(isolcpus 等でカーネルに割り当てない)。これにより、(1)他タスクに割り込まれてキャッシュを汚されない、(2)コア間を移動してL1/L2キャッシュを冷やさない、(3)スケジューラのプリエンプションによる遅延ジッタが消える、という三つを同時に達成します。

さらに NUMA(Non-Uniform Memory Access) の局所性が効きます。マルチソケット機では、各CPUに直結したメモリ(ローカルノード)へのアクセスは速く、別CPU配下のメモリ(リモートノード)はインターコネクト越しで遅い。DPDKはNICが接続されたPCIeスロットに対応するNUMAノード上にバッファとリングを確保し、そのノードのコアでPMDを回します。NIC・メモリ・処理コアを同一NUMAノードに揃えることで、リモートアクセスとインターコネクトの帯域消費を避け、レイテンシのばらつきを抑えます。コア間でキャッシュやメモリ局所性を保つ狙いは、ソケットバッファとゼロコピー送受信 でコピー回数を削る発想と地続きです。

VFIO/UIOでNICをカーネルから引き剥がす

DPDKでNICを使うには、カーネルのドライバからデバイスを切り離し、vfio-pci(IOMMUで保護)や uio を通してユーザー空間へマップし直します。IOMMUがあればDMAアドレスがプロセス空間に限定され、誤ったメモリ破壊から守られます。引き剥がしたNICはそのDPDKプロセスに専有され、カーネルからは見えなくなる点に注意してください。

何を捨て、どこで使うか

DPDKの速さは「カーネルが肩代わりしていた一切を自前で背負う」ことの裏返しです。TCPの再送・順序制御、ARP、ルーティング、ファイアウォール(netfilter)、tcpdump での観測、ソケットAPIといった資産はすべて使えなくなり、必要ならアプリ側やユーザー空間TCPスタック(VPP/F-Stack等)で再実装します。NICは専有され、アイドル時もコアを焼き続けます。

汎用・低〜中pps      → カーネルスタック(NAPI/GRO/XDP)で十分・運用が楽
高pps・特化・専有可  → DPDK(仮想スイッチ OVS-DPDK / NFV / パケット生成・計測 / L4LB)

つまりDPDKは万能の高速化ではなく、14.88Mppsを1コアで線形に捌くような極端なデータプレーンに特化した道具です。仮想スイッチ(OVS-DPDK)、NFV、ファイアウォールやロードバランサのデータプレーン、トラフィックジェネレータなどが典型です。同じ「カーネルを介さず低遅延で運ぶ」系統として、RNICがメモリへ直接読み書きする RDMA と RoCE:カーネルバイパス転送の原理 があり、DPDKがCPUでパケットを回すのに対しRDMAはNICが転送を肩代わりする、という分業の違いを押さえると全体像が立体的になります。

試験・面接で問われる急所

「DPDKが速い理由」→ 割り込み・カーネルスタック・コピー・システムコールを排し、PMDがポーリングでバースト処理するため。「巨大ページの役割」→ TLBミスとページフォルトを潰し遅延を安定させる。「ロックレスリング」→ rte_ringがCAS/SPSCでロック競合を排し定数時間でコア間受け渡し。「CPUピンニング+NUMA」→ コア固定でキャッシュとジッタを守り、NIC・メモリ・コアを同一NUMAノードに揃える。「代償」→ ポーリングがコアを常時100%消費し、カーネルのプロトコル機能を自前実装、NICを専有。

まとめ

DPDKは「カーネルを速くする」のではなく「カーネルを通さない」ことで高速化します。NICをユーザー空間へマップし、PMDが割り込みを使わずポーリングでリングを回してパケットをバースト処理することで、割り込み・コピー・システムコール・コンテキストスイッチの固定コストを丸ごと排します。巨大ページがTLBミスとページフォルトを潰して遅延を安定させ、ロックレスな rte_ring と mempool がコア間のロック競合を消し、CPUピンニングとNUMA局所化がキャッシュとメモリ帯域を守る——この四つが噛み合って、64バイト最小フレームの14.88Mppsを1コアで線形に捌く性能が出ます。代償としてポーリングがコアを常時焼き、カーネルのプロトコル機能を自前で背負い、NICを専有するため、汎用用途ではなく仮想スイッチ・NFV・パケット処理基盤といった高pps特化のデータプレーンに向く、という棲み分けが本質です。

ネットワーク Article

DPDK とユーザー空間ネットワーキングの原理を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

DPDK

比較で見る軸

難易度: advanced / カテゴリ: ネットワーク / タグ数: 5

導入後に効く点

高速化はPMD(ポーリングモードドライバ)がCPUを100%使ってリングを回し続けること、巨大ページでTLBミスとページフォルトを潰すこと、ロックレスリングでコア間受け渡しのロックを消すこと、CPUピンニングとNUMA局所化でキャッシュとメモリ帯域を守ることの組み合わせで成り立つ。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
ネットワーク
タグ数
5

判断チェックリスト

  • 自社の用途が「DPDK / カーネルバイパス」に近いか確認する。
  • 強みである「DPDKはカーネルのネットワークスタックと割り込みをバイパスし、NICをユーザー空間プロセスへ直接マップしてポーリングで回す方式で、割り込み・コピー・システムコール・コンテキストスイッチを排して数千万pps級のパケット処理を1コアで実現する。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

DPDKカーネルバイパスポーリング巨大ページNFVDPDKカーネルバイパスポーリング