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-адреса в одной и той же подсети. Установите iperf
3
и запустите простой тест сети.
На одной виртуальной машине запустите iperf
3
в серверном режиме iperf
3 -
s
и запустите клиент iperf
3
. Пример результата показан на следующем снимке экрана.
Повторение теста производительности для стандартной сборки 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
Повторите простой тест производительности iperf
3
, который мы выполняли ранее. Ниже приводится пример результатов; фактические результаты в вашей системе могут различаться в зависимости от ее конфигурации.
Как видно на приведенном выше рисунке, при использовании 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.
Дополнительные сведения об оптимизации компиляторов см. в нашем уведомлении об оптимизации.