Использование Open vSwitch с DPDK для передачи данных между виртуальными машинами с виртуализацией сетевых функций

в 6:30, , рубрики: Data Plane Development Kit, DPDK, NFV, open vSwitch, OVS, SDN, virtualization, Блог компании Intel, виртуализация, Серверное администрирование, Сетевые технологии, метки: , , ,

Пакет Data Plane Development Kit (DPDK) предоставляет высокопроизводительные библиотеки обработки пакетов и драйверы пользовательского пространства. Начиная с Open vSwitch (OVS) версии 2.4 мы имеем возможность использовать оптимизированный с помощью DPDK путь vHost в OVS. Поддержка DPDK была доступна OVS с версии 2.2.

Использование DPDK в OVS дает существенные преимущества с точки зрения производительности. Как и в других приложениях, использующих DPDK, резко повышается сетевая пропускная способность (количество передаваемых сетевых пакетов) при существенном снижении задержек. Кроме того, с помощью библиотек обработки пакетов DPDK была оптимизирована производительность некоторых наиболее важных сегментов OVS.

В этом документе мы рассмотрим настройку OVS с DPDK для использования между виртуальными машинами. Каждый порт будет подключен к отдельной виртуальной машине. Затем мы запустим простой тест пропускной способности iperf3 и сравним производительность с работой конфигурации OVS без DPDK, чтобы оценить, какие преимущества мы получаем в OVS с DPDK.

Использование Open vSwitch с DPDK для передачи данных между виртуальными машинами с виртуализацией сетевых функций - 1

Open vSwitch можно установить с помощью стандартных установщиков пакетов в распространенных дистрибутивах Linux*. Поддержка DPDK по умолчанию не включена, поэтому перед дальнейшими действиями нужно собрать Open vSwitch с DPDK.

Подробные инструкции по установке и использованию OVS с DPDK см. здесь. В этом документе мы рассмотрим основные действия и, в частности, сценарий использования пользовательских портов DPDK vhost-user.

Требования для OVS и DPDK

Перед компиляцией DPDK и OVS убедитесь, что выполняются все необходимые требования.

Пакеты средств разработки в стандартных дистрибутивах Linux обычно отвечают большей части таких требований. Например, в дистрибутивах на базе yum (или на базе dnf) можно использовать следующую команду для установки:

yum install "@Development Tools" automake tunctl kernel-tools "@Virtualization Platform" "@Virtualization" pciutils hwloc numactl

Кроме того, убедитесь, что в системе установлен компонент qemu версии v2.2.0 или более поздней согласно указаниям в документе DPDK vhost-user Prerequisites.

Сборка целевой среды DPDK для OVS

Чтобы собрать OVS с DPDK, нужно загрузить исходный код DPDK и подготовить среду назначения. Дополнительные сведения об использовании DPDK см. здесь. Основные действия показаны в следующем фрагменте кода:

curl -O http://dpdk.org/browse/dpdk/snapshot/dpdk-2.1.0.tar.gz
tar -xvzf dpdk-2.1.0.tar.gz
cd dpdk-2.1.0
export DPDK_DIR=`pwd`
sed 's/CONFIG_RTE_BUILD_COMBINE_LIBS=n/CONFIG_RTE_BUILD_COMBINE_LIBS=y/' -i config/common_linuxapp
make install T=x86_64-ivshmem-linuxapp-gcc
cd x86_64-ivshmem-linuxapp-gcc
EXTRA_CFLAGS="-g -Ofast" make -j10

Сборка OVS с DPDK

При наличии собранной среды назначения DPDK можно загрузить последние версии исходного кода OVS и выполнить сборку с включенной поддержкой DPDK. Стандартная документация для сборки OVS с DPDK доступна по адресу. Здесь мы рассмотрим только основные шаги.

git clone https://github.com/openvswitch/ovs.git
cd ovs
export OVS_DIR=`pwd`
./boot.sh
./configure --with-dpdk="$DPDK_DIR/x86_64-ivshmem-linuxapp-gcc/" CFLAGS="-g -Ofast"
make 'CFLAGS=-g -Ofast -march=native' -j10

