Инструмент распространения пакетов ядра Linux, инструмент распространения пакетов ядра Linux, описание плана тестирования pktgen «рекомендуемая коллекция»
Инструмент распространения пакетов ядра Linux, инструмент распространения пакетов ядра Linux, описание плана тестирования pktgen «рекомендуемая коллекция»

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

Введение

pktgenдаLinuxВысокопроизводительный дистрибутив, входящий в состав ядра.инструмент,В основном используется длятестПроизводительность сети。Обычно,использоватьpktgenОн может удовлетворить гигабитную сетевую картутестнуждаться。 pktgen работает в «режиме ядра» и не занимает слишком много системных ресурсов, поэтому может достигать очень высокой скорости отправки пакетов.

pktgen поддерживает только отправку пакетов UDP (порт 9). Потому что pktgen — это инструмент тестирования очень низкого уровня, и он обычно проверяет производительность сетевого оборудования и не задействует уровень приложений. Если вы хотите протестировать производительность расширенных сетевых приложений, используйте другие инструменты тестирования.

Преимущество Pktgen заключается в том, что он может указать конкретный порт отправки пакетов на основе MAC-адреса вместо маршрутизации. Вы можете использовать этот инструмент ядра для проверки пропускной способности оптического модуля/кабеля SFP+, а также можете использовать pktgen для проверки производительности сетевой карты (сравнение производительности различных сетевых карт в одной и той же конфигурации сервера).

В этом тесте используется патч pktgen_rx, основанный на оригинальном модуле ядра pktgen, и добавляется статистическая функция сбора пакетов.

Установить

Ядро Linux поставляется с модулем pktgen, который не имеет статистической функции rx. Если вам нужна функция rx, вам необходимо скачать патч pktgen_rx.tgz, адрес загрузки.

Экспериментальная среда:

Модель машины: DELL R720

ЦП: Intel(R) Xeon(R) CPU E5-2680 v2 @ 2,80 ГГц (20 ядер, 40 потоков)

Версия ядра 2.6.37

Загрузите pktgen_rx.tgz по указанному выше URL-адресу, разархивируйте его и войдите в каталог pktgen.

Скопируйте исходный код ядра в /usr/src/kernels/ и затем скомпилируйте

Появится сообщение о том, что с функцией возникла проблема. Измените ее следующим образом.

Изменить на

Скомпилировать еще раз

Вы можете использовать его, непосредственно установив его

тест

Топология тест тест

Отправка тестовых пакетов с eth6 на eth7 и получение скрипта оболочки пакетов

pktgen.sh

#!/bin/sh

# pktgen.conf — Sample configuration for send on two devices on a UP system

#modprobe pktgen

function pgset() {

local result

echo 1 >

result=`cat $PGDEV | fgrep “Result: OK:”`

if [ “$result” = “” ]; then

cat $PGDEV | fgrep Result:

fi

}

function pg() {

echo inject > $PGDEV

cat $PGDEV

}

#rx config

#Disable autonegotion in the interface

/sbin/ethtool -A $1 autoneg off rx off tx off

# Конфигурация приема Конфигурация статистики сбора пакетов

PGDEV=/proc/net/pktgen/pgrx

echo “Removing old config”

pgset “rx_reset”

echo “Adding rx $1”

pgset “rx $1”

echo “Setting statistics $2(counters/basic/time)”

pgset “statistics $2”

pgset “display $3”

# pgset “display script/human”

# Result can be vieved in /proc/net/pktgen/eth1

#cat /proc/net/pktgen/pgrx

# We use eth6

echo “Adding devices to run”.

PGDEV=/proc/net/pktgen/kpktgend_0

pgset “rem_device_all”

pgset “add_device eth6” #Измените устройство сетевого порта в соответствии с реальной ситуацией

pgset “max_before_softirq 10000”

# Configure the individual devices

echo “Configuring devices”

PGDEV=/proc/net/pktgen/eth6 #Измените устройство сетевого порта в соответствии с реальной ситуацией.

