DPDKによる高性能パケット処理の最適化技法

現代のネットワーク環境において、データプレーンの処理性能はアプリケーションのスループットとレイテンシに直結する。Data Plane Development Kit(DPDK)は、カーネルをバイパスしユーザー空間で直接NICとやり取りすることで、極めて高いパケット処理性能を実現するフレームワークである。本稿では、sdn-handbookプロジェクトに基づき、DPDKの性能を引き出すための核心的な最適化技術を解説する。

アーキテクチャとボトルネックの理解

従来のLinuxネットワークスタックは、割り込み処理、カーネル・ユーザー間のメモリコピー、プロトコルスタックのオーバヘッドなどによりスループットが制限される。DPDKはPoll Mode Driver(PMD)を採用し、これらの問題を回避。DMA転送により事前に確保したユーザー空間バッファへ直接パケットを書き込むことで、ゼロコピーかつ低遅延な処理を可能にする。

メモリサブシステムの最適化

TLBミスを削減するため、DPDKはHugePage(通常2MBまたは1GB)を活用する。これにより仮想→物理アドレス変換のコストが大幅に低下し、10~15%の性能向上が見込める。NUMA対応システムでは、各ノードにローカルなHugePageを確保することが重要である:

# NUMAノード0に2MB HugePageを1024ページ確保
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

さらに、メモリプール(rte_mempool)の作成時にMEMPOOL_F_POOL_PHYS_CONTIGフラグやNUMA-awareなアロケータを使用することで、キャッシュ効率と帯域利用を最大化できる。

CPUリソースの効率的活用

DPDKアプリケーションは特定のCPUコアにスレッドをピン留め(CPU affinity)し、コンテキストスイッチやキャッシュフラッシュを回避する。起動時にカーネルパラメータでコアを隔離するのが一般的である:

default_hugepagesz=1G hugepagesz=1G hugepages=32 isolcpus=domain,managed_irq,1-7

また、コア間通信にはロックフリーのリングバッファ(rte_ring)を採用。MPSC(Multi-Producer Single-Consumer)やSPMCなどのモードを用途に応じて選択することで、同期オーバヘッドを最小限に抑える。

NICハードウェアの最大活用

マルチキューNICでは、RSS(Receive Side Scaling)を有効化し、フロー単位で複数のRXキューに分散させる。ハッシュ関数は通常(src_ip, dst_ip, src_port, dst_port)の4-tupleに基づく。DPDKでは以下のようにキュー数とRSS設定を行う:

struct rte_eth_conf port_conf = {
    .rxmode = { .mq_mode = ETH_MQ_RX_RSS },
    .rx_adv_conf.rss_conf = {
        .rss_key = NULL,
        .rss_hf = ETH_RSS_IP | ETH_RSS_TCP | ETH_RSS_UDP
    }
};

さらに、チェックサムオフロード、TSO(TCP Segmentation Offload)、LRO/RSCなどのハードウェア機能を有効にすることで、CPU負荷を大幅に軽減できる。

転送モデルとルックアップ最適化

DPDKでは主に2つの転送モデルが利用される:

  • Run-to-Completion:1パケットを1コアで完結処理。シンプルだがコア間負荷偏りが発生しやすい。
  • Pipeline:入力・処理・出力といったステージを分離し、複数コアで並列処理。スループット向上に有効。

ルーティングテーブル検索にはLongest Prefix Match(LPM)アルゴリズムが標準提供される。これは階層的なビットマップ構造を用い、/24以下のプレフィックスなら1回のメモリアクセスでネクストホップを決定可能。大規模ルートでも高効率を維持する。

実践的なチューニングポイント

以下は性能に大きく影響する主要パラメータの一例である:

  • rx_desc:受信ディスクリプタ数。10G以上では512~1024推奨。
  • tx_rs_thresh:TX完了報告の閾値。小さすぎるとPCIeトラフィック増加。
  • rx_free_thresh:バッファ再補充のしきい値。過剰なMMIOアクセスを抑制。

性能検証にはtestpmdが有用。例えばVLANタグ処理を有効化するには:

testpmd> vlan set strip on 0
testpmd> start

これにより、実際のトラフィック条件下でのスループットやドロップ率を定量評価できる。

【参考資料】sdn-handbook SDNマニュアル(無料公開)

タグ: DPDK sdn NUMA HugePage RSS

7月17日 22:10 投稿