[Sysadmins] howto: openvswitch+dpdk + mlx5(mellanox)

Alexey Shabalin a.shabalin на gmail.com
Пн Янв 13 17:09:23 MSK 2020


День добрый.
Посылаю сюда результаты, как заставить работать openvswitch+dpdk на
сетевых карточках mellanox. Вроде есть документация на официальном
сайте (http://docs.openvswitch.org/en/latest/intro/install/dpdk/), но,
как всегда, не совсем полная или понятная. Поэтому хотел где нибудь
оставить на память(для себя в первую очередь :)

1) Настройка hugepages
-  добавить
default_hugepagesz=1G hugepagesz=1G iommu=pt intel_iommu=on
в /etc/sysconfig/grub2 к параметрам загрузки (размер страниц можно и
неменять, делайте на своё усмотрение по вкусу)
- в /etc/sysctl.d/hugepages.conf определить нужной количество hugepages
vm.nr_hugepages=16

2) для сетевых карты Intel нужно "отбиндить" родной ядерный модуль, и
прибиндить модуль vfio или uio. Для этого лучше воспользоваться
пакетом driverctl.
Для сетевых карт mellanox этого делать не надо (они в этом смысле
особенные). Просто пропускаем этот пункт.

3) Настройка openvswitch:
# ovs-vsctl add-br vmbr0 datapath_type=netdev (или переключить
существующий бридж ovs-vsctl set bridge vmbr0 datapath_type=netdev)
# ovs-vsctl set Open_vSwitch . other_config:dpdk-init=true
# ovs-vsctl --no-wait set Open_vSwitch .
other_config:dpdk-socket-mem="1024,0" (ограничить память и
используемое ядро)

При добавлении порта сетевой карты в openvswitch
# ovs-vsctl add-port vmbr0 dpdk-p0 -- set Interface dpdk-p0 type=dpdk
-- set Interface dpdk-p0 options:dpdk-devargs=0000:5e:01.2
получаем ошибку:
ovs-vsctl: Error detected while setting up 'dpdk-p0': Error attaching
device '0000:5e:01.2' to DPDK.  See ovs-vswitchd log for details.

# ovs-vsctl show
a513afa7-32b1-476f-b42f-ccc797dd11d3
    Bridge "vmbr0"
        Port "dpdk-p0"
            Interface "dpdk-p0"
                type: dpdk
                options: {dpdk-devargs="0000:5e:01.2"}
                error: "Error attaching device '0000:5e:01.2' to DPDK"

В логах ошибка такая:
|netdev_dpdk|ERR|Failed to create mempool "ovsd78992f200021580262144"
with a request of 262144 mbufs
|netdev_dpdk|ERR|Failed to create memory pool for netdev dpdk-p0, with
MTU 1500 on socket 0: Invalid argument
|dpif_netdev|ERR|Failed to set interface dpdk-p0 new configuration

Вот эта ошибка очень плохо гуглится, и рецептов исправления я не видел.
Не совсем понятно, то ли это особенность нашей сборки, но почему-то не
может создаться memory pool. тестовые утилиты (dpdk-test-bbdev) начали
работать только после указания какую библиотеку использовать (-d
/usr/lib64/librte_mempool_ring.so.1). Этот же параметр надо передать и
для работы в openvswitch:
# ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-extra=" -d
/usr/lib64/librte_mempool_ring.so.1"

После этого все успешно работает.
# ovs-vsctl show
a513afa7-32b1-476f-b42f-ccc797dd11d3
    Bridge "vmbr0"
        Port "dpdk-p0"
            Interface "dpdk-p0"
                type: dpdk
                options: {dpdk-devargs="0000:5e:00.1"}
        Port "vmbr0"
            Interface "vmbr0"
                type: internal
    ovs_version: "2.11.1"

# ovs-vsctl list Open_vSwitch .
_uuid               : a513afa7-32b1-476f-b42f-ccc797dd11d3
bridges             : [b86c798d-0249-4453-95bc-a6135fd4343a]
cur_cfg             : 13
datapath_types      : [netdev, system]
db_version          : "7.16.1"
dpdk_initialized    : true
dpdk_version        : "DPDK 18.11.1"
external_ids        : {hostname="xxxxxxxx",
rundir="/var/run/openvswitch",
system-id="254cce7e-4957-4ef7-a026-75361e6cca30"}
iface_types         : [dpdk, dpdkr, dpdkvhostuser,
dpdkvhostuserclient, erspan, geneve, gre, internal, "ip6erspan",
"ip6gre", lisp, patch, stt, system, tap, vxlan]
manager_options     : []
next_cfg            : 13
other_config        : {dpdk-extra=" -d
/usr/lib64/librte_mempool_ring.so.1", dpdk-init="true"}
ovs_version         : "2.11.1"
ssl                 : []
statistics          : {}
system_type         : altlinux
system_version      : "9.0"



-- 
Alexey Shabalin


Подробная информация о списке рассылки Sysadmins