Использование DPDK на Debian 8 Jessie вместе с драйвером ixgbe (Intel 82599).
Собираем:
Проверяем, какие сетевые мы видим:
Отключаем сетевые (в моем случае eth4/eth6), с которыми будем работать от драйвера из Linux ядра для работы с DPDK:
Убеждаемся, что все подцепилось:
Теперь нужно настроить HugeTLB, смотрим, в какие точки оно у нас смонтировано:
И размонтируем!
После этого монтируем вновь:
В файле:
Фиксим:
Итак, у нас CPU E5-2407 0 @ 2.20GHz у него 3 канала памяти (-n 3) и 4 ядра (-l 0-3).
Запускаем (можно указать --pci-whitelist 0a:00.0 --pci-whitelist 0d:00.0 чтобы работать только с этими портами):
-p 3 - это битовая маска портов, с которыми мы работаем (3 = 11 в бинарной кодировке, оба порта).
Обращаю внимание, что на целевой стороне нужно включить promisc режим, ибо пакеты летят с левым MAC:
Включаем режим прослушки вот так:
Итак, нагрузка:
Показания с PCM просто потрясающие - все операции идут через кэш процессора:
В случае netmap цифры ужасающие:
Запуск тест testpmd:
Собираем:
cd /usr/srcЗагружаем uio:
wget http://dpdk.org/browse/dpdk/snapshot/dpdk-16.04.tar.gz
tar -xf dpdk-16.04.tar.gz
cd dpdk-16.04/
make config T=x86_64-native-linuxapp-gcc
make
modprobe uio_pci_generic
Проверяем, какие сетевые мы видим:
tools/dpdk_nic_bind.py --status
tools/dpdk_nic_bind.py --status
Network devices using DPDK-compatible driver
============================================
<none>
Network devices using kernel driver
===================================
0000:02:00.0 'I350 Gigabit Network Connection' if=eth0 drv=igb unused=uio_pci_generic *Active*
0000:02:00.1 'I350 Gigabit Network Connection' if=eth1 drv=igb unused=uio_pci_generic
0000:02:00.2 'I350 Gigabit Network Connection' if=eth2 drv=igb unused=uio_pci_generic
0000:02:00.3 'I350 Gigabit Network Connection' if=eth3 drv=igb unused=uio_pci_generic
0000:0a:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection' if=eth4 drv=ixgbe unused=uio_pci_generic
0000:0a:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection' if=eth5 drv=ixgbe unused=uio_pci_generic
0000:0d:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection' if=eth6 drv=ixgbe unused=uio_pci_generic
0000:0d:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection' if=eth7 drv=ixgbe unused=uio_pci_generic
Отключаем сетевые (в моем случае eth4/eth6), с которыми будем работать от драйвера из Linux ядра для работы с DPDK:
./tools/dpdk_nic_bind.py --bind=uio_pci_generic 0a:00.0
./tools/dpdk_nic_bind.py --bind=uio_pci_generic 0d:00.0
Убеждаемся, что все подцепилось:
tools/dpdk_nic_bind.py --status
Network devices using DPDK-compatible driver
============================================
0000:0a:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection' drv=uio_pci_generic unused=
0000:0d:00.0 '82599ES 10-Gigabit SFI/SFP+ Network Connection' drv=uio_pci_generic unused=
Network devices using kernel driver
===================================
0000:02:00.0 'I350 Gigabit Network Connection' if=eth0 drv=igb unused=uio_pci_generic *Active*
0000:02:00.1 'I350 Gigabit Network Connection' if=eth1 drv=igb unused=uio_pci_generic
0000:02:00.2 'I350 Gigabit Network Connection' if=eth2 drv=igb unused=uio_pci_generic
0000:02:00.3 'I350 Gigabit Network Connection' if=eth3 drv=igb unused=uio_pci_generic
0000:0a:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection' if=eth5 drv=ixgbe unused=uio_pci_generic
0000:0d:00.1 '82599ES 10-Gigabit SFI/SFP+ Network Connection' if=eth7 drv=ixgbe unused=uio_pci_generic
Other network devices
=====================
<none>
Теперь нужно настроить HugeTLB, смотрим, в какие точки оно у нас смонтировано:
cat /proc/mounts |grep tlb
И размонтируем!
После этого монтируем вновь:
mkdir -p /mnt/hugeСобираем пример форвардера:
mount -t hugetlbfs nodev /mnt/huge
echo 64 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
cd examplesЕсли получаем ошибку "/usr/src/dpdk-16.04/mk/internal/rte.extvars.mk:57: *** Cannot find .config in /usr/src/dpdk-16.04/x86_64-native-linuxapp-gcc. Останов.", то нужно внести фикс:
apt-get install -y libvirt-dev
export RTE_TARGET=x86_64-native-linuxapp-gcc
export RTE_SDK=/usr/src/dpdk-16.04
make
В файле:
vim /usr/src/dpdk-16.04/mk/internal/rte.extvars.mk
Фиксим:
-RTE_SDK_BIN := $(RTE_SDK)/$(RTE_TARGET)
+RTE_SDK_BIN := $(RTE_SDK)/build
Итак, у нас CPU E5-2407 0 @ 2.20GHz у него 3 канала памяти (-n 3) и 4 ядра (-l 0-3).
Запускаем (можно указать --pci-whitelist 0a:00.0 --pci-whitelist 0d:00.0 чтобы работать только с этими портами):
./l2fwd/l2fwd/x86_64-native-linuxapp-gcc/app/l2fwd -l 0-3 -n 3 -- -p 3
-p 3 - это битовая маска портов, с которыми мы работаем (3 = 11 в бинарной кодировке, оба порта).
Обращаю внимание, что на целевой стороне нужно включить promisc режим, ибо пакеты летят с левым MAC:
11:47:35.261390 90:e2:ba:4a:d8:e8 > 02:00:00:00:00:01, ethertype IPv4 (0x0800), length 60: 128.0.71.57.9926 > 10.20.20.100.80: UDP, length 18
11:47:35.261391 90:e2:ba:4a:d8:e8 > 02:00:00:00:00:01, ethertype IPv4 (0x0800), length 60: 128.0.71.56.14204 > 10.20.20.100.80: UDP, length 18
11:47:35.261392 90:e2:ba:4a:d8:e8 > 02:00:00:00:00:01, ethertype IPv4 (0x0800), length 60: 128.0.71.57.6523 > 10.20.20.100.80: UDP, length 18
11:47:35.261394 90:e2:ba:4a:d8:e8 > 02:00:00:00:00:01, ethertype IPv4 (0x0800), length 60: 128.0.71.56.51110 > 10.20.20.100.80: UDP, length 18
11:47:35.261394 90:e2:ba:4a:d8:e8 > 02:00:00:00:00:01, ethertype IPv4 (0x0800), length 60: 128.0.71.57.12424 > 10.20.20.100.80: UDP, length 18
Включаем режим прослушки вот так:
ifconfig eth1 promisc
Итак, нагрузка:
33624 root 20 0 378800 3716 3356 R 200.0 0.0 30:04.50 l2fwd
%Cpu(s): 50.0 us, 0.0 sy, 0.0 ni, 50.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
Показания с PCM просто потрясающие - все операции идут через кэш процессора:
Time elapsed: 998 ms
Called sleep function for 1000 ms
---------------------------------------|
-- Socket 0 --|
---------------------------------------|
---------------------------------------|
---------------------------------------|
-- Memory Performance Monitoring --|
---------------------------------------|
-- Mem Ch 0: Reads (MB/s): 0.26 --|
-- Writes(MB/s): 18.52 --|
-- Mem Ch 1: Reads (MB/s): 0.10 --|
-- Writes(MB/s): 17.11 --|
-- NODE0 Mem Read (MB/s): 0.36 --|
-- NODE0 Mem Write (MB/s) : 35.64 --|
-- NODE0 P. Write (T/s) : 3107 --|
-- NODE0 Memory (MB/s): 36.00 --|
---------------------------------------||---------------------------------------
-- System Read Throughput(MB/s): 0.36 --
-- System Write Throughput(MB/s): 35.64 --
-- System Memory Throughput(MB/s): 36.00 --
---------------------------------------||---------------------------------------
В случае netmap цифры ужасающие:
---------------------------------------|
-- Socket 0 --|
---------------------------------------|
---------------------------------------|
---------------------------------------|
-- Memory Performance Monitoring --|
---------------------------------------|
-- Mem Ch 0: Reads (MB/s): 1162.53 --|
-- Writes(MB/s): 726.09 --|
-- Mem Ch 1: Reads (MB/s): 0.01 --|
-- Writes(MB/s): 0.00 --|
-- NODE0 Mem Read (MB/s): 1162.53 --|
-- NODE0 Mem Write (MB/s) : 726.09 --|
-- NODE0 P. Write (T/s) : 3575 --|
-- NODE0 Memory (MB/s): 1888.63 --|
---------------------------------------||---------------------------------------
-- System Read Throughput(MB/s): 1162.53 --
-- System Write Throughput(MB/s): 726.09 --
-- System Memory Throughput(MB/s): 1888.63 --
---------------------------------------||---------------------------------------
Запуск тест testpmd:
./x86_64-native-linuxapp-gcc/build/app/test-pmd/testpmd -l 0-3 -n 3 -- --interactive --total-num-mbufs=2048Вот огромный гайд по тулзе testpmd: http://www.intel.com/content/dam/www/public/us/en/documents/guides/intel-dpdk-testpmd-application-user-guide.pdf
No comments :
Post a Comment
Note: only a member of this blog may post a comment.