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

Overview

Обзор

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

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

Кроме того, с помощью библиотек обработки пакетов DPDK была оптимизирована производительность некоторых наиболее важных сегментов OVS. Например, план пересылки оптимизирован для запуска в пользовательском пространстве в виде отдельных потоков процесса vswitch (vswitchd). Реализация оптимизированных с помощью DPDK гостевых интерфейсов vHost обеспечивает высокую производительность при передаче данных с виртуальных машин (ВМ) на ВМ или с ВМ на физический ПК.

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

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

Подробные инструкции по установке и использованию OVS с DPDK см. по адресу https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md. В этом документе мы рассмотрим основные действия и, в частности, сценарий использования пользовательских портов DPDK vhost-user.

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

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

http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html#compilation-of-the-dpdk

Пакеты средств разработки в стандартных дистрибутивах 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" по ссылке https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md

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

Чтобы собрать OVS с DPDK, нужно загрузить исходный код DPDK и подготовить среду назначения. Дополнительные сведения об использовании DPDK см. по адресу http://www.dpdk.org/doc/guides/linux_gsg/index.html. Основные действия показаны в следующем фрагменте кода:

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 доступна по адресу https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md. Здесь мы рассмотрим только основные шаги.

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.

После перезагрузки системы проверьте командную строку ядра и выделенные сверхкрупные страницы, как показано ниже.

Теперь следует подключить файловую систему сверхкрупных страниц и загрузить драйвер пользовательского пространства 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

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

Если предполагаемый сценарий использования касается только передачи данных между виртуальными машинами, а физические сетевые адаптеры не используются, то можно пропустить указанные выше действия для 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

Создание моста и портов DPDKvhost-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.

Использование портов DPDKvhost-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

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

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

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

Повторение теста производительности для стандартной сборки 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) см. в инструкциях по адресу http://openvswitch.org/support/dist-docs-2.4/INSTALL.KVM.md.txt. Затем запустите виртуальные машины, используя те же образы, что мы уже использовали ранее, например:

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, который мы выполняли ранее. Ниже приводится пример результатов; фактические результаты в вашей системе могут различаться в зависимости от ее конфигурации.

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

Заключение

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

Об авторе

Ашок Эмани (Ashok Emani) — старший инженер по программному обеспечению в корпорации Intel. Его 14-летний стаж работы охватывает следующие области: программирование встроенных систем, технологии хранения данных и ввода-вывода, компьютерная архитектура, виртуализация и анализ производительности. В настоящее время он занимается проектами по поддержке SDN/NFV.

Дополнительные сведения об оптимизации компиляторов см. в нашем уведомлении об оптимизации.

Para obter informações mais completas sobre otimizações do compilador, consulte nosso aviso de otimização.