Рубрики
Cisco

trex / cisco / генератор трафика / dpdk

Ссылки:

https://habr.com/ru/post/306060/
https://github.com/cisco-system-traffic-generator/trex-stateless-gui
https://github.com/cisco-system-traffic-generator/trex-core
https://trex-tgn.cisco.com/trex/release/
https://trex-tgn.cisco.com/trex/doc/trex_manual.html#_download_and_installation
https://askubuntu.com/questions/1239829/modulenotfounderror-no-module-named-distutils-util
https://trex-tgn.cisco.com/trex/doc/trex_vm_manual.html
http://core.dpdk.org/doc/quick-start/
Cisco TRex on Ubuntu Server 18.04
https://www.mail-archive.com/users@dpdk.org/msg04798.html # решение ошибки "eth_i40e_dev_init(): Failed to init adminq: -66" https://github.com/s5uishida/install_trex?ysclid=mc0h3m8kju972217675

Установка:

 
apt update
apt install lshw vim wget git make gcc linux-libc-dev linux-headers-amd64 pkg-config libncurses-dev flex bison  libssl-dev libelf-dev dwarves rsync bc fakeroot build-essential  xz-utils  libncurses5-dev lz4  debianutils 

apt install python3 python3-distutils python3-apt
update-alternatives --install /usr/bin/python python /usr/bin/python3 1

apt install dpdk

Настраиваем локаль:
vim /etc/locale.gen
-------------------
en_US.UTF-8           <---------- найти и раскоментить
------------------

Перечитать local:
locale-gen
На этом все, теперь у вас должна появится local en_US.UTF-8



cd /opt
wget https://trex-tgn.cisco.com/trex/release/v2.99.tar.gz
wget --no-check-certificate  https://trex-tgn.cisco.com/trex/release/v3.00.tar.gz 
tar -xpvf v2.99.tar.gz
cd v2.99
cd ko/src
make  
make install

Каталоги trex:

/              t-rex-64/dpdk_set_ports/stl-sim
/astf          test astf
/stl           Stateless native (py) profiles
/stl/hlt       Stateless HLT profiles
/ko            Kernel modules for DPDK
/external_libs Python external libs used by server/clients
/exp           Golden PCAP file for unit-tests
/cfg           Examples of config files
/cap2          Stateful profiles
/avl           Stateful profiles - SFR profile
/automation    Python client/server code for both Stateful and Stateless
/automation/regression Regression for Stateless and Stateful
/automation/config Regression setups config files
/automation/trex_control_plane/interactive/trex Stateless lib and Console
/automation/trex_control_plane/interactive/trex/stl Stateless lib
/automation/trex_control_plane/interactive/trex/examples/stl Stateless examples

Команды:

cd /opt/v2.99

0. Смотрим соответствие сетевой шины 
lshw -c network -businfo

1. Показывает информацию об интерфейсах
./dpdk_setup_ports.py -s

2. Чтобы создать конфигурационный файл по умолчанию (пример)
./dpdk_setup_ports.py -c 02:00.0 02:00.1 -o /etc/trex_cfg.yaml

3. Чтобы потом вернуть интерфейс обратно из под управления DPDK пригодится команда:
./dpdk_nic_bind.py -b  

4. Пример
!!! Настройки интерфейса берутся из фала конфигурации /etc/trex_cfg.yaml 
./t-rex-64 -f cap2/dns.yaml -c 4 -m 1 -d 100 -l 1000
-c — число ядер процессора.
-m — множитель cps каждого шаблона пакетов.
-d — время теста.
-l — частота (в Hz) latency пакетов, много параметров считается без их учета

5. Пример
./t-rex-64 -f cap2/dns.yaml -c 4 -m 9000 -d 100 -l 1000 -p
./t-rex-64 -i -c 6 --astf

6. Пример
./t-rex-64 -f cap2/http_simple.yaml -c 4  -l 1000 -d 100000 -m 30  --learn-mode 1
./t-rex-64 -i -c 6 --astf

7.
./bp-sim-64-debug --ut
./run_regression --func

Инфа по выводу:

Cpu Utilization — среднее значение нагрузки на CPU передающими тредами. Для налучшей производительности рекомендуется держать меньше 80%.
Total-Tx — суммарная скорость на передающем интерфейсе (в данном случае port 0)
Total-Rx — суммарная скорость на принимающем интерфейсе (в данном случае port 1)
Total-PPS — packets per second число пакетов на интерфейсах
Total-CPS — connections per second по сути этот параметр означает число запуска шаблонов, которые указаны в конфигурационном файле в секунду.

Expected-PPS — Ожидаемое число пакетов в секунду, в теории стремится к cps*число пакетов шаблона.
Expected-CPS — cps указанный в yaml файле теста.
Expected-BPS — суммарный трафик, объем шаблона * cps.

Active-flows — число внутренних потоков t-rex. По сути этот параметр является числом сессий, за которыми следит t-rex. например, 
               если вы запустите тест с pcap длительность сессии в котором равна 30 сек, то это показатель должен стремится к 30*Expected-CPS
Nat_time_out — должно быть ноль, число потоков, за которыми тирекс по каким-то причинам не смог уследить, обычно происходит если пакеты где-то дропают.
Nat_no_fid — должно быть ноль, обычно происходит при слишом больших таймаутах внутри тестируемого оборудования.
Total_nat_active: активное число потоков, должно быть низким при низком rtt.
Total_nat_open: общее число потоков, может отличаться пр однонаправленном (uni-directional) шаблоне.

grub порядок загрузки

grep menuentry /boot/grub/grub.cfg 
vim  /etc/default/grub
------------------------
GRUB_DEFAULT="Advanced options for Debian GNU/Linux>Debian GNU/Linux, with Linux 5.10.162"
------------------------
update-grub

Установка trex на 09.01.2023 debian 11

0. Устанавливаем доп по
apt install python python3-distutils python3-apt python3-pyelftools
update-alternatives --install /usr/bin/python python /usr/bin/python3.9 1


1. Скачиваем дистрибутив trex
cd opt
wget --no-check-certificate --no-cache https://trex-tgn.cisco.com/trex/release/latest
tar -xzvf latest


2. Устанавливаем модуль ядра
cd /opt/v3.00/ko/src
make  
make install

3. Создаем конфиг
./dpdk_setup_ports.py -s - смотрим что там у нас за интерфейсы 
cd /opt/v3.0 - переходим в каталог trex
./dpdk_setup_ports.py -  выполнив без параметров будет создан конфиг (тоесть: "cp cfg/simple_cfg.yaml /etc/trex_cfg.yaml")
./dpdk_setup_ports.py -c 02:00.0 02:00.1 -o /etc/trex_cfg.yaml - перенастраиваем конфиг (где 02:00.0 и 02:00.1 сетевые карты)



4. Проверяем проверяем успешность добавления интерфейсов
/opt/v3.0 
./dpdk_setup_ports.py -s

5. Дополнительно
Запуск в режиме сервера astf и stl
./t-rex-64 -i --astf
./t-rex-64 -i --stl
./t-rex-64 -i -c 6 --astf
./trex_daemon_server start
консоль TRex (Выполняет роль клиента для подключения к серверу trex и генерации трафика)
./trex-console
./trex-console -s 192.168.55.61

6. Запуск теста в trex
start -f astf/http_simple.py -m 1
start -f astf/udp_sip.py -d 5000  -m 500000 -l 5
start -f astf/sfr_full.py -m 50 -l 50
start -f astf/video_stream.py  -m 25
-d - время теста
-m - множитель пакетов
-l - запускать потоки с задержкой

Ошибка trex-console (FileNotFoundError: [Errno 2] No such file or directory: b'liblibc.a')

cd /usr/lib/x86_64-linux-gnu/
ln -s -f libc.a liblibc.a

DUT - клиент через который гоним трафик

DUT - device under test
16.0.0.0/8 - сеть клиентов trex
48.0.0.0/8 - сеть клиентов trex

apt install openvswitch-switch 
apt install netsniff-ng netdiag  iptraf bmon iftop glances
ovs-vsctl add-br ovsbr0
ovs-vsctl add-port enp1s0f0 ovsbr0
ovs-vsctl add-port ovsbr0 enp1s0f0
ovs-vsctl add-port ovsbr0 enp1s0f1
ovs-vsctl add-port ovsbr0 enp1s0f2
ovs-vsctl add-port ovsbr0 enp1s0f3

vim /etc/network/interfaces
---------------------------
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
#source-directory /etc/network/interfaces.d

auto enp5s0
iface enp5s0 inet dhcp


auto enp1s0f0
iface enp1s0f0 inet manual


auto enp1s0f1
iface enp1s0f1 inet manual

auto enp1s0f2
iface enp1s0f2 inet manual


auto enp1s0f3
iface enp1s0f3 inet manual

auto ovsbr0
iface ovsbr0 inet static
             address 10.0.0.2/24
             up ip route add 16.0.0.0/8 via 10.0.0.1
             down ip route del 16.0.0.0/8
auto ovsbr0:0
iface ovsbr0:0 inet static
             address 10.0.1.2/24
             up ip route add 48.0.0.0/8 via 10.0.1.1
             down ip route del 48.0.0.0/8
---------------------------


ovs-appctl dpctl/show -s  - показать статистику
ifpps - показать статистику в реальном времени
ovs-appctl fdb/stats-clear - очистить статистику

trex server no mirror

vim /etc/trex_cfg.yaml 
----------------------
### Config file generated by dpdk_setup_ports.py ###

- version: 2
  interfaces: ['02:00.0', '02:00.1']
  port_info:
      - ip: 10.0.0.1
        default_gw: 10.0.0.2
      - ip: 10.0.1.1
        default_gw: 10.0.1.2

  platform:
      master_thread_id: 0
      latency_thread_id: 1
      dual_if:
        - socket: 0
          threads: [2,3,4,5,6,7]
