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