Инструмент распространения пакетов ядра 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose