#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 |
vfio |
igb_uio |
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