pgset “clone_skb 10000”

pgset «pkt_size 1514» #Изменить размер пакета в соответствии с фактическим тестом

pgset «dst_mac 00:16:31:F0:84:D1» #Изменение на основе фактического теста

pgset «count 0» #Set count=0 для отправки неограниченного количества пакетов

# Time to run

PGDEV=/proc/net/pktgen/pgctrl

echo “Running… ctrl^C to stop”

pgset “start”

echo “Done”

Во время работы установите $2 для времени, и вы сможете просмотреть соответствующие джиттер и задержку в /proc/net/pktgen/pgrx, как показано ниже.

скриншот теста:

Скриншот запуска скрипта pktgen

Снимок экрана потока данных во время процесса тестирования

Сравните снимки экрана отправки пакетов eth6 и получения пакетов eth7.

Из красного поля видно, что пакеты отправки и получения одинаковы.,Пропускная способность, вероятно, достигла более 9,8G.,Конечно, размер упаковки можно изменить самостоятельно.,Если в тесте происходит потеря пакетов,Пожалуйста, проверьте это еще несколько раз.

И с моей точки зрения,Вывод следует сделать один: чем лучше процессор,Чем больше пакетов может быть отправлено в секунду,Чем выше вероятность достижения линейной скорости,в моей тестовой среде,Аутсорсинг, вероятно, может достичь 4Mpps.

eth6 отправляет пакеты, а eth7 получает пакеты, eth7 отправляет пакеты, а eth6 получает пакеты.

pktgen_eth6_eth7.sh

#! /bin/sh

#modprobe pktgen

pgset() {

local result

echo 1 >

result=`cat $PGDEV | fgrep “Result: OK:”`

if [ “$result” = “” ]; then

cat $PGDEV | fgrep Result:

fi

}

pg() {

echo inject > $PGDEV

cat $PGDEV

}

# Config Start Here ————————————————

# thread config

# Each CPU has own thread. Two CPU exammple. We add eth3, eth2 respectivly.

/sbin/ethtool -A $1 autoneg off rx off tx off

# Reception configuration

PGDEV=/proc/net/pktgen/pgrx

echo “Removing old config”

pgset “rx_reset”

echo “Adding rx $1”

pgset “rx $1”

echo “Setting statistics $2”

pgset “statistics $2”

pgset “display human”

# pgset “display script”

PGDEV=/proc/net/pktgen/kpktgend_0

echo “Removing all devices”

pgset “rem_device_all”

echo “Adding eth6”

pgset “add_device eth6”

echo “Setting max_before_softirq 10000”

pgset “max_before_softirq 10000”

PGDEV=/proc/net/pktgen/kpktgend_1

echo “Removing all devices”

pgset “rem_device_all”

echo “Adding eth7”

pgset “add_device eth7”

echo “Setting max_before_softirq 10000”

pgset “max_before_softirq 10000”

# device config

# delay 0 means maximum speed.

CLONE_SKB=”clone_skb 1000000″

# NIC adds 4 bytes CRC

#COUNT=”count 0″

PKT_SIZE=”pkt_size 1514″

COUNT=”count 0″

DELAY=”delay 0″

PGDEV=/proc/net/pktgen/eth6

echo “Configuring $PGDEV”

pgset “$COUNT”

pgset “$CLONE_SKB”

pgset “$PKT_SIZE”

pgset “$DELAY”

#pgset “src_min 100.1.1.2”

#pgset “src_max 100.1.1.254”

pgset “dst 200.1.1.2”

pgset “dst_mac 00:16:31:F0:84:D1”

PGDEV=/proc/net/pktgen/eth7

echo “Configuring $PGDEV”

pgset “$COUNT”

pgset “$CLONE_SKB”

pgset “$PKT_SIZE”

pgset “$DELAY”

#pgset “src_min 200.1.1.2”

#pgset “src_max 200.1.1.254”

pgset “dst 100.1.1.2”

