Учитывая сложившееся положение на рынке и снижение доступности готовых решений для осуществления сетевых тестирований - актуальным становится рассмотрение любых доступных альтернатив. Один из самых доступных и достойных вариантов - Open Source решение TRex от компании Cisco. Данный трафик-генератор я использую в своей текущей работе и решил поделиться своим опытом его использования. Его особенности, возможности и как им пользоваться - я бы хотел рассмотреть в этой статье.

Думаю, что данный материал может быть полезен сетевым инженерам и разработчикам сетевого оборудования, которые занимаются тестированием сетевой производительности. 

Приглашаю всех заинтересованных под кат!

Что такое Cisco TRex?

Cisco TRex - программный комплекс для генерации Stateful и Stateless потоков трафика который базируется на нескольких ключевых технологиях:

  • DPDK (Data Plane Development Kit): TRex использует DPDK для прямого доступа к сетевым картам (NIC), минуя ядро Linux. Это устраняет накладные расходы на системные вызовы и копирование буферов.

  • Poll-Mode Drivers (PMD): DPDK драйверы работают в режиме опроса (polling) вместо прерываний, что снижает задержки и обеспечивает детерминированную производительность.

  • Huge Pages: Используются огромные страницы памяти (2MB/1GB) для уменьшения TLB-misses и ускорения доступа к пакетным буферам.

Поддерживается генерация трафика L3-L7 и предоставляет большую часть функций, которые реализованы в дорогостоящих коммерческих продуктах, среди которых можно выделить следующие:

  • возможна эмуляция огромного количества разнообразных клиентских протоколов, таких как ARP, IPv6, ND, MLD, IGMP, ICMP, DOT1X, DCHPv4, DHCPv6, DNS и многие другие;

  • поддерживается эмуляция RIP, BGP, OSPF с использованием BIRD;

  • поддерживается генерация трафика до 200 Гбит/с и до 10-30 Mpps на ядро CPU; 

  • поддержка нескольких потоков;

  • возможность генерации произвольных пакетов;

  • формирование расширенной статистики по потокам, портам, группам, задержкам и джиттеру;

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

Среди основных конкурентных преимуществ TRex я бы выделил следующие:

  • Трафик генератор бесплатен и является open-source продуктом;

  • Объем генерации трафика легко масштабируется за счет увеличения производительности сервера, на котором запускается TRex;

  • Легко составлять программы испытаний, потому что трафик-паттерны формируются в виде программного кода;

  • Очень гибкий инструмент, который при необходимости можно доработать под себя;

  • Инструмент можно использовать в средах виртуализации;

Конечно, такой продукт не сравнится с аппаратными решениями типа Ixia (IxLoad, IxNetwork), Spirent, Xinertel поскольку это софтовое решение. Но за неимением лучшего - данный продукт удовлетворит минимальные требования к трафик-генератору и позволит провести самые базовые испытания сетевого оборудования и инфраструктуры.

У TRex имеется несколько режимов работы: 

  • Stateless Mode (STL) - то есть генерация простых сетевых пакетов без отслеживания состояний;

  • Advanced Stateful Mode (ASTF) - эмуляция трафика сложных протоколов (TCP, HTTP, IPSec), с поддержкой миллионов сессий с отслеживанием состояний (например, TCP handshake);

  • Emulation Server (EMU);

Рассмотрим каждый из них по отдельности и выделим основные особенности этих режимов и для чего они нужны.

Stateless Mode (STL)

Перечислю основные фичи и особенности этого режима работы:

  • TRex поддерживает генерацию около 10-30 миллионов пакетов в секунду (Mpps) на ядро и легко масштабируется за счет увеличения количества вычислительных ядер в сервере;

  • Поддерживается мультипоточность до 10 тысяч параллельных потоков;

  • Каждый из таких потоков может быть сконфигурирован с помощью шаблона сетевого пакета используя Scapy, включая генерацию malformed-пакетов. 

    • Поддерживается генерация MPLS, IPv4, IPv6, GRE, VxLAN, NSH, etc.;

    • Можно изменять любое поле в пакете;

    • Можно изменять размер пакета;

    • Возможна генерация Continuous, Burst, Multi-burst режима отправки трафика;

    • Возможно указание объема генерации трафика как в скорости (bps) так и в количестве пакетов в секунду (pps);

    • Один поток может триггерить запуск другого потока по цепочке;

  • Поддержка интерактивного взаимодействия через GUI-приложение или консоль;

  • Гибкая статистика по потокам и по интерфейсам, с поддержкой как софтовых так и аппаратных счетчиков;

  • Статистика по задержкам и джиттеру;

  • Поддержка автоматизации через использование API на языке Python;

  • Возможность захвата трафика используя BPF-фильтры и без Wireshark;

  • Возможность захвата трафика с перенаправлением его на анализ в Wireshark;

  • Поддержка отправки файлов PCAP объемом до 1Тб в качестве тестового трафика, например для тестов DPI систем;

  • Поддержка использования TRex несколькими пользователями; 

Advanced Stateful Mode (ASTF)

Второй режим работы Cisco TRex - генерация и эмуляция трафика с установлением соединения. Основные фичи и возможности можно перечислить следующим списком:

  • Поддержка установки TCP-соединений;

  • Возможность работы как в режиме сервера, так и в режиме клиента. Позволяет использовать несколько разнесенных серверов TRex;

  • Высокая производительность генерации трафика:

    • Позволяет генерировать трафик до 200 Гбит/с;

    • Высокая скорость генерации сетевых соединений;

    • Масштабируется до нескольких миллионов активных соединений;

  • Поддержка эмуляции изменяющихся параметров задержки, джиттера и дропов пакетов;

  • Поддержка эмуляции L7-приложений, в т.ч. с использованием TLS через OpenSSL;

  • Поддержка изменения содержимого пакетов, например HTTP User-Agent;

  • Подробная статистика по TCP/UDP/Application;

  • Проверка контрольных сумм IP/TCP/UDP;

  • Поддержка как IPv4, так и IPv6;

  • Поддержка фрагментации пакетов;

  • Точная задержка для TCP-потоков с выводом гистограммы на SYN/SYN ACK и REQ/RES; 

Emulation Server (EMU)

Данная функциональность позволяет генерировать самые разнообразные клиентские протоколы. Например поддерживается генерация ARP, IPv6 ND, MLD, IGMP протоколов на уровне L3. Стоит дополнительно отметить:

  • Очень быстрое создание/удаление клиентских приложений, примерно 3 тысячи операций в секунду на один процессорный поток;

  • Количество активных клиентов/namespace ограничиваются только объемом оперативной памяти сервера;

  • Высокая скорость генерации пакетов 3-5 Mpps на ядро;

  • Поддерживаемые плагины и протоколы в EMU-режиме:

    • Плагин ARP. Реализует поддержку RFC 826;

    • Плагин CDP (Cisco Discovery Protocol);

    • Плагин DHCPv4 с поддержкой RFC 2131 Client & Server;

    • Плагин DHCPv6 с поддержкой RFC 8415 Client;

    • Плагин DNS с поддержкой RFC 1034/1035;

    • Плагин DOT1X с поддержкой AP-MD5/EAP-MSCHAPv2 RFC 3748/2759, IEEE 802.1X-2001;

    • Плагин ICMP с поддержкой RFC 777;

    • Плагин IGMP с поддержкой IGMP v3/v2/v1 RFC 3376;

    • Плагин IPv6 с поддержкой IPv6 ND, RFC 4443, RFC 4861, RFC 4862 and MLD and MLDv2 RFC 3810;

    • Плагин LLDP с поддержкой IEEE 802.1AB;

    • Плагин mDNS с поддержкой Multicast DNS, RFC 6762;

    • Плагин Netflow, с поддержкой Netflow v9, RFC 3954 and Netflow v10 (IPFix), RFC 7011;

    • Плагин Transport, с поддержкой userspace TCP и UDP приложений;

    • Плагин Cisco Telemetry TDL, с поддержкой эмуляции сетевых устройств;

Для полного рассмотрения всех функций потребуется написать не одну статью. Наиболее часто используемые функции мы рассмотрим в цикле статей, но перейдем к рассмотрению минимально необходимых требований для того, чтобы начать пользоваться Trex. 

Минимальные системные требования

TRex представляет собой простое userspace-приложение, которое взаимодействует с модулями ядра Linux, т.е. данный трафик генератор работает только на Linux-системах. Поддерживается следующий список ОС:

  • Fedora 18-20 и выше, 64-bit kernel (not 32-bit);

  • CentOS/RHEL 7.6, 64-bit kernel (not 32-bit);

  • Ubuntu 14.04.1 LTS и выше, 64-bit kernel (not 32-bit);

  • Для других ОС возможна самостоятельная компиляция;

