Skip to content

Instantly share code, notes, and snippets.

@ShotaKitazawa
Created August 7, 2018 17:05
Show Gist options
  • Select an option

  • Save ShotaKitazawa/59159309c72bf4f1bbba90e47c1e4d59 to your computer and use it in GitHub Desktop.

Select an option

Save ShotaKitazawa/59159309c72bf4f1bbba90e47c1e4d59 to your computer and use it in GitHub Desktop.
DPDKのセットアップ

概要

DPDK を使用する環境の構築を行います。

環境

  • Infrastracture: VMWare Workstation 12 Pro
  • OS: Ubuntu 18.04
  • vCPU: 4 core
  • vRAM: 4 GB

NIC Driver Type の設定

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

DPDK

インストール

ビルドに必要なパッケージをインストールします。

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"

設定

設定を行います。

NIC の設定

DPDK を使用する NIC に対し、OS 標準のネットワークコンフィグレーションからの設定を無効化します。

  • vim /etc/netplan/hogefuga.yaml
...
#        ens38:
#            ...
#        ens39:
#            ...
...

Hugepages の設定

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_

DPDK の設定

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

testpmd

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment