Облачная платформаAdvanced

Как включить многоочередную обработку сетевых интерфейсов для образа?

Язык статьи: Русский
Показать оригинал
Страница переведена автоматически и может содержать неточности. Рекомендуем сверяться с английской версией.

Сценарии использования

Ширина полосы пропускания сети может продолжать увеличиваться до такой степени, что один vCPU уже не сможет обрабатывать все прерывания сетевого интерфейса. Многоочередная обработка сетевых интерфейсов позволяет нескольким vCPU обрабатывать прерывания сетевого интерфейса, тем самым улучшая производительность пакетов в секунду и ввода-вывода.

Типы ECS, поддерживающие многоочередную обработку сетевых интерфейсов

Многоочередная обработка сетевых интерфейсов может быть включена только наECSсо спецификациями, образом и типом виртуализации, описанными в данном разделе.

  • Для получения подробной информации о флейворах ECS, которые поддерживают многоочередную обработку сетевых интерфейсов, см. раздел «Инстансы» в руководстве пользователя Elastic Cloud Server.
    Note

    Если количество очередей сетевых интерфейсов больше 1, то поддерживается многоочередная обработка сетевых интерфейсов.

  • Только ECS на базе KVM поддерживают многоочередную обработку сетевых интерфейсов.
  • Перечисленные в таблице 2 общедоступные образы Linux поддерживают многоочередную обработку сетевых интерфейсов.Таблица 2
    Note
    • Windows официально не поддерживает многоочередную обработку сетевых интерфейсов. При включении многоочередной обработки сетевых интерфейсов для образа Windows создание ECS из такого образа может занять больше времени, чем обычно.
    • Для ECS под управлением Linux рекомендуется обновить ядро до версии 2.6.35 или выше. Иначе поддержка многоочередной обработки сетевых интерфейсов будет отсутствовать.ECSна основе Linux следует обновить ядро до версии 2.6.35 или более поздней. В противном случае многоочередная обработка сетевых интерфейсов не поддерживается.

      Выполните командуuname -rдля проверки версии ядра. Если версия старше 2.6.35, обратитесь в техническую поддержку за обновлением.

Таблица 1WindowsECSподдерживающие многоочередную обработку сетевых интерфейсов

ОС

Образ

Поддержка многоочередной обработки сетевых интерфейсов

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

Да (только для частных образов)

Таблица 2LinuxECSподдерживающие многоочередную обработку сетевых интерфейсов

ОС

Образ

Поддержка многоочередной обработки сетевых интерфейсов

По умолчанию включено для публичных образов

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:

  1. Войдите в консоль управления.
    1. На вкладкеВычисления, нажмитеImage Management Service. Откроется консоль IMS.
  2. На страницеЧастные образы, найдите строку с нужным образом и нажмите кнопкуИзменитьв колонкеОперации
  3. Включите поддержку нескольких очередей сетевого интерфейса для образа.

Метод 2:

  1. Войдите в консоль управления.
    1. Под Вычисления, нажмите Image Management Service. Откроется консоль IMS.
  2. На отображаемой странице Частные образы щелкните имя образа.
  3. В правом верхнем углу открывшейся страницы сведений об образе нажмите Изменить. В диалоговом окне Изменение образа включите несколько очередей сетевых интерфейсов для этого образа.

Метод 3:Добавьте hw_vif_multiqueue_enabled к образу через API.

  1. Получите токен. Подробности см. в разделе Обращение к API > Аутентификацияв документе Справочное руководство по API службы управления образами.
  2. Выполните вызов API для обновления образа. Для получения подробной информации обратитесь к разделу «Изменение образа (родной API OpenStack)» в справочном руководстве по API службы управления образами.Image Management Service API Reference.
  3. Добавьте X-Auth-Token в заголовок запроса.

    Значение X-Auth-Token является токеном, полученным на шаге 1.

  4. Добавьте Content-Type в заголовок запроса.

    Установите 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 из частного образа

Используйте зарегистрированный частный образ для создания ECS. Подробнее см. в руководстве пользователя Elastic Cloud Server. При настройке параметров обратите внимание на следующее:Регион: выберите регион, где находится частное изображение.

  • Образ: выберите
  • Частный образ а затем нужный образ из раскрывающегося списка.Включение поддержки нескольких очередей сетевых интерфейсов на сервере ECS

KVM ECS под управлением Windows используют частные изображения для поддержки очереди сетевых интерфейсов.