Для сетевого процессинга используется Intel DPDK, для обработки трафика в обход сетевого стека Linux в качестве рекомендованного, но может быть использован и ядерный процессинг с существенным ограничением в производительности в пределах 1 Mpps. 

Помимо этого возможен запуск с параметром конфигурации сервера TRex в системах с низкой производительностью и малого объема памяти. И в ситуациях когда нет прямой поддержки DPDK в нативной ОС - можно настроить генератор трафика в системах виртуализации типа VirtualBox, Docker  и им подобных. 

Минимальные требования к аппаратной платформе:

  • 2-х ядерный Intel CPU @ 2.0 ГГц, для генерации от 10 Гбит/с необходим процессор от 4 ядер и выше, желательно Intel с поддержкой Hyper-Threading;

  • Реального ограничения на оперативную память нет, но рекомендуется объем памяти от 32 Гб;

  • Требуется сетевой адаптер с поддержкой Intel DPDK. Список тут и тут;

Документация

Официальная документация находится по адресу https://trex-tgn.cisco.com/trex/doc/. Я так же рекомендую обратиться по ссылке на Github.

Судя по дате обновления многих документов проект кажется заброшенным и почти не развивается. Многие ссылки на материалы не доступны и выглядят очень разрозненно. 

Самые полезные ссылки по TRex из официальной документации я собрал списком:

Подготовительные действия

Перейдем в практическую плоскость обсуждения и подготовим сервер к работе. В первую очередь необходимо проверить битность используемого ядра Linux. Самый простой способ это сделать:

megalloid@trex:~$ uname -m
x86_64

Проверим, какие у нас сетевые интерфейсы. В моем случае первые два порта используются для Management сервера, а вот сетевая карта X710 с 4 портами SFP+ - будет использована в качестве портов трафик-генератора:

megalloid@trex:~$ lspci | grep Ethernet
1c:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GBASE-T (rev 09)
1c:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 10GBASE-T (rev 09)
af:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
af:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
af:00.2 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)
af:00.3 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)

Для избежания проблем с производительностью на многопроцессорных платформах - необходимо использовать различные NUMA-ноды для разных сетевых карт. Посмотреть, каким образом распределяются сетевые интерфейсы по NUMA нодам - необходимо установить программу hwloc и вывести информацию:

megalloid@trex:~$ sudo apt install hwloc
megalloid@trex:~$ lstopo

Если запуск осуществляется на удаленной машине - результат будет выведен в терминал, если нет - то будет запущено GUI-приложение.

Далее необходимо проверить, доступны ли HugePages на используемой ОС. Для этого проверим вывод при выполнении следующей команды: 

megalloid@trex:~$ grep Huge /proc/meminfo
AnonHugePages:         0 kB
ShmemHugePages:  1044480 kB
FileHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB

Далее установим количество HugePages через sysctl:

megalloid@trex:~$ sudo sysctl -w vm.nr_hugepages=1024
vm.nr_hugepages = 1024
megalloid@trex:~$ cat /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
1024
megalloid@trex:~$ cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
1024

Или можно от sudo сделать следующее (если установлены утилиты для работы с DPDK):

megalloid@trex:~$ sudo dpdk-hugepages.py --setup 2G

Установка и запуск Cisco TRex в Native OS

Для запуска TRex необходимо сделать всего лишь несколько шагов. Опишу каждый из них. 

Для начала создаем рабочий каталог TRex, скачаем образ последней release-версии (на момент написания статьи - версия 3.06) и извлечем его:

megalloid@trex:~$ sudo mkdir -p /opt/trex
megalloid@trex:~$ sudo chmod 0777 /opt/trex
megalloid@trex:~$ cd /opt/trex
megalloid@trex:~$ wget --no-cache https://trex-tgn.cisco.com/trex/release/v3.06.tar.gz --no-check-certificate
megalloid@trex:~$ tar -xzvf v3.06.tar.gz 

Перед использованием TRex в боевых условиях, настоятельно рекомендуется провести прямую генерацию трафика из порта в порт через простое loopback-соединение.

В первую очередь посмотрим, есть ли в списке сетевых интерфейсов наша сетевая карта с тестовыми портами. Пока ни один из портов не назначен в DPDK - видно что все порты проинициализированы с драйвером i40e в Linux ядре:

megalloid@trex:/opt/trex/v3.06$ sudo ./dpdk_setup_ports.py -s

Network devices using DPDK-compatible driver
============================================
<none>

