Advanced
Тема интерфейса

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

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

Сценарии

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

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

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

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

    Если есть более 1 очереди NIC, поддерживается NIC multi-queue.

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

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

Таблица 1 Windows ECS, поддерживающие NIC multi-queue

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

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

Таблица 2 Linux ECSs поддерживают NIC multi-queue

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.

Enable NIC Multi-Queue for the 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:

  1. Access the IMS console.
    1. Log in to the management console.
    2. Under Computing , click Image Management Service .

      The IMS console is displayed.

  2. On the displayed Private Images странице, найдите строку, содержащую образ, и нажмите Изменить в Операция столбце.
  3. Включить NIC multi-queue для образа.

Метод 2:

  1. Откройте консоль IMS.
    1. Войдите в консоль управления.
    2. Под Вычисление , нажмите Image Management Service .

      Консоль IMS отображается.

  2. На отображенной Приватные образы странице, нажмите имя образа.
  3. В правом верхнем углу отображаемой страницы сведений об образе нажмите Изменить . В отображаемом Изменить образ в диалоговом окне включите NIC multi-queue для образа.

Method 3: Добавить hw_vif_multiqueue_enabled к образу с использованием API.

  1. Получите токен. Для получения подробной информации см. Вызов API > Аутентификация в Image Management Service Справочник API.
  2. Вызовите API для обновления информации об образе. Для получения подробной информации см. "Updating Image Information (Native OpenStack API)" в Image Management Service Справочник API.
  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 Руководство пользователя. Обратите внимание на следующее при установке параметров:

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

Включить 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 комбинированный Количество очередей

    Пример:

    [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 на несколько vCPUs.

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

      service irqbalance start

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

      service irqbalance status

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

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


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

    Включение 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. (Опционально) Включить XPS и RPS.

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