2015年1月11日日曜日

VirtualBoxX上のCentOS6.5 x86_64でDPDK1.8.0を試す

DPDK
http://dpdk.org
VirtualBoxX上のCentOS6.5 x86_64環境でDPDK1.8.0をビルドしてみた。

クイックスタートのtestpmdを実行するまでの方法。
http://dpdk.org/doc/quick-start

ダウンロード先
http://dpdk.org/download

注意点
1)cpu-coreは2コア以上が望ましい。
2)NICはIntel PRO/1000 MT Server(82545EM)等を選択。 Intel PRO/1000MT Desktop (82540EM)での動作は未確認。
3)DPDKのドライバで利用するNICは内部ネットワークでも良い。(以下手順ではNATでの動作は未確認。)

3)を実行するにあたり、都合3枚のNIC設定があったほうがいい。
1枚は通常のsshアクセス等に利用。残す2枚はDPDKの対向テスト等で使う事を想定。

以下の様な環境で動作を確認した。
VirtualBOX 4.2.12 r84980 (MacOS版)

# rpm -qa centos-release
centos-release-6-5.el6.centos.11.1.x86_64
# uname -a
Linux localhost.localdomain 2.6.32-504.3.3.el6.x86_64 #1 SMP Wed Dec 17 01:55:02 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

おおよその手順
1)ビルド用準備
2)ドライバビルド
3)ドライバのインストール

1)ビルド用準備
まずは、ドライバのビルドの為に、実行中のカーネルのヘッダーとmakeファイルが必要になるのでインストールしておく。
# yum install kernel-headers kernel-devel kernel

ヘッダーと実行中のカーネルのバージョンを合わせる手前、最新のカーネルにしてしまっている。
必要があれば、現在利用しているカーネルのバージョンとkernel-headers kernel-develのバージョンを合わせる。
# rpm -qa kernel-devel kernel-headers
kernel-devel-2.6.32-504.3.3.el6.x86_64
kernel-headers-2.6.32-504.3.3.el6.x86_64

ビルドをするので、gcc等もグループインストールしてしまう。
# yum --disablerepo=\* --enablerepo=base groupinstall "Development tools"
途中、pythonからlspciを実行しているので、pciutilsも必須となる。
# yum --disablerepo=\* --enablerepo=base install pciutils

2)ドライバビルド
クイックスタートにある通り、ドライバのmakeはできる。
# curl -OL http://dpdk.org/browse/dpdk/snapshot/dpdk-1.8.0.tar.gz
# tar zxvf dpdk-1.8.0.tar.gz
# cd dpdk-1.8.0
# make config T=x86_64-native-linuxapp-gcc
# make

3)ドライバのインストール
# modprobe uio
# insmod build/kmod/igb_uio.ko
# tools/dpdk_nic_bind.py --bind=igb_uio $(tools/dpdk_nic_bind.py --status | sed -rn 's,.* if=([^ ]*).*igb_uio *$,\1,p')

正常に組み込めていれば、dpdk_nic_bind.pyの実行結果は以下の様になる。
# python tools/dpdk_nic_bind.py --status

Network devices using DPDK-compatible driver
============================================
0000:00:08.0 '82545EM Gigabit Ethernet Controller (Copper)' drv=igb_uio unused=e1000
0000:00:09.0 '82545EM Gigabit Ethernet Controller (Copper)' drv=igb_uio unused=e1000

Network devices using kernel driver
===================================
0000:00:11.0 '82545EM Gigabit Ethernet Controller (Copper)' if=eth0 drv=e1000 unused=igb_uio *Active*

Other network devices
=====================



なおの事詳しく確認する場合、lspci -kの実行結果が確認し易い。
# lspci -k
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
Kernel driver in use: ata_piix
Kernel modules: ata_generic, pata_acpi, ata_piix
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service
00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev 01)
Subsystem: Intel Corporation Device 0000
Kernel driver in use: Intel ICH
Kernel modules: snd-intel8x0
00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB
Kernel driver in use: ohci_hcd
00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08)
Kernel modules: i2c-piix4
00:08.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 02)
Subsystem: VMware PRO/1000 MT Single Port Adapter
Kernel driver in use: igb_uio (←igb_uioが適応されている。)
Kernel modules: e1000
00:09.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 02)
Subsystem: VMware PRO/1000 MT Single Port Adapter
Kernel driver in use: igb_uio (←igb_uioが適応されている。)
Kernel modules: e1000
00:0b.0 USB controller: Intel Corporation 82801FB/FBM/FR/FW/FRW (ICH6 Family) USB2 EHCI Controller
Kernel driver in use: ehci_hcd
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02)
Kernel driver in use: ahci
Kernel modules: ahci
00:11.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 02)
Subsystem: VMware PRO/1000 MT Single Port Adapter
Kernel driver in use: e1000 (←igb_uioが適応されていない 上記のNetwork devices using kernel driverで表示されているデバイスで通常のNICとして使っている。)
Kernel modules: e1000