Network devices using kernel driver
===================================
0000:1c:00.0 'Ethernet Connection X722 for 10GBASE-T' if=eno1 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 
0000:1c:00.1 'Ethernet Connection X722 for 10GBASE-T' if=eno2 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 
0000:af:00.0 'Ethernet Controller X710 for 10GbE SFP+' if=ens1f0 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 
0000:af:00.1 'Ethernet Controller X710 for 10GbE SFP+' if=ens1f1 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 
0000:af:00.2 'Ethernet Controller X710 for 10GbE SFP+' if=ens1f2 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 
0000:af:00.3 'Ethernet Controller X710 for 10GbE SFP+' if=ens1f3 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 

Other network devices
=====================
<none>

Чтобы назначить порты в DPDK необходимо выполнить следующую команду:

megalloid@trex:/opt/trex/v3.06$ sudo modprobe vfio-pci enable_unsafe_noiommu_mode=1
megalloid@trex:/opt/trex/v3.06$ sudo /bin/sh -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'

Далее, я рекомендую использовать внешние средства настройки DPDK:

megalloid@trex:/opt/trex/v3.06$ wget https://raw.githubusercontent.com/DPDK/dpdk/main/usertools/dpdk-devbind.py
megalloid@trex:/opt/trex/v3.06$ sudo ./dpdk_nic_bind.py -b vfio-pci 0000:af:00.0
megalloid@trex:/opt/trex/v3.06$ sudo ./dpdk_nic_bind.py -b vfio-pci 0000:af:00.1
megalloid@trex:/opt/trex/v3.06$ sudo ./dpdk_nic_bind.py -b vfio-pci 0000:af:00.2
megalloid@trex:/opt/trex/v3.06$ sudo ./dpdk_nic_bind.py -b vfio-pci 0000:af:00.3

Смотрим, забиндились ли порты в DPDK:

megalloid@trex:/opt/trex/v3.06$ sudo ./dpdk_setup_ports.py -s

Network devices using DPDK-compatible driver
============================================
0000:af:00.0 'Ethernet Controller X710 for 10GbE SFP+' drv=vfio-pci unused=i40e,igb_uio,uio_pci_generic
0000:af:00.1 'Ethernet Controller X710 for 10GbE SFP+' drv=vfio-pci unused=i40e,igb_uio,uio_pci_generic
0000:af:00.2 'Ethernet Controller X710 for 10GbE SFP+' drv=vfio-pci unused=i40e,igb_uio,uio_pci_generic
0000:af:00.3 'Ethernet Controller X710 for 10GbE SFP+' drv=vfio-pci unused=i40e,igb_uio,uio_pci_generic

Network devices using kernel driver
===================================
0000:1c:00.0 'Ethernet Connection X722 for 10GBASE-T' if=eno1 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 
0000:1c:00.1 'Ethernet Connection X722 for 10GBASE-T' if=eno2 drv=i40e unused=igb_uio,vfio-pci,uio_pci_generic 

Other network devices
=====================
<none>

Или можно вывести следующим образом статус портов:

megalloid@trex:/opt/trex/v3.06$ sudo ./dpdk_setup_ports.py -t
+----+------+---------+-------------------+-----------------------------------------+----------+----------+--------+
| ID | NUMA |   PCI   |        MAC        |                  Name                   |  Driver  | Linux IF | Active |
+====+======+=========+===================+=========================================+==========+==========+========+
| 0  | 0    | 1c:00.0 | 3c:ec:ef:5f:78:74 | Ethernet Connection X722 for 10GBASE-T  | i40e     | eno1     |        |
+----+------+---------+-------------------+-----------------------------------------+----------+----------+--------+
| 1  | 0    | 1c:00.1 | 3c:ec:ef:5f:78:75 | Ethernet Connection X722 for 10GBASE-T  | i40e     | eno2     |        |
+----+------+---------+-------------------+-----------------------------------------+----------+----------+--------+
| 2  | 1    | af:00.0 | 6c:b3:11:68:05:38 | Ethernet Controller X710 for 10GbE SFP+ | vfio-pci |          |        |
+----+------+---------+-------------------+-----------------------------------------+----------+----------+--------+
| 3  | 1    | af:00.1 | 6c:b3:11:68:05:3a | Ethernet Controller X710 for 10GbE SFP+ | vfio-pci |          |        |
+----+------+---------+-------------------+-----------------------------------------+----------+----------+--------+
| 4  | 1    | af:00.2 | 6c:b3:11:68:05:3c | Ethernet Controller X710 for 10GbE SFP+ | vfio-pci |          |        |
+----+------+---------+-------------------+-----------------------------------------+----------+----------+--------+
| 5  | 1    | af:00.3 | 6c:b3:11:68:05:3e | Ethernet Controller X710 for 10GbE SFP+ | vfio-pci |          |        |
+----+------+---------+-------------------+-----------------------------------------+----------+----------+--------+