Для серверов ECS работающих под управлением Linux, например CentOS 7.4, выполните следующие операции для включения нескольких очередей сетевых интерфейсов:

  1. Включите несколько очередей сетевых интерфейсов.

    1. Войдите на ECS.
    2. Запустите следующую команду, чтобы узнать количество очередей, поддерживаемых сетевым интерфейсом, и количество очередей с поддержкой нескольких очередей сетевых интерфейсов:

      ethtool -l сетевой интерфейс

    3. Запустите следующую команду, чтобы настроить количество очередей, используемых сетевым интерфейсом:

      ethtool -L сетевой интерфейс комбинированный Количество очередей

    Пример:

    [root@localhost ~]# ethtool -l eth0 #Просмотр количества очередей, используемых сетевым интерфейсом eth0eth0.
    Параметры каналов для eth0:
    Предустановленные максимумы:
    RX: 0
    TX: 0
    Другие: 0
    Комбинированные: 4 #Указывает, что максимальное количество очередей, которые могут быть включены для сетевого интерфейса, равно четырем.
    Текущие аппаратные настройки:
    RX: 0
    TX: 0
    Другие: 0
    Комбинированные: 1 #Указывает, что включена одна очередь.
    [root@localhost ~]# ethtool -L eth0 combined 4 #Включение четырех очередей на сетевом интерфейсе eth0eth0.

  2. (Необязательно) Включите irqbalance, чтобы система автоматически распределяла прерывания сетевого интерфейса между несколькими виртуальными процессорами.

    1. Запустите следующую команду для включения irqbalance:

      service irqbalance start

    2. Запустите следующую команду, чтобы проверить состояние irqbalance:

      service irqbalance status

      Если значение Активно в выводе команды содержит активно (выполняется), то irqbalance включен.

      Рисунок 1 Включенный irqbalance


  3. (необязательно) Включите привязку прерываний.

    Включение irqbalance позволяет системе автоматически распределять прерывания сетевого интерфейса, улучшая производительность сети. Если улучшенная производительность сети не удовлетворяет вашим ожиданиям, вручную настройте привязку прерываний на целевом ECS.

    Подробные действия выглядят следующим образом:

    Запустите следующий скрипт, чтобы каждая ECS vCPU отвечала на запросы прерываний, инициированные одной очередью. То есть одна очередь соответствует одному прерыванию, а одно прерывание связано с одним vCPU.

    #!/bin/bash
    service irqbalance stop
    eth_dirs=$(ls -d /sys/class/net/eth*)
    if [ $? -ne 0 ];then
    echo "Failed to find eth* , sleep 30" >> $ecs_network_log
    sleep 30
    eth_dirs=$(ls -d /sys/class/net/eth*)
    fi
    for eth in $eth_dirs
    do
    cur_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=0
    virtio_input="$virtio_name""-input"
    irqs_in=$(grep "$virtio_input" /proc/interrupts | awk -F ":" '{print $1}')
    for irq in ${irqs_in[*]}
    do
    echo $((affinity_cpu%cpu_count)) > /proc/irq/"$irq"/smp_affinity_list
    affinity_cpu=$[affinity_cpu+2]
    done
    affinity_cpu=1
    virtio_output="$virtio_name""-output"
    irqs_out=$(grep "$virtio_output" /proc/interrupts | awk -F ":" '{print $1}')
    for irq in ${irqs_out[*]}
    do
    echo $((affinity_cpu%cpu_count)) > /proc/irq/"$irq"/smp_affinity_list
    affinity_cpu=$[affinity_cpu+2]
    done
    done

  4. (Optional) Enable XPS and RPS.

    XPS позволяет системе с включенной функцией многоочередного сетевого интерфейса выбирать очередь по vCPU при отправке пакета данных.

    #!/bin/bash
    # enable XPS feature
    cpu_count=$(grep -c processor /proc/cpuinfo)
    dec2hex(){
    echo $(printf "%x" $1)
    }
    eth_dirs=$(ls -d /sys/class/net/eth*)
    if [ $? -ne 0 ];then
    echo "Failed to find eth* , sleep 30" >> $ecs_network_log
    sleep 30
    eth_dirs=$(ls -d /sys/class/net/eth*)
    fi
    for eth in $eth_dirs
    do
    cpu_id=1
    cur_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++))
    do
    if [ $i -eq $ cpu_count ];then
    cpu_id=1
    fi
    xps_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_file
    echo $cpuset > $rps_file
    let cpu_id=cpu_id*2
    done
    done