Пропускная способность сетевого ввода-вывода может продолжать расти до такой степени, что один vCPU не способен обработать все прерывания NIC. NIC multi-queue позволяет нескольким vCPU обрабатывать прерывания NIC, тем самым повышая сетевой PPS и производительность ввода-вывода.
NIC multi-queue можно включить только на ECS с характеристиками, image и типом виртуализации, описанными в этом разделе.
Если существует более одной очереди NIC, поддерживается NIC multi-queue.
Выполните uname -r, чтобы проверить версию ядра. Если версия старее 2.6.35, обратитесь в техническую поддержку для её обновления.
ОС | Image | Поддержка 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 | Да (поддерживается только частными образами) |
ОС | Образ | Поддержка NIC Multi-Queue | Multi-Queue включён для публичных образов по умолчанию |
|---|---|---|---|
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 имеет необходимые характеристики и тип виртуализации.
Импортировать файл образа в консоль IMS. Для получения подробной информации см. Registering an Image File as a Private Image.
Windows не поддерживает NIC multi-queue в коммерческих целях. Если включить NIC multi-queue для образа Windows, ECS, созданный из такого образа, может запускаться дольше обычного.
Используйте любой из следующих методов для включения NIC multi-queue для образа:
Метод 1:
Метод 2:
Метод 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}
Тело запроса выглядит следующим образом:
Используйте зарегистрированный частный образ для создания ECS. Для получения подробной информации см. Elastic Cloud Server User Guide. Обратите внимание на следующее при настройке параметров:
KVM ECSs, работающие под Windows, используют частные образы для поддержки NIC multi-queue.
Для Linux ECSs, которые в качестве примера работают под CentOS 7.4, выполните следующие действия для включения NIC multi-queue:
ethtool -l NIC
ethtool -L NIC combined \u003cnumber-of-queues\u003e
Пример:
[root@localhost ~]# ethtool -l eth0 #View the number of queues used by NIC eth0 .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 eth0 .
service irqbalance start
service irqbalance status
Если значение Active в выводе команды содержит 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 multi-queue выбирать очередь по 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