DPDK を使用する環境の構築を行います。
- Infrastracture: VMWare Workstation 12 Pro
- OS: Ubuntu 18.04
- vCPU: 4 core
- vRAM: 4 GB
vmx ファイルを編集し、DPDKを適用させるNICの Driver Type を vmxnet3 にします。
...
ethernetX.virtualDev = "vmxnet3"
...
パッケージをインストールします。
apt install -y linux-base gcc make python xz-utils open-vm-tools
パッケージを更新します。
apt update -y
パケットの転送を許可します。
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/10-ip_forward.conf
カーネルのバージョンを固定します
apt-mark hold linux-image-generic linux-headers-generic
一度再起動して更新を反映します。
reboot
ビルドに必要なパッケージをインストールします。
apt install -y libpcap-dev libnuma-dev
DPDKのバージョンを指定します。
DPDK_VERSION=17.11.3
ソースを公式サイトからダウンロードします。
wget https://fast.dpdk.org/rel/dpdk-${DPDK_VERSION}.tar.xz
tar xvJf dpdk-${DPDK_VERSION}.tar.xz
インストールします。
cd ~/dpdk-stable-${DPDK_VERSION}
make install T=x86_64-native-linuxapp-gcc DESTDIR=/usr/local EXTRA_CFLAGS="-O3 -g3"
設定を行います。
DPDK を使用する NIC に対し、OS 標準のネットワークコンフィグレーションからの設定を無効化します。
vim /etc/netplan/hogefuga.yaml
...
# ens38:
# ...
# ens39:
# ...
...
Hugepages を有効化します。
echo "vm.nr_hugepages = 256" > /etc/sysctl.d/hugepages.conf
sysctl -p /etc/sysctl.d/hugepages.conf
マウントします。
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
確認します。
# grep -i "HugePages" /proc/meminfo
AnonHugePages: 8192 kB
HugePages_Total: 256
HugePages_Free: 256
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
# mount | grep huge
...
nodev on /mnt/huge type hugetlbfs (rw)
ブート時に hugetlbfs をマウントするように設定します。
cat << '_EOF_' >> /etc/fstab
# hugepages setting
nodev /mnt/huge hugetlbfs defaults,nofail 0 0
_EOF_
uio_pci_generic モジュールを有効化します。
modprobe uio_pci_generic
uio, igb_uio モジュールが有効化されたことを確認します。
# lsmod | grep uio
uio_pci_generic 16384 0
uio 20480 1 uio_pci_generic
ブート時に uio, igb_uio モジュールを有効化するよう設定します。
cat << '_EOF_' >> /etc/modules
# for dpdk
uio_pci_generic
_EOF_
NIC の設定を確認します。
# dpdk-devbind --status
Network devices using DPDK-compatible driver
============================================
<none>
Network devices using kernel driver
===================================
0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=uio_pci_generic *Active*
0000:00:04.0 'Virtio network device 1000' if=eth1 drv=virtio-pci unused=uio_pci_generic *Active*
0000:00:05.0 'Virtio network device 1000' if=eth2 drv=virtio-pci unused=uio_pci_generic *Active*
Other Network devices
=====================
<none>
Crypto devices using DPDK-compatible driver
===========================================
<none>
Crypto devices using kernel driver
==================================
<none>
Other Crypto devices
====================
<none>
Eventdev devices using DPDK-compatible driver
=============================================
<none>
Eventdev devices using kernel driver
====================================
<none>
Other Eventdev devices
======================
<none>
Mempool devices using DPDK-compatible driver
============================================
<none>
Mempool devices using kernel driver
===================================
<none>
Other Mempool devices
=====================
<none>
ブリッジに属させる NIC の PCI ID を指定します。
IFACES="eth1 eth2"
for IFACE in $IFACES; do
IFACES_PCI="$IFACES_PCI $(dpdk-devbind --status | grep $IFACE | awk '{print $1}')"
done
該当の NIC を DPDK にバインドします。
dpdk-devbind -b uio_pci_generic $IFACES_PCI
確認します。
# dpdk-devbind --status
Network devices using DPDK-compatible driver
============================================
0000:00:04.0 'Virtio network device 1000' drv=uio_pci_generic unused=
0000:00:05.0 'Virtio network device 1000' drv=uio_pci_generic unused=
Network devices using kernel driver
===================================
0000:00:03.0 'Virtio network device 1000' if=eth0 drv=virtio-pci unused=uio_pci_generic *Active*
Other Network devices
=====================
<none>
Crypto devices using DPDK-compatible driver
===========================================
<none>
Crypto devices using kernel driver
==================================
<none>
Other Crypto devices
====================
<none>
Eventdev devices using DPDK-compatible driver
=============================================
<none>
Eventdev devices using kernel driver
====================================
<none>
Other Eventdev devices
======================
<none>
Mempool devices using DPDK-compatible driver
============================================
<none>
Mempool devices using kernel driver
===================================
<none>
Other Mempool devices
=====================
<none>
環境変数を削除します。
unset IFACES
unset IFACES_PCI
DPDK 標準のパケット転送ツールである testpmd を実行します。
# testpmd -- -i
EAL: Detected 4 lcore(s)
EAL: No free hugepages reported in hugepages-1048576kB
EAL: Probing VFIO support...
EAL: PCI device 0000:0b:00.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 15ad:7b0 net_vmxnet3
EAL: PCI device 0000:13:00.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 15ad:7b0 net_vmxnet3
EAL: PCI device 0000:1b:00.0 on NUMA socket -1
EAL: Invalid NUMA socket, default to 0
EAL: probe driver: 15ad:7b0 net_vmxnet3
EAL: No probed ethernet devices
Interactive-mode selected
USER1: create a new mbuf pool <mbuf_pool_socket_0>: n=171456, size=2176, socket=0
Configuring Port 0 (socket 0)
Port 0: 00:50:56:99:1D:8A
Configuring Port 1 (socket 0)
Port 1: 00:50:56:99:2A:33
Checking link statuses...
Done
testpmd>
パケットの転送を有効化します。
testpmd> start
転送状況を確認します。
testpmd> show port stats all
パケットの転送を無効化します。
testpmd> stop