pgset “dst_mac 00:16:31:F0:84:D0”

# Time to run

PGDEV=/proc/net/pktgen/pgctrl

echo “Running… ctrl^C to stop”

pgset “start”

echo “Done”

pktgen_eth6_eth7.sh умеет считать данные только одного порта: ./pktgen_eth6_eth7.sh счетчики eth6 (разницы в выборе счетчиков/базовых/времени нет, причина неизвестна)

Вы также можете собрать статистику по обоим портам: запустите напрямую ./pktgen_eth6_eth7.sh.

Примечание. Если вы сначала запустите pktgen_eth6_eth7.sh, а затем запустите pktgen.sh, только eth6 должен отправлять пакеты, но в результате пакеты будут отправлять и eth6, и eth7. На данный момент решение состоит в том, чтобы сначала удалить pktgen.ko, а затем загрузить его.

Два вышеупомянутых типа теста могут достигать скорости около 4 млн пакетов в секунду в случае небольших пакетов.,Увеличить темпы аутсорсинга,Использование многоядерной и многопоточной обработки,Код выглядит следующим образом (по-прежнему отправка пакетов с eth6 и получение пакетов с eth7)

pktgen_multicore.sh

#! /bin/sh

# $1 Rate in packets per s

# $2 Number of CPUs to use

function pgset() {

local result

echo 1 >

}

# Reception configuration

PGDEV=/proc/net/pktgen/pgrx

echo “Removing old config”

pgset “rx_reset”

echo “Adding rx eth7”

pgset “rx eth7”

echo “Setting statistics counters”

pgset “statistics counters”

pgset “display human”

# pgset “display script”

# Result can be vieved in /proc/net/pktgen/eth1

#cat /proc/net/pktgen/pgrx

# Config Start Here ———————————————————–

# thread config

CPUS=$2

#PKTS=`echo “scale=0; 3/CPUS” | bc`

CLONE_SKB=”clone_skb 10000″

PKT_SIZE=”pkt_size 60″

COUNT=”count 0″

DELAY=”delay 0″

MAC=”00:16:31:F0:84:D1″

ETH=”eth6″

RATEP=`echo “scale=0; 1/CPUS” | bc`

для процессора в {0..14} #kpktgen_0 до 14

do

PGDEV=/proc/net/pktgen/kpktgend_$processor

# echo “Removing all devices”

pgset “rem_device_all”

done

