Использование множества очередей (multiqueue)

Сегодняшние высокопроизводительные серверы имеют больше процессоров, а гостевые системы, работающие на них, часто имеют все большее количество виртуальных ЦП. В одной очереди virtio-net, масштаб стека протоколов в гостевой системе ограничен, поскольку производительность сети не масштабируется по мере увеличения количества виртуальных ЦП. Гости не могут передавать или получать пакеты параллельно, поскольку virtio-net имеет только одну очередь TX и RX. В штатном режиме работы сети для SDN networking использовуется только одно ядро CPU.

Openstack поддерживает функцию virtio-net multiqueue (множества очередей) у образа ВМ и конкретно отдельной ВМ и обеспечивает повышение производительности сети.

Ограничения

Однако функция multiqueue имеет некоторые ограничения:

  1. Для каждой очереди сетевого адаптера, любого устройства virtio или назначенного устройства PCI требуется отдельный вектор Multi-Source Integration (MSI), однако их количество лимитировано и составляет не более 200.
  2. Соответственно, создание инстанса с несколькими сетевыми адаптерами virtio и виртуальными ЦП может привести к превышению лимита гостевого MSI.
  3. Включение multiqueue увеличивает общую пропускную способность сети, но одновременно увеличивает нагрузку на CPU.
  4. Multiqueue хорошо работает для входящего трафика, но, иногда, может вызвать снижение производительности для исходящего трафика.
  5. Если количество виртуальных сетевых адаптеров в инстансе пропорционально количеству vCPU, то включение multiqueue повлияет на производительность незначительно.
  6. Каждая очередь virtio-net использует 64 КБ памяти ядра для драйвера vhost.
  7. Если функция множества очередей была включена на хосте, но не была включена администратором в операционной системе ВМ, то векторы MSI будут использоваться впустую.
  8. На платформе openstack недостаточно включить multiqueue только на уровне образа ОС (в конфигурации KVM/QEMU). Кроме того, необходимо вручную включить данную функциональность с помощью ethtool непосредственно в инстансах, если они были созданы до включения multiqueue.

Multiqueue virtio-net обеспечивает наибольший выигрыш в производительности, когда:

  1. Пакеты трафика относительно большие.
  2. Инстанс использует несколько соединений одновременно, при этом трафик передается между различными ВМ, между ВМ и хостом, или из ВМ к внешней системе.
  3. Количество очередей равно количеству виртуальных ЦП. Это обусловлено тем, что поддержка нескольких очередей оптимизирует привязку прерываний RX и выбор очереди TX, чтобы сделать определенную очередь закрепленной за конкретным vCPU.

Общая схема потоков multiqueue выглядит так:

Схема потоков multiqueue

Включить multiqueue

Вариант включает multiqueue на уровне образа будет работать для всех ВМ, созданных после выполнения инструкции.

Выберите образ, в котором более одного vCPU, и включите для него multiqueue:

openstack image set <IMG_ID> --property hw_vif_multiqueue_enabled=true
Для проверки включения multiqueue, создайте инстанс на выбранном образе и подключитесь к нему. Посмотрите все сетевые интерфейсы:
sudo ip link show

Пример вывода:

sudo ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether ca:26:31:2a:e0:82 brd ff:ff:ff:ff:ff:ff
    altname enp0s3

ens3 — имя сетевого интерфейса, для которого назначена функция multiqueue.
Посмотрим текущее количество очередей:

ethtool -l ens3
Channel parameters for ens3:
Pre-set maximums:
RX:             n/a
TX:             n/a
Other:          n/a
Combined:       1
Current hardware settings:
RX:             n/a
TX:             n/a
Other:          n/a
Combined:       1
Видим, что количество очередей равно 1.

Теперь установим новое значение multiqueue для ВМ, не забывая о том, что его значение не может быть больше количества виртуальных ЦП:

sudo ethtool -L ens3 combined 2

И проверим новое значение (параметр Combined):

ethtool -l ens3
Пример вывода:

Channel parameters for ens3:
Pre-set maximums:
RX:             n/a
TX:             n/a
Other:          n/a
Combined:       4
Current hardware settings:
RX:             n/a
TX:             n/a
Other:          n/a
Combined:       2

Источники по теме:

Опубликовано: 03.02.2023