Итак, мы располагаем полной собранной OVS с включенной поддержкой DPDK. Все стандартные служебные программы OVS находятся в папке $OVS_DIR/utilities/, а база данных OVS — в папке$OVS_DIR/ovsdb/. Мы используем эти служебные программы в дальнейших действиях.

Создание базы данных OVS и запуск ovsdb-server

Перед запуском основного процесса OVS «ovs-vswitchd» нужно инициализировать базу данных OVS и запустить ovsdb-server. Следующие команды показывают, как очистить и создать новую базу данных OVS и экземпляр ovsdb_server.

pkill -9 ovs
rm -rf /usr/local/var/run/openvswitch
rm -rf /usr/local/etc/openvswitch/
rm -f /usr/local/etc/openvswitch/conf.db
mkdir -p /usr/local/etc/openvswitch
mkdir -p /usr/local/var/run/openvswitch
cd $OVS_DIR
./ovsdb/ovsdb-tool create /usr/local/etc/openvswitch/conf.db ./vswitchd/vswitch.ovsschema
./ovsdb/ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
./utilities/ovs-vsctl --no-wait init

Настройка хоста и сетевых адаптеров для использования OVS с DPDK

Для DPDK требуется, чтобы операционная система хоста поддерживала сверхкрупные страницы памяти, а для сетевых адаптеров должны быть включены драйверы опрашиваемого режима (PMD) пользовательского пространства DPDK.
Для включения сверхкрупных страниц памяти и использования драйвера пользовательского пространства VFIO добавьте приведенные ниже параметры в GRUB_CMDLINE_LINUX в /etc/default/grub, затем запустите обновление grub и перезагрузите систему:

default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=2048 iommu=pt intel_iommu=on isolcpus=1-13,15-27
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

В зависимости от объема доступной памяти в системе можно настроить количество и тип сверхкрупных страниц. Параметр isolcpus позволяет изолировать определенные ЦП от планировщика Linux, поэтому за ними можно будет «закрепить» приложения на основе DPDK.
После перезагрузки системы проверьте командную строку ядра и выделенные сверхкрупные страницы, как показано ниже.

Использование Open vSwitch с DPDK для передачи данных между виртуальными машинами с виртуализацией сетевых функций - 2

Теперь следует подключить файловую систему сверхкрупных страниц и загрузить драйвер пользовательского пространства vfio-pci.


mkdir -p /mnt/huge
mkdir -p /mnt/huge_2mb
mount -t hugetlbfs hugetlbfs /mnt/huge
mount -t hugetlbfs none /mnt/huge_2mb -o pagesize=2MB

modprobe vfio-pci
cp $DPDK_DIR/tools/dpdk_nic_bind.py /usr/bin/.
dpdk_nic_bind.py --status
dpdk_nic_bind.py --bind=vfio-pci 05:00.1

На следующем снимке экрана показан пример выходных данных для указанных выше команд.

Использование Open vSwitch с DPDK для передачи данных между виртуальными машинами с виртуализацией сетевых функций - 3

Если предполагаемый сценарий использования касается только передачи данных между виртуальными машинами, а физические сетевые адаптеры не используются, то можно пропустить указанные выше действия для vfio-pci.

Запуск ovs-vswitchd

Итак, база данных OVS настроена, хост настроен для использования OVS с DPDK. Теперь следует запустить основной процесс ovs-vswitchd.

modprobe openvswitch
$OVS_DIR/vswitchd/ovs-vswitchd --dpdk -c 0x2 -n 4 --socket-mem 2048 -- unix:/usr/local/var/run/openvswitch/db.sock --pidfile --detach

Создание моста и портов DPDK vhost-user для использования между виртуальными машинами

В нашем тестовом образце мы создадим мост и добавим два порта DPDK vhost-user. При желании можно добавить физический сетевой адаптер vfio-pci, который мы настроили ранее.

$OVS_DIR/utilities/ovs-vsctl show
$OVS_DIR/utilities/ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
$OVS_DIR/utilities/ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
$OVS_DIR/utilities/ovs-vsctl add-port br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser
$OVS_DIR/utilities/ovs-vsctl add-port br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser

На следующем снимке экрана показана итоговая конфигурация OVS.

Использование Open vSwitch с DPDK для передачи данных между виртуальными машинами с виртуализацией сетевых функций - 4

Использование портов DPDK vhost-user с виртуальными машинами