for ((processor=0;processor

do

PGDEV=/proc/net/pktgen/kpktgend_$processor

# echo “Adding $ETH”

pgset “add_device ETH@processor”

PGDEV=/proc/net/pktgen/ETH@processor

# echo “Configuring $PGDEV”

pgset “$COUNT”

pgset “flag QUEUE_MAP_CPU”

pgset “$CLONE_SKB”

pgset “$PKT_SIZE”

#pgset “$DELAY”

pgset “ratep $RATEP”

#pgset “dst 10.0.0.1”

pgset “dst_mac $MAC”

#Random address with in the min-max range

#pgset “flag IPDST_RND”

pgset “src_min 1.0.0.0”

pgset “src_max 100.255.255.255”

#enable configuration packet

#pgset “config 1” #config [0 or 1] Enables or disables the configuration packet, which reset the statistics and allows to calculate the losses.

#pgset “flows 1024”

#pgset “flowlen 8”

done

# Time to run

PGDEV=/proc/net/pktgen/pgctrl

echo “Running… ctrl^C to stop”

pgset “start”

echo “Done”

В то же время установите соответствие многоочередности сетевой карты и процессора следующим образом:

Eth6 привязан к CPU0-19.

[root@localhost pktgen]# echo 1 > /proc/irq/122/smp_affinity

[root@localhost pktgen]# echo 2 > /proc/irq/123/smp_affinity

[root@localhost pktgen]# echo 4 > /proc/irq/124/smp_affinity

[root@localhost pktgen]# echo 8 > /proc/irq/125/smp_affinity

[root@localhost pktgen]# echo 10 > /proc/irq/126/smp_affinity

[root@localhost pktgen]# echo 20 > /proc/irq/127/smp_affinity

[root@localhost pktgen]# echo 40 > /proc/irq/128/smp_affinity

[root@localhost pktgen]# echo 80 > /proc/irq/129/smp_affinity

[root@localhost pktgen]# echo 100 > /proc/irq/130/smp_affinity

[root@localhost pktgen]# echo 200 > /proc/irq/131/smp_affinity

[root@localhost pktgen]# echo 400 > /proc/irq/132/smp_affinity

[root@localhost pktgen]# echo 800 > /proc/irq/133/smp_affinity

[root@localhost pktgen]# echo 1000 >/proc/irq/134/smp_affinity

[root@localhost pktgen]# echo 2000 >/proc/irq/135/smp_affinity

[root@localhost pktgen]# echo 4000 >/proc/irq/136/smp_affinity

[root@localhost pktgen]# echo 8000 >/proc/irq/137/smp_affinity

[root@localhost pktgen]# echo 10000 >/proc/irq/138/smp_affinity

[root@localhost pktgen]# echo 20000 >/proc/irq/139/smp_affinity

[root@localhost pktgen]# echo 40000 >/proc/irq/140/smp_affinity

[root@localhost pktgen]# echo 80000 >/proc/irq/141/smp_affinity

Eth7 привязан к CPU0-19.

[root@localhost pktgen]# echo 1 > /proc/irq/143/smp_affinity

[root@localhost pktgen]# echo 2 > /proc/irq/144/smp_affinity

[root@localhost pktgen]# echo 4 > /proc/irq/145/smp_affinity

[root@localhost pktgen]# echo 8 > /proc/irq/146/smp_affinity

[root@localhost pktgen]# echo 10 > /proc/irq/147/smp_affinity

[root@localhost pktgen]# echo 20 > /proc/irq/148/smp_affinity

[root@localhost pktgen]# echo 40 > /proc/irq/149/smp_affinity

[root@localhost pktgen]# echo 80 > /proc/irq/150/smp_affinity

[root@localhost pktgen]# echo 100 > /proc/irq/151/smp_affinity

[root@localhost pktgen]# echo 200 > /proc/irq/152/smp_affinity

[root@localhost pktgen]# echo 400 > /proc/irq/153/smp_affinity

[root@localhost pktgen]# echo 800 > /proc/irq/154/smp_affinity

[root@localhost pktgen]# echo 1000 >/proc/irq/155/smp_affinity

[root@localhost pktgen]# echo 2000 >/proc/irq/156/smp_affinity

[root@localhost pktgen]# echo 4000 >/proc/irq/157/smp_affinity

[root@localhost pktgen]# echo 8000 >/proc/irq/158/smp_affinity

[root@localhost pktgen]# echo 10000 >/proc/irq/159/smp_affinity

[root@localhost pktgen]# echo 20000 >/proc/irq/160/smp_affinity

[root@localhost pktgen]# echo 40000 >/proc/irq/161/smp_affinity

[root@localhost pktgen]# echo 80000 >/proc/irq/162/smp_affinity

Примечание. Очередь сетевой карты привязана к процессору на основе IP-адреса и порта.,Поэтому IP или порт невозможно исправить.,В противном случае привязка не удастся. Этот исходный тестовый ip раскидывается и отправляется.

Результаты теста показывают, что,После привязки нескольких очередей к ЦП отправка и получение пакетов значительно улучшаются. (Первоначально скорость одноядерного приема ЦП могла достигать максимум 2Mpps.,После настройки привязки она достигла примерно 9,5Mpps.,Конечно, ситуация может продолжать улучшаться. )

По умолчанию MTU сетевой карты составляет 1500 и не может принимать пакеты размером более 1518, поэтому вы можете изменить ее размер, чтобы получать, например, пакеты размером 8192 байта.

ip link set dev eth6 mtu 8174

ip link set dev eth7 mtu 8174

После модификации измените pkt_size в скрипте на 8188, и eth7 сможет получать данные (это можно увидеть в захвате пакета tcpdump, если не вносить никаких изменений, захват пакета будет отображаться следующим образом)

Прикрепил:

Объяснение элемента конфигурации

Configuring threads and devices

================================

This is done via the /proc interface easiest done via pgset in the scripts

Examples:

pgset “clone_skb 1” sets the number of copies of the same packet

pgset “clone_skb 0” use single SKB for all transmits

pgset “pkt_size 9014” sets packet size to 9014

pgset “frags 5” packet will consist of 5 fragments

pgset “count 200000” sets number of packets to send, set to zero for continuous sends until explicitly stopped.

pgset “delay 5000” adds delay to hard_start_xmit(). nanoseconds

pgset “dst 10.0.0.1” sets IP destination address(BEWARE! This generator is very aggressive!)

pgset “dst_min 10.0.0.1” Same as dst

pgset “dst_max 10.0.0.254” Set the maximum destination IP.

pgset “src_min 10.0.0.1” Set the minimum (or only) source IP.

pgset “src_max 10.0.0.254” Set the maximum source IP.

pgset “dst6 fec0::1” IPV6 destination address

pgset “src6 fec0::2” IPV6 source address

pgset “dstmac 00:00:00:00:00:00” sets MAC destination address

pgset “srcmac 00:00:00:00:00:00” sets MAC source address

pgset “queue_map_min 0” Sets the min value of tx queue interval

pgset “queue_map_max 7” Sets the max value of tx queue interval, for multiqueue devices.To select queue 1 of a given device, use queue_map_min=1 and queue_map_max=1

pgset “src_mac_count 1” Sets the number of MACs we’ll range through.The ‘minimum’ MAC is what you set with srcmac.

pgset “dst_mac_count 1” Sets the number of MACs we’ll range through.The ‘minimum’ MAC is what you set with dstmac.

pgset “flag [name]” Set a flag to determine behaviour. Current flags are:

IPSRC_RND #IP Source is random (between min/max),

IPDST_RND, UDPSRC_RND

UDPDST_RND, MACSRC_RND, MACDST_RND

MPLS_RND, VID_RND, SVID_RND

QUEUE_MAP_RND # queue map random

QUEUE_MAP_CPU # queue map mirrors

smp_processor_id()

pgset “udp_src_min 9” set UDP source port min, If < udp_src_max, then cycle through the port range.

pgset “udp_src_max 9” set UDP source port max.

pgset “udp_dst_min 9” set UDP destination port min, If < udp_dst_max, then cycle through the port range.

pgset “udp_dst_max 9” set UDP destination port max.

pgset “mpls 0001000a,0002000a,0000000a” set MPLS labels (in this example outer label=16,middle label=32,inner label=0 (IPv4 NULL)) Note that there must be no spaces between the arguments. Leading zeros are required.Do not set the bottom of stack bit,that’s done automatically. If you do set the bottom of stack bit, that indicates that you want to randomly generate that address and the flag MPLS_RND will be turned on. You can have any mix of random and fixed labels in the label stack.

pgset “mpls 0” turn off mpls (or any invalid argument works too!)

pgset “vlan_id 77” set VLAN ID 0-4095

pgset “vlan_p 3” set priority bit 0-7 (default 0)

pgset “vlan_cfi 0” set canonical format identifier 0-1 (default 0)

pgset “svlan_id 22” set SVLAN ID 0-4095

pgset “svlan_p 3” set priority bit 0-7 (default 0)

pgset “svlan_cfi 0” set canonical format identifier 0-1 (default 0)

pgset “vlan_id 9999” > 4095 remove vlan and svlan tags

pgset “svlan 9999” > 4095 remove svlan tag

pgset “tos XX” set former IPv4 TOS field (e.g. “tos 28” for AF11 no ECN, default 00)

pgset “traffic_class XX” set former IPv6 TRAFFIC CLASS (e.g. “traffic_class B8” for EF no ECN, default 00)pgset stop aborts injection. Also, ^C aborts generator.

pgset “rate 300M” set rate to 300 Mb/s

pgset “ratep 1000000” set rate to 1Mpps

Определение скорости линии

Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Этот сайт предоставляет только услуги по хранению информации, не имеет никаких прав собственности и не принимает на себя соответствующие юридические обязательства. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.

boy illustration
Учебное пособие по Jetpack Compose для начинающих, базовые элементы управления и макет
boy illustration
Код js веб-страницы, фон частицы, код спецэффектов
boy illustration
【новый! Суперподробное】Полное руководство по свойствам компонентов Figma.
boy illustration
🎉Обязательно к прочтению новичкам: полное руководство по написанию мини-программ WeChat с использованием программного обеспечения Cursor.
boy illustration
[Забавный проект Docker] VoceChat — еще одно приложение для мгновенного чата (IM)! Может быть встроен в любую веб-страницу!
boy illustration
Как реализовать переход по странице в HTML (html переходит на указанную страницу)
boy illustration
Как решить проблему зависания и низкой скорости при установке зависимостей с помощью npm. Существуют ли доступные источники npm, которые могут решить эту проблему?
boy illustration
Серия From Zero to Fun: Uni-App WeChat Payment Practice WeChat авторизует вход в систему и украшает страницу заказа, создает интерфейс заказа и инициирует запрос заказа
boy illustration
Серия uni-app: uni.navigateЧтобы передать скачок значения
boy illustration
Апплет WeChat настраивает верхнюю панель навигации и адаптируется к различным моделям.
boy illustration
JS-время конвертации
boy illustration
Обеспечьте бесперебойную работу ChromeDriver 125: советы по решению проблемы chromedriver.exe не найдены
boy illustration
Поле комментария, щелчок мышью, специальные эффекты, js-код
boy illustration
Объект массива перемещения объекта JS
boy illustration
Как открыть разрешение на позиционирование апплета WeChat_Как использовать WeChat для определения местонахождения друзей
boy illustration
Я даю вам два набора из 18 простых в использовании фонов холста Power BI, так что вам больше не придется возиться с цветами!
boy illustration
Получить текущее время в js_Как динамически отображать дату и время в js
boy illustration
Вам необходимо изучить сочетания клавиш vsCode для форматирования и организации кода, чтобы вам больше не приходилось настраивать формат вручную.
boy illustration
У ChatGPT большое обновление. Всего за 45 минут пресс-конференция показывает, что OpenAI сделал еще один шаг вперед.
boy illustration
Copilot облачной разработки — упрощение разработки
boy illustration
Микросборка xChatGPT с низким кодом, создание апплета чат-бота с искусственным интеллектом за пять шагов
boy illustration
CUDA Out of Memory: идеальное решение проблемы нехватки памяти CUDA
boy illustration
Анализ кластеризации отдельных ячеек, который должен освоить каждый&MarkerгенетическийВизуализация
boy illustration
vLLM: мощный инструмент для ускорения вывода ИИ
boy illustration
CodeGeeX: мощный инструмент генерации кода искусственного интеллекта, который можно использовать бесплатно в дополнение к второму пилоту.
boy illustration
Машинное обучение Реальный бой LightGBM + настройка параметров случайного поиска: точность 96,67%
boy illustration
Бесшовная интеграция, мгновенный интеллект [1]: платформа больших моделей Dify-LLM, интеграция без кодирования и встраивание в сторонние системы, более 42 тысяч звезд, чтобы стать свидетелями эксклюзивных интеллектуальных решений.
boy illustration
LM Studio для создания локальных больших моделей
boy illustration
Как определить количество слоев и нейронов скрытых слоев нейронной сети?
boy illustration
[Отслеживание целей] Подробное объяснение ByteTrack и детали кода