Бинд портов в DPDK и драйвер vfio-pci прошел успешно - значит идем дальше. 

Следующим шагом необходимо подготовить файл конфигурации для TRex сервера. Минимальный файл конфигурации находится в директории cfg/simple.cfg.yaml. В моем случае, т.к. используется 4 порта я сделал вот такую конфигурацию и скопировал ее в /etc/trex_cfg.yaml:

- port_limit      : 4
  version         : 2
  interfaces      : ["0000:af:00.0","0000:af:00.1","0000:af:00.2","0000:af:00.3"]

В поле port_limit указывается количество портов, с которым будет взаимодействовать TRex. Далее требуется указать в параметре interfaces перечислением PCI-адреса этих интерфейсов.

Есть возможность задать сетевые параметры будущего теста, но я не рекомендую их указывать т.к. для каждого отдельного теста нужно будет перезапускать сервер с новыми параметрами.

В случае если количество ядер позволяет - можно сделать более вариант конфигурации который обеспечивает большую производительность. В моем случае это 32-ядерный процессор и можно раскидать треды отдельных подпроцессов TRex на разные потоки:

- port_limit         : 4
  version            : 3
  interfaces         : ["0000:af:00.0","0000:af:00.1","0000:af:00.2","0000:af:00.3"]   
  port_bandwidth_gb  : 10
  c                  : 8
  platform :
    master_thread_id  : 0
    latency_thread_id : 25
    dual_if:
      - socket : 1
        threads : [17,18,19,20,21,22,23,24]
      - socket : 1
        threads : [9,10,11,12,13,14,15,16]

Подробнее про поля конфигурации можно почитать тут

Теперь можно проверить, запускается ли сервер TRex:

Лог запуска сервера TRex
megalloid@trex:/opt/trex/v3.06$ sudo ./t-rex-64 -i --cfg /etc/trex_cfg.yaml --arp-refresh-period 30 -v 8

Starting Scapy server.... Scapy server is started
The ports are bound/configured.
Starting  TRex v3.06 please wait  ... 
Using configuration file /etc/trex_cfg.yaml 
 port limit     :  4 
 port_bandwidth_gb    :  10 
 port_speed           :  0 
 port_mtu             :  0 
 if_mask        : None 
 is low-end : 0 
 stack type :  
 thread_per_dual_if      : 1 
 if        :  0000:af:00.0, 0000:af:00.1, 0000:af:00.2, 0000:af:00.3,
 enable_zmq_pub :  1 
 zmq_pub_port   :  4500 
 m_zmq_rpc_port    :  4501 
 src     : 6c:b3:11:68:05:38
 dest    : 00:0a:35:00:00:83
 src     : 6c:b3:11:68:05:3a
 dest    : 00:0a:35:00:00:84
 src     : 6c:b3:11:68:05:3c
 dest    : 00:0a:35:00:00:85
 src     : 6c:b3:11:68:05:3e
 dest    : 00:0a:35:00:00:86
 memory per 2x10G ports  
 MBUF_64                                   : 16380 
 MBUF_128                                  : 8190 
 MBUF_256                                  : 8190 
 MBUF_512                                  : 8190 
 MBUF_1024                                 : 8190 
 MBUF_2048                                 : 4095 
 MBUF_4096                                 : 128 
 MBUF_9K                                   : 512 
 TRAFFIC_MBUF_64                           : 65520 
 TRAFFIC_MBUF_128                          : 32760 
 TRAFFIC_MBUF_256                          : 8190 
 TRAFFIC_MBUF_512                          : 8190 
 TRAFFIC_MBUF_1024                         : 8190 
 TRAFFIC_MBUF_2048                         : 32760 
 TRAFFIC_MBUF_4096                         : 128 
 TRAFFIC_MBUF_9K                           : 512 
 MBUF_DP_FLOWS                             : 524288 
 MBUF_GLOBAL_FLOWS                         : 5120 
 no platform info 
CTimerWheelYamlInfo does not exist  
 set driver name net_i40e 
 driver capability  : TCP_UDP_OFFLOAD  TSO  SLRO 
 set dpdk queues mode to DROP_QUE_FILTER 
 Number of ports found: 4
Loading DDP profile (0) Profile is already loaded 
Loading DDP profile (1) Profile is already loaded 
Loading DDP profile (2) Profile is already loaded 
Loading DDP profile (3) Profile is already loaded 
zmq publisher at: tcp://*:4500
 A workaround is applied for issue #508 
 A workaround is applied for issue #508 
 A workaround is applied for issue #508 
 A workaround is applied for issue #508 
 wait 1 sec .
port : 0 
------------
link         :  link : Link Up - speed 10000 Mbps - full-duplex
promiscuous  : 0 
port : 1 
------------
link         :  link : Link Up - speed 10000 Mbps - full-duplex
promiscuous  : 0 
port : 2 
------------
link         :  link : Link Up - speed 10000 Mbps - full-duplex
promiscuous  : 0 
port : 3 
------------
link         :  link : Link Up - speed 10000 Mbps - full-duplex
promiscuous  : 0 
 number of ports         : 4 
 max cores for 2 ports   : 1 
 tx queues per port      : 3 
 -------------------------------
RX core uses TX queue number 1 on all ports
 core, c-port, c-queue, s-port, s-queue, lat-queue
 ------------------------------------------
 1        0      0       1       0      2  
 2        2      0       3       0      2  
 -------------------------------

И после запуска будет выведена статистика по интерфейсам:

Вывод запущеного сервера TRex:
-Per port stats table 
      ports |               0 |               1 |               2 |               3 
 -----------------------------------------------------------------------------------------
   opackets |               0 |               0 |               0 |               0 
     obytes |               0 |               0 |               0 |               0 
   ipackets |               0 |               0 |               0 |               0 
     ibytes |               0 |               0 |               0 |               0 
    ierrors |               0 |               0 |               0 |               0 
    oerrors |               0 |               0 |               0 |               0 
      Tx Bw |       0.00  bps |       0.00  bps |       0.00  bps |       0.00  bps 

-Global stats enabled 
 Cpu Utilization : 0.0  %
 Platform_factor : 1.0  
 Total-Tx        :       0.00  bps  
 Total-Rx        :       0.00  bps  
 Total-PPS       :       0.00  pps  
 Total-CPS       :       0.00  cps  

 Expected-PPS    :       0.00  pps  
 Expected-CPS    :       0.00  cps  
 Expected-BPS    :       0.00  bps  

 Active-flows    :        0  Clients :        0   Socket-util : 0.0000 %    
 Open-flows      :        0  Servers :        0   Socket :        0 Socket/Clients :  -nan 
 drop-rate       :       0.00  bps   
 current time    : 68.1 sec  
 test duration   : 0.0 sec  

После этого сервер готов к работе и давайте проверим работоспособность генератора трафика. Суть заключается в том, что в одном окне терминала мы запускаем сервер, а в другом запускаем консоль управления для того, чтобы отправлять нужные нам команды.

Поскольку сервер уже запущен, нам нужно только запустить интерактивную консоль TRex в другом терминале: 

megalloid@trex:/opt/trex/v3.06$ ./trex-console -f

Откроется консоль TRex:

Using 'python3' as Python interpeter

Connecting to RPC server on localhost:4501                   [SUCCESS]

Connecting to publisher server on localhost:4500             [SUCCESS]

Force acquiring ports [0, 1, 2, 3]:                          [SUCCESS]

Server Info:

Server version:   v3.06 @ STL
Server mode:      Stateless
Server CPU:       2 x Intel(R) Xeon(R) Gold 6226R CPU @ 2.90GHz
Ports count:      4 x 10Gbps @ Ethernet Controller X710 for 10GbE SFP+	

-=TRex Console v3.0=-

Type 'help' or '?' for supported actions

trex>

Соедините порты 0 и 1 между собой для запуска тестового трафика. И выполните запуск трафика следующей командой:

trex> start -f stl/imix.py -m 10kpps --port 2

После запуска в меню статистики пойдет нарастание счетчиков. Просмотреть текущий статус портов можно выполнив в консоли TRex команду tui:

trex> tui

Будет выведена следующая страница со статистикой:

Я запустил трафик из порта 2 в порт 3, в количестве 10 kpps и видно, что происходит сквозная передача и все работает как нужно.

Решение проблемы TRex 3.06 с Python 3.12 и Ubuntu 24.04

На момент публикации этой статьи версия TRex - 3.06, и данная версия несовместима с Python 3.12, стандартной версией Python в Ubuntu 24.04. Для решения данной проблемы необходимо использовать Python 3.11 в виртуальной среде: 

megalloid@trex:~$ sudo add-apt-repository ppa:deadsnakes/ppa
megalloid@trex:~$ sudo apt update && sudo apt install python3.11 python3.11-venv
megalloid@trex:~$ cd v3.06   # wherever you untarred trex 3.06
megalloid@trex:~$ python3.11 -m venv venv
megalloid@trex:~$ source ./venv/bin/activate
megalloid@trex:~$ venv/bin/python venv/bin/pip install cffi

Вам нужно будет убедиться, что вы повторно запускаете source ./venv/bin/activate каждый раз, когда возвращаетесь в систему, чтобы запустить TRex, иначе вы вернётесь к Python 3.12 и получите множество забавных ошибок.

TRex 3.06 включает в себя копию libstdc++.so.6, которая несовместима с Ubuntu 24.04. Вы можете безопасно удалить её:

megalloid@trex:~$ rm v3.06/so/x86_64/libstdc++.so.6 

Установка Cisco TRex в Docker

Второй вариант запуска - в Docker-контейнере. Для этого установить Docker:

megalloid@trex:~$ sudo apt-get update
megalloid@trex:~$ sudo apt-get install curl
megalloid@trex:~$ curl -fsSL https://get.docker.com -o get-docker.sh
megalloid@trex:~$ sudo sh get-docker.sh

После этого необходимо скачать подготовленный Docker-образ из репозитория. К сожалению образ давно не обновляется и в репозитории старая версия TRex 2.41, которая не рекомендуется к использованию.

megalloid@trex:~$ sudo docker pull trexcisco/trex

Запускаем первый терминал данного Docker-контейнера для запуска сервера:

megalloid@trex:~$ sudo docker run --rm -it --privileged --cap-add=ALL trexcisco/trex
sudo docker run --rm -it --privileged --cap-add=ALL trexcisco/trex

[root@6d519c9fbd08 v2.41]# ./t-rex-64 -i 
Starting Scapy server.... Scapy server is started
The ports are bound/configured.
Starting  TRex v2.41 please wait  ... 
EAL: Started without hugepages support, physical addresses not available
 set driver name net_af_packet 
 driver capability  :
 Number of ports found: 2
zmq publisher at: tcp://*:4500
 wait 1 sec .
port : 0 
------------
link         :  link : Link Up - speed 10000 Mbps - full-duplex
promiscuous  : 0 
port : 1 
------------
link         :  link : Link Up - speed 10000 Mbps - full-duplex
promiscuous  : 0 
 number of ports         : 2 
 max cores for 2 ports   : 1 
 max queue per port      : 3 
 -------------------------------
RX core uses TX queue number 0 on all ports
 core, c-port, c-queue, s-port, s-queue, lat-queue
 ------------------------------------------
 1        0      0       1       0      0  
 -------------------------------

Будет запущен сервер с ежесекундным обновлением статистики:

Лог запущеного сервера Cisco TRex в Docker-контейнере
-Per port stats table 
      ports |               0 |               1 
 -----------------------------------------------------------------------------------------
   opackets |               0 |               0 
     obytes |               0 |               0 
   ipackets |               0 |               0 
     ibytes |               0 |               0 
    ierrors |               0 |               0 
    oerrors |               0 |               0 
      Tx Bw |       0.00  bps |       0.00  bps 

-Global stats enabled 
 Cpu Utilization : 0.0  %  0.0 Gb/core 
 Platform_factor : 1.0  
 Total-Tx        :       0.00  bps  
 Total-Rx        :       0.00  bps  
 Total-PPS       :       0.00  pps  
 Total-CPS       :       0.00  cps  

 Expected-PPS    :       0.00  pps  
 Expected-CPS    :       0.00  cps  
 Expected-BPS    :       0.00  bps  

 Active-flows    :        0  Clients :        0   Socket-util : 0.0000 %    
 Open-flows      :        0  Servers :        0   Socket :        0 Socket/Clients :  -nan 
 drop-rate       :       0.00  bps   
 current time    : 1.6 sec  
 test duration   : 0.0 sec  

В другом терминале можно запустить консоль управления TRex сервером:

megalloid@trex:~$ sudo docker ps
CONTAINER ID   IMAGE            COMMAND       CREATED          STATUS          PORTS     NAMES
8baf64fc16c7   trexcisco/trex   "/bin/bash"   15 seconds ago   Up 15 seconds             intelligent_mcnulty

megalloid@trex:~$ sudo docker exec -it 8baf64fc16c7 bash
[root@8baf64fc16c7 v2.41]# ./trex-console

Using 'python' as Python interpeter

Connecting to RPC server on localhost:4501                   [SUCCESS]

Connecting to publisher server on localhost:4500             [SUCCESS]

Acquiring ports [0, 1]:                                      [SUCCESS]

Server Info:

Server version:   v2.41 @ STL
Server mode:      Stateless
Server CPU:       1 x 12th Gen Intel(R) Core(TM) i7-1255U
Ports count:      2 x 10Gbps @ Unknown	

-=TRex Console v2.0=-

Type 'help' or '?' for supported actions

trex>

Можно запустить трафик и заметить как бегают цифры статистики:

trex> start -f stl/imix.py -m 10kpps --port 0
trex> tui

Global Statistics

connection   : localhost, Port 4501                  total_tx_L2  : 28.25 Mb/sec                   
version      : v2.41                                 total_tx_L1  : 29.82 Mb/sec                   
cpu_util.    : 0.14% @ 1 cores (1 per port)          total_rx     : 28.25 Mb/sec                   
rx_cpu_util. : 0.0% / 9.76 Kpkt/sec                  total_pps    : 9.76 Kpkt/sec                  
async_util.  : 0.17% / 1.32 KB/sec                   drop_rate    : 0.00 b/sec                     
                                                     queue_full   : 0 pkts                         

Port Statistics

   port    |         0         |         1         |       total       
----------------------------------------------------------------------
owner      |              root |              root |                   
link       |                UP |                UP |                   
state      |      TRANSMITTING |              IDLE |                   
speed      |           10 Gb/s |           10 Gb/s |                   
CPU util.  |             0.14% |              0.0% |                   
--         |                   |                   |                   
Tx bps L2  |        28.25 Mbps |          0.00 bps |        28.25 Mbps 
Tx bps L1  |        29.82 Mbps |             0 bps |        29.82 Mbps 
Tx pps     |         9.76 Kpps |          0.00 pps |         9.76 Kpps 
Line Util. |            0.30 % |            0.00 % |                   
---        |                   |                   |                   
Rx bps     |          0.00 bps |        28.25 Mbps |        28.25 Mbps 
Rx pps     |          0.00 pps |         9.76 Kpps |         9.76 Kpps 
----       |                   |                   |                   
opackets   |            167053 |                 0 |            167053 
ipackets   |                 2 |            167044 |            167046 
obytes     |          60446500 |                 0 |          60446500 
ibytes     |               148 |          60442370 |          60442518 
opackets   |      167.05 Kpkts |            0 pkts |      167.05 Kpkts 
ipackets   |            2 pkts |      167.04 Kpkts |      167.05 Kpkts 
obytes     |          60.45 MB |               0 B |          60.45 MB 
ibytes     |             148 B |          60.44 MB |          60.44 MB 
-----      |                   |                   |                   
oerrors    |                 0 |                 0 |                 0 
ierrors    |                 0 |                 0 |                 0 

status:  -

Press 'ESC' for navigation panel...
status: [OK]

Заключение

Cisco TRex показал себя как мощный бесплатный инструмент для тестирования сетевой инфраструктуры, сочетающий достаточный уровень производительности с открытой экосистемой. Его открытый код, поддержка современного стека технологий и протоколов, способность адаптироваться под любые сценарии (от ЦОД до телеком-сетей) делают его прекрасным инструментом для инженеров, тестировщиков и архитекторов.

В следующих статьях я хочу рассмотреть подробнее несколько важных тем, рассмотрение которых могло бы углубить понимание как пользоваться этим инструментом на качественно новом уровне. Среди этих тем я бы выделил следующие:

  • генерация трафика Stateless со своим профилем трафика, с приведением реального сценария тестирования;

  • генерация трафика Statefull, с установкой соединений, который подошел бы для тестов брандмауэров, сетевых фильтров и прочих девайсов;

  • подробное препарирование внутреннего устройства и архитектуры Cisco TRex, его встроенных утилит;

  • автоматизация тестирования с использованием Python API и то, как я использую TRex в своей работе;

До встречи в новых статьях! =)

Комментарии (0)