DPDK という言葉は、ネットワーク仮想化、NFV、5G、CNF、SR-IOV、VPP などの文脈でよく出てきます。よくある説明では、DPDK は「パケット処理を高速化する技術」と言われます。
この説明は間違いではありません。しかし、それだけでは DPDK の本質は見えにくいです。DPDK を理解するうえで重要なのは、単に速いか遅いかではありません。見るべきポイントは、パケットをどこで処理するのかです。
通常の Linux では、NIC に届いたパケットは Linux カーネルのネットワークスタックで処理されます。一方、DPDK では Linux カーネルの通常のネットワークスタックを経由せず、ユーザー空間のアプリケーションが NIC からパケットを直接扱います。
通常の Linux ネットワーク処理
まず、通常の Linux ネットワーク処理を考えます。Linux サーバーに NIC があり、そこにパケットが届くと、そのパケットは NIC driver を通じて Linux カーネルに渡されます。Linux カーネルはネットワークスタックの中でパケットを処理します。
- Ethernet frame の受信
- IP header の処理
- routing 判断
- TCP / UDP 処理
- firewall 処理
- socket を通じたアプリケーションへの受け渡し
この仕組みは非常に汎用的です。IP アドレス設定、routing table、iptables / nftables、tcpdump、bonding、VRF、namespace など、多くの機能が Linux カーネルのネットワークスタックを前提に作られています。
一般的なサーバー用途であれば、この仕組みで十分です。Web サーバー、DB サーバー、管理サーバー、監視サーバー、一般的な業務システムでは、Linux カーネルのネットワークスタックを使う方が自然であり、運用もしやすくなります。
Linux カーネル経由の何が重いのか
Linux カーネルのネットワークスタックは汎用的です。汎用的であるということは、多くの用途に対応できるということです。一方で、特定の目的だけに最適化された処理ではありません。
通常の Linux ネットワーク処理では、パケットを受信するたびに、割り込み、コンテキストスイッチ、メモリコピー、カーネル空間とユーザー空間の間の受け渡し、汎用的なプロトコル処理などが発生します。
Linux 側にも NAPI、GRO、GSO、TSO、RSS、XDP などの性能改善の仕組みはあります。それでも、100Gbps 級のパケット処理や、パケット単位で極めて低い遅延が求められる処理では、通常のカーネル経由モデルでは限界が見えやすくなります。
DPDK は何をするのか
DPDK は Data Plane Development Kit の略です。名前の通り、data plane を作るための開発キットです。ここでいう data plane とは、実際にパケットを受信し、判断し、転送し、破棄し、加工する処理部分のことです。
| 処理モデル | パケットの流れ |
|---|---|
| 通常の Linux | NIC → Linux カーネル → socket → アプリケーション |
| DPDK | NIC → DPDK → ユーザー空間アプリケーション |
DPDK を使うと、ユーザー空間のアプリケーションが NIC の受信キューや送信キューを直接扱う構成を取れます。かなり単純化して言えば、DPDK は Linux カーネルの通常ネットワークスタックを迂回します。
これにより、パケット処理のオーバーヘッドを減らし、高速な data plane 処理を実現しやすくします。この文脈では、DPDK は kernel bypass の代表的な選択肢として語られます。ただし、迂回するということは、Linux カーネルが提供していた汎用性や運用性の一部も手放すということです。
Poll Mode Driver という考え方
DPDK の特徴的な仕組みに Poll Mode Driver があります。通常の NIC 処理では、パケットが到着すると割り込みが発生し、CPU が処理を開始します。一般的な処理としては自然ですが、高速なパケット処理では、パケットが大量に到着します。
そのたびに割り込みを発生させると、割り込み処理そのものが負荷になります。そこで DPDK では、割り込みではなく polling を使います。専用の CPU core が NIC の queue を継続的に見に行き、パケットがあれば処理します。
この方式では CPU core を消費します。何もパケットが来ていないときでも polling し続けるため、CPU 使用率は高く見えることがあります。しかし、大量のパケットを継続的に処理する場面では、割り込み駆動よりも安定して高い性能を出しやすくなります。
DPDK は CPU 使用率を下げるための技術ではありません。むしろ、CPU core を明示的に使い切ることで、安定した高速パケット処理を実現する技術です。
DPDK で得られるもの
DPDK を使うことで得られる主な利点は、パケット処理性能です。Linux カーネルの通常ネットワークスタックを経由しないため、パケット処理におけるオーバーヘッドを減らせます。
- 大量の小さいパケットを処理する
- 高い pps が必要
- 低遅延が重要
- 仮想ルーターや仮想スイッチを作る
- NFV / CNF の data plane を作る
- ユーザー空間でパケット処理ロジックを制御したい
ここで重要なのは、帯域だけではなく pps です。ネットワーク性能の話では Gbps だけが見られがちですが、実際には packet size によって負荷は大きく変わります。大きなパケットを少数処理するのと、小さなパケットを大量に処理するのでは、CPU にかかる負荷は異なります。
DPDK で失うもの
DPDK を使うと、Linux カーネルの通常ネットワークスタックを迂回します。つまり、Linux カーネルが提供していた便利な機能を、そのまま使えなくなる場合があります。
| 通常の Linux で見やすいもの | DPDK で注意が必要な理由 |
|---|---|
| ip addr / ip route | DPDK アプリケーションが扱う packet path と一致しないことがある |
| tcpdump | カーネルを通らない packet は通常の位置では見えないことがある |
| iptables / nftables | DPDK 側の packet は Linux firewall を通らないことがある |
| ss / netstat | socket 経由ではない処理は見え方が変わる |
| OS 標準の統計 | DPDK アプリケーション側の統計やログが必要になる |
これは運用上かなり大きいです。Linux の世界では、インターフェイスを見れば状態が分かり、routing table を見れば経路が分かり、tcpdump をすれば packet が見える、という前提があります。DPDK でユーザー空間に処理を移した場合、この前提は崩れることがあります。
HugePages が必要になる理由
DPDK の話では HugePages もよく出てきます。HugePages は、大きなメモリページを使う仕組みです。DPDK では、大量の packet buffer を高速に扱う必要があります。
DPDK では packet buffer を効率よく扱うために、mbuf という構造体が使われます。mbuf は mempool と呼ばれるメモリプールから確保されます。パケットごとに毎回 OS へメモリ確保を依頼するのではなく、あらかじめ用意されたメモリプールから buffer を取り出し、処理が終わったら再利用します。
HugePages は、DPDK が大量の mbuf を mempool で効率よく管理し、高速なパケット処理を行うための土台です。HugePages だけを設定しても DPDK 構成になるわけではありませんが、DPDK の data plane を安定させるうえで重要な前提になります。
CPU core を専有するという考え方
DPDK では CPU core の扱いも重要です。通常のアプリケーションでは OS scheduler が CPU time を割り当てます。しかし DPDK のような高速パケット処理では、専用の CPU core を割り当てることが多くなります。
- CPU pinning
- core isolation
- NIC queue と CPU core の対応
- NUMA locality
- HugePages の NUMA 配置
NUMA とは、CPU、メモリ、PCIe デバイスの物理的な近さを意識する考え方です。DPDK のように CPU、メモリ、NIC を高頻度で使う処理では、この距離が性能に影響します。NIC に近い CPU core を使い、その CPU に近いメモリ上に HugePages を確保する、といった配置が重要になります。
DPDK はどこで使われるのか
DPDK は、一般的な Web アプリケーションや業務システムで直接使うものではありません。主に、ネットワーク機能そのものをソフトウェアで実装する場面で使われます。
- 仮想ルーター
- 仮想スイッチ
- 仮想 firewall
- load balancer
- packet 処理基盤
- NFV / CNF
- 通信キャリア向け user plane 処理
- 高性能な packet capture / 解析基盤
共通しているのは、アプリケーションがネットワークを使う側ではなく、ネットワーク機能を提供する側になっている点です。通常の業務アプリケーションはネットワークを利用します。一方、DPDK を使うアプリケーションはネットワークそのものを処理します。
DPDK は常に必要なのか
DPDK は強力な技術ですが、常に必要なわけではありません。通常の Linux ネットワークスタックで十分な性能が出るなら、DPDK を使う必要はありません。むしろ、安易に DPDK を使うと運用性が下がります。
DPDK を使うべきなのは、通常の Linux ネットワークスタックでは性能要件を満たせない場合です。高い pps、低遅延、data plane 処理の細かい制御、仮想ネットワーク機能の高性能実装といった要件がある場合に、DPDK の意味が出てきます。
逆に、普通のサーバー通信、管理通信、一般的な業務アプリケーションであれば、Linux カーネルのネットワークスタックを使う方が合理的です。DPDK は何でも速くする万能薬ではなく、使うべき場所を選ぶ技術です。
まとめ
DPDK を理解するときに重要なのは、「高速化」という言葉だけで理解しないことです。DPDK は、パケット処理の場所を Linux カーネルからユーザー空間へ移す技術です。
その結果、高いパケット処理性能や低遅延を実現しやすくなります。一方で、Linux が持っていた汎用的なネットワーク機能や運用性を、そのまま使えなくなる場面も出てきます。
DPDK を使うということは、Linux カーネルが提供していた汎用性、運用性、可観測性の一部を手放すということでもあります。その代わりに、CPU、メモリ、NIC、NUMA、アプリケーション設計を明示的に制御することで、高い packet 処理性能を得ます。
だから DPDK を使うかどうかは、単に速そうだからでは判断できません。通常の Linux ネットワークスタックでは要件を満たせないのか。ユーザー空間で packet 処理を持つだけの理由があるのか。そこから考えるべきです。
書籍
ハイパーバイザ、CPU 仮想化支援、メモリ仮想化、割り込み、仮想デバイスなど、VM の性能設計を低レイヤから理解したい場合の参考書籍です。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。


