10GbE be2net низкая производительность pktgen

Я тестирую сетевую производительность двух рабочих станций, каждая из которых имеет четырехъядерные процессоры Xeon 2,4 ГГц и двухпортовый серверный адаптер PCIe NC550SFP PCIe, соединенные друг с другом.

Я проверил пропускную способность ОЗУ, которая составляет ~12 Гбит / с, поэтому здесь нет узких мест. Скорость шины PCIe тоже в порядке.

Я тестирую максимальный pps, используя минимальный размер пакета для UDP, и результаты печальны по сравнению с этими: 2012-lpc-network-qdisc-fastabend.pdf (извините, я могу опубликовать только одну ссылку). Если я увеличу размер пакета и MTU, я смогу получить почти линейную скорость (~9,9 Гбит / с).

Я использую pktgen со скриптами NST, интерфейсами macvlan для нескольких потоков, и я получаю только ~1Mpps, все четыре ядра на 100%.

Чтобы улучшить производительность передачи pktgen, я наткнулся на этот документ: масштабирование в сетевом стеке Linux

Я проверил и да, у меня есть mq qdiscs, который должен дать самую высокую производительность:

# ip link list | grep eth3
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000

Я думаю, что проблема заключается в том, что используется только одна очередь TX:

# dmesg | grep be2net
[    4.528058] be2net 0000:01:00.1: irq 47 for MSI/MSI-X
[    4.528066] be2net 0000:01:00.1: irq 48 for MSI/MSI-X
[    4.528073] be2net 0000:01:00.1: irq 49 for MSI/MSI-X
[    4.528079] be2net 0000:01:00.1: irq 50 for MSI/MSI-X
[    4.528104] be2net 0000:01:00.1: enabled 4 MSI-x vector(s)
[    4.696026] be2net 0000:01:00.1: created 4 RSS queue(s) and 1 default RX queue
[    4.761108] be2net 0000:01:00.1: created 1 TX queue(s)

Я получил подсказку о том, как включить несколько очередей передачи из масштабирования в сетевом стеке Linux:

Драйвер для NIC с поддержкой нескольких очередей обычно предоставляет параметр модуля ядра или указывает количество аппаратных очередей для настройки. Например, в драйвере bnx2x этот параметр называется num_queues. Типичная конфигурация RSS будет иметь одну очередь приема для каждого ЦП, если устройство поддерживает достаточное количество очередей, или, по крайней мере, по меньшей мере одну для каждого домена памяти, где домен памяти представляет собой набор ЦП, которые совместно используют определенный уровень памяти (L1, L2, Узел NUMA и т. Д.).

Я просмотрел всю документацию по драйверу be2net от Emulex и даже отправил им электронное письмо, но не повезло. Я также просмотрел исходный код ядра.

Я получил последнюю версию ядра (3.10) на Ubuntu 12.04 с последней прошивкой на сетевых картах.

Идеи кого-нибудь?

Спасибо!

1 ответ

У меня была похожая (?) Проблема с коробкой Red Hat Enterprise Linux. Я прочитал ту же статью и пришел к выводу, что моя настоящая проблема заключалась в том, что по умолчанию используется каждый возможный IRQ для вовлечения каждого ЦП в работу сетевых пакетов. Я сосредоточил работу IRQ на подмножестве доступных ядер, а затем соответственно руководил работой. Вот файл rc.local:

# Reserve CPU0 as the default default IRQ handler
for IRQ in `grep eth0 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
for IRQ in `grep eth1 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
for IRQ in `grep eth2 /proc/interrupts | cut -d ':' -f 1`; do echo 2 > /proc/irq/$IRQ/smp_affinity; done
for IRQ in `grep eth4 /proc/interrupts | cut -d ':' -f 1`; do echo $(( (($IRQ & 1) + 1) << 2 )) > /proc/irq/$IRQ/smp_affinity; done

Вот файл cgrules.conf, который определяет / отличает мой веб-сервер apache от 10gbe, так что может произойти серьезная пропускная способность сети, как и предполагалось:

apache      cpuset,cpu  apache/

А вот файл cgconfig.conf, который фактически отделяет сервер от остальной активности ЦП:

mount {
    cpuset  = /cgroup/cpuset;
    cpu = /cgroup/cpu;
    cpuacct = /cgroup/cpuacct;
    memory  = /cgroup/memory;
    devices = /cgroup/devices;
    freezer = /cgroup/freezer;
    net_cls = /cgroup/net_cls;
    blkio   = /cgroup/blkio;
}

group apache {
    cpuset {
        cpuset.memory_spread_slab="0";
        cpuset.memory_spread_page="0";
        cpuset.memory_migrate="0";
        cpuset.sched_relax_domain_level="-1";
        cpuset.sched_load_balance="1";
        cpuset.mem_hardwall="0";
        cpuset.mem_exclusive="0";
        cpuset.cpu_exclusive="0";
        cpuset.mems="1";
        cpuset.cpus="4-7,12-15";
    }
}

group apache {
    cpu {
        cpu.rt_period_us="1000000";
        cpu.rt_runtime_us="0";
        cpu.cfs_period_us="100000";
        cpu.cfs_quota_us="-1";
        cpu.shares="1024";
    }
}

Конфигурация по умолчанию (без взломов IRQ и cgroups). Я измерял пропускную способность сети около 5 Гбит / с. С сосредоточенными IRQ и удаленным случайным сетевым вводом-выводом я измерил производительность на скорости около 9,5 Гбит / с, используя netperf.

nb большие пакеты не имеют значения, ни до, ни после.

Другие вопросы по тегам