現在位置: ホーム / みらくるブログ / #10 VFIO (No-IOMMU mode)でDPDKを使う

#10 VFIO (No-IOMMU mode)でDPDKを使う

第9回で説明したVFIOを使うにはホストマシンがIOMMUをサポートしている必要があります。一方、igb_uioは、カーネルがバージョンアップするたびに再ビルドが必要になります。VFIOドライバのNo-IOMMUモードを使うと、IOMMUを持たないマシンでも、カーネル標準のドライバを使って、DPDKを動作できます。今回はその方法を説明します。

はじめに

第9回では、vfioドライバを使ってDPDKを動作させる方法を説明しました。vfioドライバはIOMMU機能を持たないシステムでは利用できません。vfioドライにはNo-IOMMUモードというのがあり、こちらのモードではIOMMUがなくても利用できます。この場合、デバイスのメモリアクセス制限は出来ませんが、カーネルの標準付属ドライバが利用可能というメリットはあります。

設定方法

今回もホストは第9回で使ったものと同じですが、IOMMUを使うためのカーネルオプション(iommu=pt intel_iommu=on)が使用されておらず、vfio, vfio-pciドライバがロードされていないことを前提に説明を進めます。

まず、次のオプションをつけてvfioモジュールをロードします。

# modprobe vfio enable_unsafe_noiommu_mode=1
# modprobe vfio-pci

その後、通常のvfioドライバ使用時と同じく、以下のようにバインドします。

# dpdk-devbind -b vfio-spci 0s000:01:00.0 0000:01:00.1

この時、No-IOMMUが有効であれば、以下のカーネルメッセージが表示されます。

# dmesg  | grep noiommu
[  295.515720] vfio-pci 0000:01:00.0: Adding kernel taint for vfio-noiommu group on device
[  295.842702] vfio-pci 0000:01:00.1: Adding kernel taint for vfio-noiommu group on device

そのあとは、通常どおりtestpmdなどを使用できます。ただし、水色で示したようにNo-IOMMUという文字列が表示されます。

# testpmd -- -i --nb-cores=2
EAL: Detected 8 lcore(s)
EAL: Probing VFIO support...
EAL: VFIO support initialized
EAL: PCI device 0000:01:00.0 on NUMA socket -1
EAL:   probe driver: 8086:1528 net_ixgbe
EAL:   using IOMMU type 8 (No-IOMMU)
EAL: PCI device 0000:01:00.1 on NUMA socket -1
EAL:   probe driver: 8086:1528 net_ixgbe
(略)

こちらのモードでもスループットを計測しましたが、他のドライバを使った場合とほぼ同じでした。セットアップは第9の構成と同じです。

パケット
サイズ(B)

vfio
No-IOMMU
(Mbps)

vfio
(#9より)

igb_uio
(#5より)

64 15.4 15.6 15.5
128 19.5 19.5 19.4
256 20.0 20.0 20.0

付録:vfioドライバ(No-IOMMUモード)の起動時の自動ロード

上記では、手動でvfioドライバをロードしました。この構成を継続して利用するなら、起動時に自動でロードされると便利です。そのためには、/etc/sysconfig/modules/vfio-noiommu.modulesを作成し、以下のとおり記述します。

#!/bin/sh
modprobe vfio enable_unsafe_noiommu_mode=1
modprobe vfio-pci

また、実行権限を付与しておきます。

# chmod +x /etc/sysconfig/modules/vfio-noiommu.modules