Описание создания виртуальных машин выходит за рамки этого документа. После того как у нас будут две виртуальные машины (например f21vm1.qcow2 и f21vm2.qcow2), следующие команды покажут, как использовать созданные ранее порты DPDK vhost-user.

qemu-system-x86_64 -m 1024 -smp 4 -cpu host -hda ~/f21vm1.qcow2 -boot c -enable-kvm -no-reboot -nographic -net none 
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/vhost-user1 
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce 
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 
-object memory-backend-file,id=mem,size=1024M,mem-path=/dev/hugepages,share=on 
-numa node,memdev=mem -mem-prealloc

qemu-system-x86_64 -m 1024 -smp 4 -cpu host -hda ~/f21vm2.qcow2 -boot c -enable-kvm -no-reboot -nographic -net none 
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/vhost-user2 
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce 
-device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet1 
-object memory-backend-file,id=mem,size=1024M,mem-path=/dev/hugepages,share=on 
-numa node,memdev=mem -mem-prealloc

Простой тест производительности DPDK vhost-user между виртуальными машинами с помощью iperf3

Войдите на виртуальные машины и настройте для сетевых адаптеров статические IP-адреса в одной и той же подсети. Установите iperf3 и запустите простой тест сети.
На одной виртуальной машине запустите iperf3 в серверном режиме iperf3 -s и запустите клиент iperf3. Пример результата показан на следующем снимке экрана.

Использование Open vSwitch с DPDK для передачи данных между виртуальными машинами с виртуализацией сетевых функций - 5

Повторение теста производительности для стандартной сборки OVS (без DPDK)

В предыдущих разделах мы создали и использовали сборку OVS-DPDK непосредственно в папке $OVS_DIR, не устанавливая ее в систему. Чтобы повторить тест для стандартной сборки OVS (без DPDK) можно просто выполнить установку с помощью стандартных установщиков дистрибутива. Например, в системах на базе yum (или на базе dnf) можно использовать следующую команду для установки:

pkill -9 ovs

yum install openvswitch

rm -f /etc/openvswitch/conf.db
mkdir -p /var/run/openvswitch
ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
ovsdb-server --remote=punix:/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
ovs-vsctl --no-wait init

ovs-vswitchd unix:/var/run/openvswitch/db.sock --pidfile --detach

ovs-vsctl add-br br0
ovs-vsctl show

На этом этапе мы располагаем настроенной свежей базой данных OVS и запущенным процессом ovs-vswitchd без DPDK.
Сведения о настройке двух виртуальных машин с устройствами прослушивания для моста OVS без DPDK (br0) см. в инструкциях. Затем запустите виртуальные машины, используя те же образы, что мы уже использовали ранее, например:

qemu-system-x86_64 -m 512 -smp 4 -cpu host -hda ~/f21vm1c1.qcow2 -boot c -enable-kvm -no-reboot -nographic -net nic,macaddr=00:11:22:EE:EE:EE -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown

qemu-system-x86_64 -m 512 -smp 4 -cpu host -hda ~/f21vm1c2.qcow2 -boot c -enable-kvm -no-reboot -nographic -net nic,macaddr=00:11:23:EE:EE:EE -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown

Повторите простой тест производительности iperf3, который мы выполняли ранее. Ниже приводится пример результатов; фактические результаты в вашей системе могут различаться в зависимости от ее конфигурации.

Использование Open vSwitch с DPDK для передачи данных между виртуальными машинами с виртуализацией сетевых функций - 6

Как видно на приведенном выше рисунке, при использовании OVS с DPDK наблюдается значительный прирост производительности. Оба теста производительности были выполнены в одной и той же системе, разница заключалась лишь в том, что в одном случае использовалась стандартная сборка OVS, а в другом — OVS с DPDK.

Заключение

В Open vSwitch версии 2.4 реализована поддержка DPDK, что означает весьма значительный прирост производительности. В этой статье мы показали, как собрать и использовать OVS с DPDK. Мы рассмотрели настройку простого моста OVS с портами DPDK vhost-user для использования между виртуальными машинами. Мы продемонстрировали повышение производительности с помощью теста iperf3, сравнив OVS с DPDK и без DPDK.

Автор: Intel

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js