Использование множества очередей (multiqueue)
Сегодняшние высокопроизводительные серверы имеют больше процессоров, а гостевые системы, работающие на них, часто имеют все большее количество виртуальных ЦП. В одной очереди virtio-net, масштаб стека протоколов в гостевой системе ограничен, поскольку производительность сети не масштабируется по мере увеличения количества виртуальных ЦП. Гости не могут передавать или получать пакеты параллельно, поскольку virtio-net имеет только одну очередь TX и RX. В штатном режиме работы сети для SDN networking использовуется только одно ядро CPU.
Openstack поддерживает функцию virtio-net multiqueue (множества очередей) у образа ВМ и конкретно отдельной ВМ и обеспечивает повышение производительности сети.
Ограничения
Однако функция multiqueue имеет некоторые ограничения:
- Для каждой очереди сетевого адаптера, любого устройства virtio или назначенного устройства PCI требуется отдельный вектор Multi-Source Integration (MSI), однако их количество лимитировано и составляет не более 200.
- Соответственно, создание инстанса с несколькими сетевыми адаптерами virtio и виртуальными ЦП может привести к превышению лимита гостевого MSI.
- Включение multiqueue увеличивает общую пропускную способность сети, но одновременно увеличивает нагрузку на CPU.
- Multiqueue хорошо работает для входящего трафика, но, иногда, может вызвать снижение производительности для исходящего трафика.
- Если количество виртуальных сетевых адаптеров в инстансе пропорционально количеству vCPU, то включение multiqueue повлияет на производительность незначительно.
- Каждая очередь virtio-net использует 64 КБ памяти ядра для драйвера vhost.
- Если функция множества очередей была включена на хосте, но не была включена администратором в операционной системе ВМ, то векторы MSI будут использоваться впустую.
- На платформе openstack недостаточно включить multiqueue только на уровне образа ОС (в конфигурации KVM/QEMU). Кроме того, необходимо вручную включить данную функциональность с помощью ethtool непосредственно в инстансах, если они были созданы до включения multiqueue.
Multiqueue virtio-net обеспечивает наибольший выигрыш в производительности, когда:
- Пакеты трафика относительно большие.
- Инстанс использует несколько соединений одновременно, при этом трафик передается между различными ВМ, между ВМ и хостом, или из ВМ к внешней системе.
- Количество очередей равно количеству виртуальных ЦП. Это обусловлено тем, что поддержка нескольких очередей оптимизирует привязку прерываний RX и выбор очереди TX, чтобы сделать определенную очередь закрепленной за конкретным vCPU.
Общая схема потоков multiqueue выглядит так:
Включить multiqueue
Вариант включает multiqueue на уровне образа будет работать для всех ВМ, созданных после выполнения инструкции.
Выберите образ, в котором более одного vCPU, и включите для него multiqueue:
Для проверки включения multiqueue, создайте инстанс на выбранном образе и подключитесь к нему. Посмотрите все сетевые интерфейсы:Пример вывода:
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
Теперь установим новое значение multiqueue для ВМ, не забывая о том, что его значение не может быть больше количества виртуальных ЦП:
И проверим новое значение (параметр Combined):
Пример вывода: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