もちろんdmesgでも確認できる。
igb_uio: Use MSIX interrupt by default
e1000 0000:00:08.0: PCI INT A disabled
igb_uio 0000:00:08.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16
igb_uio 0000:00:08.0: uio device registered with irq 10
e1000 0000:00:09.0: PCI INT A disabled
igb_uio 0000:00:09.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
igb_uio 0000:00:09.0: uio device registered with irq 11
といったigb_uioに関するログがあるはず。

huge pages memoryの為のデバイスを作成してマウントする。
# mkdir -p /mnt/huge
# mount -t hugetlbfs nodev /mnt/huge
# echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

正常に実行できていれば以下の様にcatできるはず。
# cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
64

Set the highest frequencyの設定はしなくとも実行できそう。(情報持っている方はコメントくださいますと幸いです。)
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Power_Management_Guide/cpufreq_setup.html
この辺りの情報が関係あるのかもと推測。
手元の環境ではCPUfreq ドライバーがインストールできなかった。

これで、testpmdが実行できるはず。
手元の環境ではcpuコア等の指定が正しく無い為か、以下の様に中断してしまった。
おそらくtestpmdのオプション指定が手元の環境と正しく合っていない。
マニュアルに基づき正しく指定する必要がある。
http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-testpmd-application-user-guide.pdf
(cpuコアは4コアを設定している。)
ちなみに、testpmd -aは使えなかった。

# build/app/testpmd -c2 -n2 -- -i --nb-cores=2 --nb-ports=2
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 1 on socket 0
EAL: Detected lcore 2 as core 2 on socket 0
EAL: Detected lcore 3 as core 3 on socket 0
EAL: Support maximum 128 logical core(s) by configuration.
EAL: Detected 4 lcore(s)
EAL: Setting up memory...
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f9f79200000 (size = 0x200000)
EAL: Ask a virtual area of 0x7000000 bytes
EAL: Virtual area found at 0x7f9f72000000 (size = 0x7000000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f9f71c00000 (size = 0x200000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f9f71600000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f9f71000000 (size = 0x400000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f9f70c00000 (size = 0x200000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f9f70800000 (size = 0x200000)
EAL: Requesting 64 pages of size 2MB from socket 0
EAL: TSC frequency is ~2512331 KHz
EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using unreliable clock cycles !
EAL: Master core 1 is ready (tid=7a415800)
PMD: ENICPMD trace: rte_enic_pmd_init
EAL: PCI device 0000:00:08.0 on NUMA socket -1
EAL: probe driver: 8086:100f rte_em_pmd
EAL: PCI memory mapped at 0x7f9f79400000
PMD: eth_em_dev_init(): port_id 0 vendorID=0x8086 deviceID=0x100f
EAL: PCI device 0000:00:09.0 on NUMA socket -1
EAL: probe driver: 8086:100f rte_em_pmd
EAL: PCI memory mapped at 0x7f9f79420000
PMD: eth_em_dev_init(): port_id 1 vendorID=0x8086 deviceID=0x100f
EAL: PCI device 0000:00:11.0 on NUMA socket -1
EAL: probe driver: 8086:100f rte_em_pmd
EAL: 0000:00:11.0 not managed by UIO driver, skipping
PANIC in main():
Empty set of forwarding logical cores - check the core mask supplied in the command parameters
5: [build/app/testpmd() [0x4273c9]]
4: [/lib64/libc.so.6(__libc_start_main+0xfd) [0x7f9f795e0d5d]]
3: [build/app/testpmd(main+0xb65) [0x42b5e5]]
2: [build/app/testpmd(__rte_panic+0xc0) [0x427310]]
1: [build/app/testpmd(rte_dump_stack+0x1e) [0x49606e]]
アボートしました

# build/app/testpmd -a
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 1 on socket 0
EAL: Detected lcore 2 as core 2 on socket 0
EAL: Detected lcore 3 as core 3 on socket 0
EAL: Support maximum 128 logical core(s) by configuration.
EAL: Detected 4 lcore(s)
build/app/testpmd: invalid option -- 'a'

0 件のコメント: