Рубрики
Uncategorized

Ядра Linux и измерительная пропускная способность сети.

Эта статья была первоначально опубликована в моем личном блоге Toonk.io Can Linux Manager по ставке на линии … Теги с Linux, DevOps, DPDK, учебником.

Эта статья была первоначально опубликована в моем личном блоге toonk.io

Может ли Linux маршрут по скорости линии между двумя сетевыми интерфейсами? Это вопрос, который мы постараемся ответить в ближайшие несколько минут.

В моем последний блог Я писал о том, как мы можем использовать DPDK Pktgen для тестирования производительности. Сегодня я провел некоторое время на некоторых базовых тестировании, чтобы увидеть, что мы можем ожидать из системы Vanilla Linux в настоящее время при использовании в качестве маршрутизатора. За последние два года я играл на более справедливый бит с сетью байпаса ядра и надеюсь написать об этом в ближайшем будущем. Обещание сетевого обхода ядра является более высокой производительностью, чтобы определить, насколько масштабируются производительность на ядре, нам нужно сначала установить базовый уровень, мы сделаем это в этой статье.

N2.LARGE.x86 CPU SPECS.

Я использую два N2.xlarge.x86 Сервера от packet.com. С двумя узлами NUMA 16CORES на гнездо, 32 ядра в общей сложности, 64 с гипер-резьбой, это очень обильная машина! Он также поставляется с четырехпортом Intel X710 NIC, давая нам 4 х 10 ГБ. Пакет позволяет создавать пользовательские VLAN и назначить сетевые порты на VLAN. Я создал два VLAN и назначил один NIC для каждого VLAN. Настройка выглядит ниже.

Испытательная установка

Устройство в соответствии с тестом (DUT), является системой Vanilla Ubuntu 19.04, запущенная 5,0-38-дюймовое ядро. Единственная небольшая мелодия, которую я сделал, это установить кольцо NIC RX до 4096. И я включил экспедирование IP ()

Используя Генератор движения Я посылаю столько пакетов и наблюдающую, когда пакеты перестают возвращаться с той же скоростью, что указывает на потерю пакета. Я записываю точку, которая происходит как максимальная пропускная способность. Я также поддерживаю непосредственное внимание на использование ЦП, чтобы получить ощущение того, сколько ядер CPU (гиперток) необходимо для обслуживания трафика.

Первый тест был легким. Я просто отправляю пакеты от 10.10.11.1 до 10.10.12.1 и наоборот, через DUT (тестируемое устройство), которое маршрутирует пакеты между двумя интерфейсами EnO2 и ENO4. Обратите внимание, что в том, что я сделал один из нанесенного теста (10.10.11.1, 10.10.12.1) и двунаправленный тест (10.10.11.1> 10.10.12.1 и 10.10.12.1> 10.10.11.1). Я также проверил только с одним потоком, а с 10 000 потоков.

Это важно, так как ник не делает что-то называемое Получить боковую масштабирование (RSS) , который будет загружать баланс разных потоков на разные очереди получения NAC. Затем каждая очередь обслуживается другим ядром, что означает системную масштабы по горизонтали. Но имейте в виду, вы все равно можете быть ограничены тем, что может сделать одно ядро в зависимости от ваших шаблонов трафика.

Хорошо, покажи мне результаты! Имейте в виду, что мы разговариваем в основном о пакетах в секунду (PPS), так как это является основным показателем производительности, не очень актуально, сколько данных закинутся в каждом пакете. В мире Linux Networking она действительно сводится к тому, сколько прерывает в секунду, может обработать систему.

В результатах выше, вы можете увидеть, что один поток может идти максимум 1,4 мпс. В этот момент ядро, обслуживающее то, что очередь максимается (работает 100%) и не может обрабатывать больше пакетов и начнет падать. Однопроизводительная эффективность пересылки потока хорош для знания для использования DDOS или больших сетевых потоков единичных потоков, таких как ESP. Для таких услуг, как это, производительность так же хороша, как одно очередь очередь/процессор.

При одном и том же тесте с 10 000 потоками я получаю 14 MPPS, полную скорость линии 10G на наименьшем возможных размерах пакета (64b), yay! На данный момент я могу видеть, как все ядра выполняют справедливое количество работы. Это ожидается и связано с перемешиванием потоков по разным очередям. Глядя на использование ЦП, я оцениваю, вам нужно примерно 16 ядер при 100% использовании для обслуживания этого количества пакетов (прерывания).

Интересно, что я не смог добраться до полной скорости линии при проведении двунаправленного теста. Значение оба никса оба отправляют, так и получают одновременно. Несмотря на то, что я получаю достаточно близко при 12 мпс (всего 24мпс всего на NIC). Когда Imageballing Usage CPU и количество простоя останутся, я бы ожидал, что вам нужно примерно 26 ядер при обычном использовании на 100%.

В этом тесте мы добавляем два простых правила iptables к DUT, чтобы увидеть, какое влияние. Гипотеза вот что, поскольку мы сейчас собираемся попросить систему вызывать Conntrack и выполнить сопоставление состояния сеанса, мы начинаем выполнять больше кода, что может повлиять на производительность и системную нагрузку. Этот тест покажет нам влияние этого.

Добавлены правила iptables:

iptables -I FORWARD -d 10.10.11.1 -m conntrack — ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -d 10.10.12.1 -m conntrack — ctstate RELATED,ESTABLISHED -j ACCEPT

Результаты для теста производительности отдельных потоков выглядят точно так же, это хорошо. Результаты для тестирования 10 000 потоков, выглядят так же, как дело доходит до пакета в секунду. Тем не менее, нам нужно простое количество дополнительного процессора, чтобы выполнить работу. Хорошая вещь, наша тестовая система имеет много. Таким образом, вы все еще можете добиться (близко) к полной скорости линии с простыми правилами Iptably iptables, если у вас достаточно CPU. Обратите внимание, что в этом случае государственная таблица имела 10 000 государственных записей. Я не проверил с большим количеством правил iptables.

В этом тесте мы начинаем с нуля, поскольку мы сделали в тесте 1, и я добавляю простое правило NAT, которое приводит к тому, что все пакеты проходят через DUT, чтобы переписать на новый источник IP. Это два правила:

iptables -I POSTROUTING -t nat -d 10.10.12.1 -s 10.10.11.1 -j SNAT — to 10.10.12.2iptables -I POSTROUTING -t nat -d 10.10.11.1 -s 10.10.12.1 -j SNAT — to 10.10.11.2

Результаты ниже совершенно разные, чем то, что мы видели ранее.

Результаты показывают, что перезаписи пакетов довольно дороже, чем просто допустить или сбрасывать пакет. Например, если мы посмотрим на однонаправленный тест с 10 000 потоками, мы видим, что мы сбросили с 14 м PPS (Test 1) до 3,2 МПП, нам также больше нужно 13 ядер, чтобы сделать это!

Для чего стоит, я сделал быстрое измерение с использованием Nftables вместо iPtables, но не видел никаких существенных изменений в производительности NAT.

Одним из вопросов, которые я начал этот эксперимент: Can Linux маршрут по скорости линии между двумя сетевыми интерфейсами? Ответ да, мы видели 14мплс (однонаправленные), пока есть достаточные потоки, и у вас достаточно ядер (~ 16). Двунаправленный тест добрался до 12 млк (всего 24мплсных общего пользования на NIC) с 26CORES на 100%.

Мы также видели, что с добавлением двух правил IPTables Iptables я все еще смог получить ту же пропускную способность, но нужен дополнительный процессор для работы. Так, по крайней мере, это масштабирует горизонтально.

Наконец, мы увидели довольно драматическую падение производительности при добавлении правил Snat для тестирования. С Snat максимум я смог выйти из системы, составил 5,9 млс; Это было для 20K сеансов (10k на направление).

Итак, да, вы можете построить близко к маршрутизатору скорости линии в Linux, если у вас есть достаточные ядра и не слишком много манипуляций пакетов. Все вообще, интересный тест, и теперь у нас есть начальный ориентир для будущего (байпас ядра/в юности) Сетевые эксперименты на Linux!

Оригинал: «https://dev.to/atoonk/linux-kernel-and-measuring-network-throughput-18mp»