カーネルを利用したパケット受信の処理イメージを下図に示します。この場合、割込みやカーネル空間からユーザ空間へのパケット引き渡し等のオーバーヘッドが発生し、アプリケーションのパケット処理性能に影響を及ぼしてしまいます。
一方、DPDKアプリケーションでパケット処理を実現する場合、下図のようにNICに対して常にポーリングでパケット受信を監視する形をとり、パケット自体もNICのキューから直接ユーザ空間(Hugepage)に移すため、オーバーヘッドなくすぐにパケット処理を実施することができます。
PMDに関して詳しく知りたい人は、DPDKの公式ページ(※2)にも記載がありますのでご覧下さい。
実際のNICは様々な種類がありますが、NICに対応したデバイスドライバも複数の種類があります。例えばIntel社のNICでいうと、PCI Express Gigabit Ethernet用のデバイスドライバであるIGB(※3)や、PCI 10Gb 用のデバイスドライバであるIXGBE(※4)があります。通常はカーネルがNICの種類に応じたデバイスドライバを利用するため、開発者がパケット処理を行うアプリケーションを実装する際は、システムコールを介してNICの種類を意識することなくプログラミングすることができます。DPDKでも同様に、DPDKライブラリ側がNICの種類に応じた専用のPMDを割り当ててくれるため、開発者はDPDKが用意している専用のパケット処理用APIを利用することで、NICの種類を意識することなくプログラミングすることができます。
DPDKではシステムコールを介せずにパケット処理を実施することで、高速なパケット処理を実現しています。その仕組みはDPDK特有の内容になるため、この考え方を理解することが重要です。
※2 Poll Mode Driver https://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html
※3 IGB Manual Pages https://nxmnpg.lemoda.net/4/igb
※4 IXGBE Manual Pages https://nxmnpg.lemoda.net/4/ixgbe