Сетевая пропускная способность I/O может продолжать расти до того момента, когда один vCPU не сможет обработать все прерывания NIC. NIC multi-queue позволяет нескольким vCPU обрабатывать прерывания NIC, тем самым улучшая PPS сети и производительность I/O.
NIC multi-queue может быть включён только на ECS со спецификациями, образом и типом виртуализации, описанными в этом разделе.
Если есть более 1 очереди NIC, поддерживается NIC multi-queue.
Запуск uname -r для проверки версии ядра. Если версия ниже 2.6.35, обратитесь в техническую поддержку для её обновления.
OS | Образ | Поддержка NIC Multi-Queue |
|---|---|---|
Windows | Windows Server 2008 WEB R2 64bit | Да (поддерживается только приватными образами) |
Windows Server 2008 Enterprise SP2 64bit | Да (поддерживается только частными образами) | |
Windows Server 2008 R2 Standard/Datacenter/Enterprise 64bit | Да (поддерживается только частными образами) | |
Windows Server 2008 R2 Enterprise 64bit_WithGPUdriver | Да (поддерживается только частными образами) | |
Windows Server 2012 R2 Standard 64bit_WithGPUdriver | Да (поддерживается только частными образами) | |
Windows Server 2012 R2 Standard/Datacenter 64bit | Да (поддерживается только частными образами) |
OS | Image | Поддержка NIC Multi-Queue | Multi-Queue включён по умолчанию для Public Images |
|---|---|---|---|
Linux | Ubuntu 14.04/16.04 Server 64bit | Да | Да |
openSUSE 42.2 64bit | Да | Да | |
SUSE Enterprise 12 SP1/SP2 64bit | Да | Да | |
CentOS 6.8/6.9/7.0/7.1/7.2/7.3/7.4/7.5/7.6 64bit | Да | Да | |
Debian 8.0.0/8.8.0/8.9.0/9.0.0 64bit | Да | Да | |
Fedora 24/25 64bit | Да | Да | |
EulerOS 2.2 64bit | Да | Да |
Предположим, что ECS имеет требуемые характеристики и тип виртуализации.
Import the image file to the IMS console. For details, see Registering an Image File as a Private Image.
Windows has not commercially supported NIC multi-queue. If you enable NIC multi-queue for a Windows image, an ECS created from such an image may take longer than normal to start.
Use any of the following methods to enable NIC multi-queue for an image:
Method 1:
The IMS console is displayed.
Метод 2:
Консоль IMS отображается.
Method 3: Добавить hw_vif_multiqueue_enabled к образу с использованием API.
Значение X-Auth-Token это токен, полученный на шаге 1.
Установите Content-Type в application/openstack-images-v2.1-json-patch.
URI запроса имеет следующий формат:
PATCH /v2/images/{image_id}
Тело запроса имеет следующий вид:
[{"op":"add","path":"/hw_vif_multiqueue_enabled","value": true}]
Используйте зарегистрированный частный образ для создания ECS. Для получения подробностей смотрите Elastic Cloud Server Руководство пользователя. Обратите внимание на следующее при установке параметров:
KVM ECSs, работающие под Windows, используют частные образы для поддержки NIC multi-queue.
Для Linux ECSs, которые в качестве примера работают под CentOS 7.4, выполните следующие операции для включения NIC multi-queue:
ethtool -l NIC
ethtool -L NIC комбинированный Количество очередей
Пример:
[root@localhost ~]# ethtool -l eth0 #View the number of queues used by NIC eth0eth0.Channel parameters for eth0:Pre-set maximums:RX: 0TX: 0Other: 0Combined: 4 #Indicates that a maximum of four queues can be enabled for the NIC.Current hardware settings:RX: 0TX: 0Other: 0Combined: 1 #Indicates that one queue has been enabled.[root@localhost ~]# ethtool -L eth0 combined 4 #Enable four queues on NIC eth0eth0.
service irqbalance start
service irqbalance status
Если Активный значение в выводе команды содержит active (running), irqbalance был включен.
Рисунок 1 Включен irqbalance

Включение irqbalance позволяет системе автоматически распределять прерывания NIC, улучшая производительность сети. Если улучшенная производительность сети не соответствует вашим ожиданиям, вручную настройте привязку прерываний на целевом ECS.
Подробные операции следующие:
Запустите следующий скрипт, чтобы каждый ECS vCPU обрабатывает запросы прерываний, инициализированные одной очередью. То есть одна очередь соответствует одному прерыванию, и одно прерывание привязывается к одному vCPU.
#!/bin/bashservice irqbalance stopeth_dirs=$(ls -d /sys/class/net/eth*)if [ $? -ne 0 ];thenecho "Failed to find eth* , sleep 30" >> $ecs_network_logsleep 30eth_dirs=$(ls -d /sys/class/net/eth*)fifor eth in $eth_dirsdocur_eth=$(basename $eth)cpu_count=`cat /proc/cpuinfo| grep "processor"| wc -l`virtio_name=$(ls -l /sys/class/net/"$cur_eth"/device/driver/ | grep pci |awk {'print $9'})affinity_cpu=0virtio_input="$virtio_name""-input"irqs_in=$(grep "$virtio_input" /proc/interrupts | awk -F ":" '{print $1}')for irq in ${irqs_in[*]}doecho $((affinity_cpu%cpu_count)) > /proc/irq/"$irq"/smp_affinity_listaffinity_cpu=$[affinity_cpu+2]doneaffinity_cpu=1virtio_output="$virtio_name""-output"irqs_out=$(grep "$virtio_output" /proc/interrupts | awk -F ":" '{print $1}')for irq in ${irqs_out[*]}doecho $((affinity_cpu%cpu_count)) > /proc/irq/"$irq"/smp_affinity_listaffinity_cpu=$[affinity_cpu+2]donedone
XPS позволяет системе с включенной многоканальной очередью NIC выбирать очередь по vCPU при отправке пакета данных.
#!/bin/bash# enable XPS featurecpu_count=$(grep -c processor /proc/cpuinfo)dec2hex(){echo $(printf "%x" $1)}eth_dirs=$(ls -d /sys/class/net/eth*)if [ $? -ne 0 ];thenecho "Failed to find eth* , sleep 30" >> $ecs_network_logsleep 30eth_dirs=$(ls -d /sys/class/net/eth*)fifor eth in $eth_dirsdocpu_id=1cur_eth=$(basename $eth)cur_q_num=$(ethtool -l $cur_eth | grep -iA5 current | grep -i combined | awk {'print $2'})for((i=0;i<cur_q_num;i++))doif [ $i -eq $ cpu_count ];thencpu_id=1fixps_file="/sys/class/net/${cur_eth}/queues/tx-$i/xps_cpus"rps_file="/sys/class/net/${cur_eth}/queues/rx-$i/rps_cpus"cpuset=$(dec2hex "$cpu_id")echo $cpuset > $xps_fileecho $cpuset > $rps_filelet cpu_id=cpu_id*2donedone