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

Как включить NIC Multi-Queue для Image?

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

Сценарии

Пропускная способность сетевого ввода-вывода может продолжать расти до такой степени, что один vCPU не способен обработать все прерывания NIC. NIC multi-queue позволяет нескольким vCPU обрабатывать прерывания NIC, тем самым повышая сетевой PPS и производительность ввода-вывода.

ECSs, поддерживающие NIC Multi-Queue

NIC multi-queue можно включить только на ECS с характеристиками, image и типом виртуализации, описанными в этом разделе.

  • Для получения подробной информации о Флейвор ECS, поддерживающих NIC multi-queue, см. раздел "Instances" в Elastic Cloud Server User Guide.
    Note

    Если существует более одной очереди NIC, поддерживается NIC multi-queue.

  • Только KVM ECSs поддерживают NIC multi-queue.
  • Публичные образы Linux, перечисленные в Table 2, поддерживают NIC multi-queue.
    Note
    • Windows не поддерживает NIC multi-queue в коммерческих условиях. Если включить NIC multi-queue для образа Windows, ECS, созданный из такого образа, может запускаться дольше обычного.
    • Для Linux ECS рекомендуется обновить ядро до версии 2.6.35 или новее. В противном случае NIC multi-queue не поддерживается.

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

Table 1 Windows ECSs, поддерживающие NIC multi-queue

ОС

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

Да (поддерживается только частными образами)

Table 2 Linux ECSкоторые поддерживают NIC multi-queue

ОС

Образ

Поддержка 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.

Включить NIC Multi-Queue для образа

Windows не поддерживает NIC multi-queue в коммерческих целях. Если включить NIC multi-queue для образа Windows, ECS, созданный из такого образа, может запускаться дольше обычного.

Используйте любой из следующих методов для включения NIC multi-queue для образа:

Метод 1:

  1. Войдите в консоль управления.
    1. В разделе Computing нажмите Image Management Service. Отобразится консоль IMS.
  2. На отображаемой странице Private Images найдите строку, содержащую образ, и нажмите Modify в столбце Operation.
  3. Включить NIC multi-queue для образа.

Метод 2:

  1. Войдите в консоль управления.
    1. В разделе Computing нажмите Image Management Service. Отобразится консоль IMS.
  2. На отображаемой странице Private Images нажмите имя образа.
  3. В правом верхнем углу отображаемой страницы сведений об образе нажмите Modify. В отображаемом диалоговом окне Modify Image включите NIC multi-queue для образа.

Метод 3: Добавьте hw_vif_multiqueue_enabled к образу с помощью API.

  1. Получите токен. Подробности см. в Calling APIs > Authentication в Image Management Service API Reference.
  2. Вызовите API для обновления образа. Подробности см. в «Modifying an Image (Native 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 из Private Image

Используйте зарегистрированный частный образ для создания ECS. Для получения подробной информации см. Elastic Cloud Server User Guide. Обратите внимание на следующее при настройке параметров:

  • Region: Выберите регион, в котором находится частный образ.
  • Image: Выберите Private image, а затем нужный образ из раскрывающегося списка.

Включите NIC Multi-Queue на ECS

KVM ECSs, работающие под Windows, используют частные образы для поддержки NIC multi-queue.

Для Linux ECSs, которые в качестве примера работают под CentOS 7.4, выполните следующие действия для включения NIC multi-queue:

  1. Включите NIC multi-queue.

    1. Войдите в ECS.
    2. Выполните следующую команду, чтобы получить количество очередей, поддерживаемых NIC, и количество очередей с включённым NIC multi-queue:

      ethtool -l NIC

    3. Выполните следующую команду для настройки количества очередей, используемых 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: 0
    TX: 0
    Other: 0
    Combined: 4 #Indicates that a maximum of four queues can be enabled for the NIC.
    Current hardware settings:
    RX: 0
    TX: 0
    Other: 0
    Combined: 1 #Indicates that one queue has been enabled.
    [root@localhost ~]# ethtool -L eth0 combined 4 #Enable four queues on NIC eth0 .

  2. (Optional) Включите irqbalance, чтобы система автоматически распределяла прерывания NIC между несколькими vCPU.

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

      service irqbalance start

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

      service irqbalance status

      Если значение Active в выводе команды содержит active (running), irqbalance включён.

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


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

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

    XPS позволяет системе с включённой поддержкой NIC multi-queue выбирать очередь по 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