Ширина полосы пропускания сети может продолжать увеличиваться до такой степени, что один vCPU уже не сможет обрабатывать все прерывания сетевого интерфейса. Многоочередная обработка сетевых интерфейсов позволяет нескольким vCPU обрабатывать прерывания сетевого интерфейса, тем самым улучшая производительность пакетов в секунду и ввода-вывода.
Многоочередная обработка сетевых интерфейсов может быть включена только наECSсо спецификациями, образом и типом виртуализации, описанными в данном разделе.
Если количество очередей сетевых интерфейсов больше 1, то поддерживается многоочередная обработка сетевых интерфейсов.
Выполните командуuname -rдля проверки версии ядра. Если версия старше 2.6.35, обратитесь в техническую поддержку за обновлением.
ОС | Образ | Поддержка многоочередной обработки сетевых интерфейсов |
|---|---|---|
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 | Да (только для частных образов) |
ОС | Образ | Поддержка многоочередной обработки сетевых интерфейсов | По умолчанию включено для публичных образов |
|---|---|---|---|
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 имеет требуемые спецификации и тип виртуализации.ECSимеет необходимые спецификации и тип виртуализации.
.Включите многоочередную обработку сетевых интерфейсов для образаWindows официально не поддерживает многоочередную обработку сетевых интерфейсов. При включении многоочередной обработки сетевых интерфейсов для образа Windows создание ECS из такого образа может занять больше времени, чем обычно.
Используйте любой из следующих методов для включения многоочередной обработки сетевых интерфейсов для образа:
Метод 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}
Тело запроса имеет следующий вид:
[{"op":"add","path":"/hw_vif_multiqueue_enabled","value": true}]
Используйте зарегистрированный частный образ для создания ECS. Подробнее см. в руководстве пользователя Elastic Cloud Server. При настройке параметров обратите внимание на следующее:Регион: выберите регион, где находится частное изображение.
KVM ECS под управлением Windows используют частные изображения для поддержки очереди сетевых интерфейсов.
Для серверов ECS работающих под управлением Linux, например CentOS 7.4, выполните следующие операции для включения нескольких очередей сетевых интерфейсов:
ethtool -l сетевой интерфейс
ethtool -L сетевой интерфейс комбинированный Количество очередей
Пример:
[root@localhost ~]# ethtool -l eth0 #Просмотр количества очередей, используемых сетевым интерфейсом eth0eth0.Параметры каналов для eth0:Предустановленные максимумы:RX: 0TX: 0Другие: 0Комбинированные: 4 #Указывает, что максимальное количество очередей, которые могут быть включены для сетевого интерфейса, равно четырем.Текущие аппаратные настройки:RX: 0TX: 0Другие: 0Комбинированные: 1 #Указывает, что включена одна очередь.[root@localhost ~]# ethtool -L eth0 combined 4 #Включение четырех очередей на сетевом интерфейсе eth0eth0.
service irqbalance start
service irqbalance status
Если значение Активно в выводе команды содержит активно (выполняется), то irqbalance включен.
Рисунок 1 Включенный irqbalance

Включение irqbalance позволяет системе автоматически распределять прерывания сетевого интерфейса, улучшая производительность сети. Если улучшенная производительность сети не удовлетворяет вашим ожиданиям, вручную настройте привязку прерываний на целевом 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 позволяет системе с включенной функцией многоочередного сетевого интерфейса выбирать очередь по 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