FastNetMon

Monday, 20 April 2015

Использование DPDK на Debian 8 Jessie вместе с драйвером ixgbe (Intel 82599)

Использование DPDK на Debian 8 Jessie вместе с драйвером ixgbe (Intel 82599).

Собираем:
cd /usr/src
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
Загружаем uio:
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
apt-get install -y libvirt-dev
export RTE_TARGET=x86_64-native-linuxapp-gcc
export RTE_SDK=/usr/src/dpdk-16.04
make
Если получаем ошибку "/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.  Останов.", то нужно внести фикс:

В файле:
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.