----------------------

Tuning

ulimit -n 30000

net.ipv4.tcp_max_tw_buckets = 65536
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_max_syn_backlog = 131072
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 8
net.ipv4.tcp_rmem = 16384 174760 349520
net.ipv4.tcp_wmem = 16384 131072 262144
net.ipv4.tcp_mem = 262144 524288 1048576
net.ipv4.tcp_max_orphans = 65536
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_low_latency = 1
net.ipv4.tcp_syncookies = 0
net.netfilter.nf_conntrack_max = 1048576

Может пригодится:

sudo ip netns show
sudo ip netns exec trex-a-0-1 ifconfig

trex>portattr -a
trex>portattr --mul on
trex>portattr --prom on
trex>service
trex(service)>l3 -p 1 --src 1.1.1.2 --dst 1.1.1.3
trex(service)>ping -p 1 -d 1.1.1.3

Ошибка "eth_i40e_dev_init(): Failed to init adminq: -66" на "Intel 13th Gen Core i7-13700K" debian 11

0. Редактируем 
vim /etc/default/grub
---------------------
GRUB_CMDLINE_LINUX="iommu=pt, intel_iommu=on"
---------------------
1. Применяем изменения для grub
update-grub
2. Перезагружаемся
reboot

trex_port0+mikrotik+sw+mikrotik+trex_port1


mikrotik 1
---------------------
/ip address
add address=192.168.100.101/24 interface=bonding1 network=192.168.100.0
add address=10.12.136.1/24 interface=sfp-sfpplus1 network=10.12.136.0

/ip route
add disabled=no distance=1 dst-address=48.0.0.0/8 gateway=10.12.136.5 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
add disabled=no distance=1 dst-address=16.0.0.0/8 gateway=192.168.100.100 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
add disabled=no dst-address=0.0.0.0/0 gateway=192.168.100.100 routing-table=main suppress-hw-offload=no
add disabled=no dst-address=10.12.135.0/24 gateway=192.168.100.100 routing-table=main suppress-hw-offload=no


------------------------



mikrotik 2
---------------------
/ip address
add address=192.168.100.100/24 interface=bonding1 network=192.168.100.0
add address=10.12.135.1/24 interface=sfp-sfpplus1 network=10.12.135.0

/ip route
add disabled=no distance=1 dst-address=10.12.136.0/24 gateway=192.168.100.101 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=192.168.100.101 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
add disabled=no distance=1 dst-address=48.0.0.0/8 gateway=192.168.100.101 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
add disabled=no distance=1 dst-address=16.0.0.0/8 gateway=10.12.135.5 pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10


------------------------


trex
-------------------------
cat /etc/trex_cfg.yaml
### Config file generated by dpdk_setup_ports.py ###

- version: 2
  interfaces: ['02:00.0', '02:00.1']
  port_info:
      - ip: 10.12.135.5
        default_gw: 10.12.135.1
      - ip: 10.12.136.5
        default_gw: 10.12.136.1

  platform:
      master_thread_id: 0
      latency_thread_id: 1
      dual_if:
        - socket: 0
          threads: [2,3,4,5,6,7]
-------------------------



Решение косяков:

./trex-console
arp
ping -p 0 10.12.135.1
ping -p 0 10.12.136.1
ping -p 1 10.12.135.1
ping -p 1 10.12.136.1

FAILED быть не должно

error module 'collections' has no attribute 'Hashable'

версия trex 3.04 debian 12
ядро Linux 5.15.148 
Python 3.12.2



https://stackoverflow.com/questions/72659999/chatterbot-module-error-attributeerror-module-collections-has-no-attribute

Начиная с Python3.3, Hashable был перенесен в модуль Collections.abc, 
поэтому в качестве обходного пути вы можете принудительно обеспечить совместимость, добавив следующие строки вверху после других import-ов:

Временное решение:
vim /opt/v3.04/./dpdk_setup_ports.py
------------------------------------
#много всего
import subprocess
import platform
import stat
import time
import shutil
import signal
import glob
# вот после импортов сюда
import collections.abc
collections.Hashable = collections.abc.Hashable
#  много всего 
------------------------------------

UP20250220 / Ставим Trex с git / debian 12

apt update 
apt install -y build-essential cmake python3-dev libnuma-dev zlib1g-dev libpcap-dev linux-headers-$(uname -r) git
apt install -y meson ninja-build


Качаем trex
git clone --recursive https://github.com/cisco-system-traffic-generator/trex-core.git
cd trex-core

Cisco T-Rex использует DPDK (Data Plane Development Kit) соберём его:
cd linux_dpdk
./b configure
./b build

После сборки DPDK возвращаемся в корень репозитория и компилируем сам T-Rex:
cd ..
./b configure
./b build

dump

./trex-console
capture monitor start --tx 0 1  --rx 0 1