Что такое Cisco TRex

Как описано в статье Генератор трафика Cisco TRex: запускаем нагрузочное тестирование сетевых устройств:

Это программный генератор трафика с открытым исходным кодом, работает на стандартных процессорах Intel на базе DPDK, поддерживает режимы с контролем состояния потока и без (stateful / stateless modes). Сравнительно простой и полностью масштабируемый.

Англоязычная документация для этого инструмента доступна на сайте.

Trex позволяет генерировать разные типы трафика и анализировать данные при их получении. Поддерживается работа на уровне MAC и IP. Можно задавать размер пакетов и их количество, контролировать скорость передачи данных.

Работа с генератором организована в среде Linux.

Одно из важных отличий генератора Trex — использование технологии DPDK, которая позволяет обойти «узкие места» в производительности сетевого стека Linux. DPDK или Data Plane Development Kit — это целый набор библиотек и драйверов для быстрой обработки пакетов, который позволяет исключить сетевой стек Linux из процесса обработки пакетов и взаимодействовать с сетевым устройством напрямую.

DPDK превращает процессор общего назначения в сервер пересылки пакетов. Благодаря этой трансформации отпадает необходимость в дорогостоящих коммутаторах и маршрутизаторах. Однако DPDK накладывает ограничения на использование конкретных сетевых адаптеров, список поддерживаемого железа указан на на ссылке — тут самая популярная платформа от Intel, т.е. обеспечена поддержка железа, которое работает с linux-драйверами e1000, ixgbe, i40e, ice, fm10k, ipn3ke, ifc, igc.

Также важно понимать, что для работы TRex-сервера на скоростях 10 Гбит/с необходим многоядерный процессор — от 4 ядер и выше, желательно CPU семейства Intel c поддержкой одновременной многопоточности (hyper-threading).

Подготовка TRex к работе

Логическая топология подключения TRex
Логическая топология подключения TRex

Данные TRex VM

Путь до TRex: /opt/trex/v3.00/

TRex Version: 3.00

DPDK version: 22.03.0

Промежуточные сети для TRex Virtual Router (TRVR)

Для клиентской сети (VLAN_87):

Default gw: 172.16.9.1/30

TRVR: 172.16.9.2/30

Для серверной сети (VLAN_88):

Default gw: 172.16.9.5/30

TRVR: 172.16.9.6/30

Эмулируемые сети за TRex Virtual Router (TRVR)

Клиентская сеть:

172.16.7.0/24

Серверная сеть:

172.16.12.0/24

ВАЖНО перед началом работ отключить Secure Boot на TRex VM.

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

1) Подключимся к vm и перейдем в директорию TRex:

[trexlab@lab-ine-trex-01 v3.00]$ cd /opt/trex/v3.00/
[trexlab@lab-ine-trex-01 v3.00]$ ls
astf              daemon_server          ouvp_stl              _t-rex-64-debug-o
astf_schema.json  doc_process.py         __pycache__           t-rex-64-debug-o
astf-sim          dpdk_nic_bind.py       run_functional_tests  _t-rex-64-o
astf-sim-utl      dpdk_setup_ports.py    run_regression        t-rex-64-o
automation        emu                    so                    trex-cfg
avl               exp                    stl                   trex_client_v3.00.tar.gz
bird              external_libs          stl-sim               trex-console
b.pcap            find_python.sh         test.yaml             trex_daemon_server
bp-sim-64         general_daemon_server  _t-rex-64             trex-emu
bp-sim-64-debug   generated              t-rex-64              trex_emu
cap2              ko                     _t-rex-64-debug       x710_ddp
cap222.pcap       master_daemon.py       t-rex-64-debug        y
cfg               ndr                    t-rex-64-debug-gdb

Структура папок TRex:

Location

Description

/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 - EMIX 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

/astf

ASTF native (py) profiles

/automation/trex_control_plane/interactive/trex/examples/astf

Automation examples

/automation/trex_control_plane/interactive/trex/astf

ASTF lib compiler (convert py to JSON), Interactive lib

/automation/trex_control_plane/stf

STF automation (used by ASTF mode)

2) Выведем таблицу интерфейсов, доступных для настройки DPDK:

[trexlab@lab-ine-trex-01 v3.00]$ sudo ./dpdk_setup_ports.py -t
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+
| ID | NUMA |   PCI   |        MAC        |            Name             | Driver  | Linux IF |  Active  |
+====+======+=========+===================+=============================+=========+==========+==========+
| 0  | -1   | 0b:00.0 | 00:50:56:a0:1b:92 | VMXNET3 Ethernet Controller | vmxnet3 | ens192   | *Active* |
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+
| 1  | -1   | 13:00.0 | 00:50:56:a0:01:33 | VMXNET3 Ethernet Controller | vmxnet3 | ens224   |          |
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+
| 2  | -1   | 1b:00.0 | 00:50:56:a0:55:ac | VMXNET3 Ethernet Controller | vmxnet3 | ens256   |          |
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+

ens192 - management interface для подключения к VM по SSH (его использовать нельзя)

ens224 и ens256 - доступны для настройки DPDK

3) Выполним настройку интерфейсов согласно данным TRex VM указанным выше:

[trexlab@lab-ine-trex-01 v3.00]$ sudo ./dpdk_setup_ports.py -i
By default, IP based configuration file will be created. Do you want to use MAC based config? (y/N)n
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+
| ID | NUMA |   PCI   |        MAC        |            Name             | Driver  | Linux IF |  Active  |
+====+======+=========+===================+=============================+=========+==========+==========+
| 0  | -1   | 0b:00.0 | 00:50:56:a0:1b:92 | VMXNET3 Ethernet Controller | vmxnet3 | ens192   | *Active* |
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+
| 1  | -1   | 13:00.0 | 00:50:56:a0:01:33 | VMXNET3 Ethernet Controller | vmxnet3 | ens224   |          |
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+
| 2  | -1   | 1b:00.0 | 00:50:56:a0:55:ac | VMXNET3 Ethernet Controller | vmxnet3 | ens256   |          |
+----+------+---------+-------------------+-----------------------------+---------+----------+----------+
Please choose an even number of interfaces from the list above, either by ID, PCI or Linux IF
Stateful will use order of interfaces: Client1 Server1 Client2 Server2 etc. for flows.
Stateless can be in any order.
Enter list of interfaces separated by space (for example: 1 3) : 1 2
 
For interface 1, assuming loopback to its dual interface 2.
Putting IP 1.1.1.1, default gw 2.2.2.2 Change it?(y/N).y
Please enter IP address for interface 1: 172.16.9.2
Please enter default gateway for interface 1: 172.16.9.1
For interface 2, assuming loopback to its dual interface 1.
Putting IP 2.2.2.2, default gw 1.1.1.1 Change it?(y/N).y
Please enter IP address for interface 2: 172.16.9.6
Please enter default gateway for interface 2: 172.16.9.5
Print preview of generated config? (Y/n)y
### Config file generated by dpdk_setup_ports.py ###
 
- version: 2
  interfaces: ['13:00.0', '1b:00.0']
  port_info:
      - ip: 172.16.9.2
        default_gw: 172.16.9.1
      - ip: 172.16.9.6
        default_gw: 172.16.9.5
 
  platform:
      master_thread_id: 0
      latency_thread_id: 1
      dual_if:
        - socket: 0
          threads: [2,3,4,5,6,7]
 
 
Save the config to file? (Y/n)y
Default filename is /etc/trex_cfg.yaml
Press ENTER to confirm or enter new file:
File /etc/trex_cfg.yaml already exist, overwrite? (y/N)y
Saved to /etc/trex_cfg.yaml.

Как указано в выводе, настройки интерфейсов будут храниться в конфигурационном файле по пути  /etc/trex_cfg.yaml.

Далее необходимо подготовить TRex к запуску в одном из доступных режимов:

Stateless mode 

Stateful mode

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

Данный режим удобно использовать при тестировании Firewall, NAT, DPI, Load Balancer, Network cache devices и т.д.

- Large scale — Supports about 10–30 million packets per second (Mpps) per core, scalable with the number of cores

- Each profile can support multiple streams, scalable to 10K parallel streams

- Each stream supports:

- Packet template - ability to build any packet (including malformed) using Scapy (example: MPLS/IPv4/Ipv6/GRE/VXLAN/NSH)

-- Ability to change any field inside the packet

-- Ability to change the packet size

-- Mode - Continuous/Burst/Multi-burst

-- Rate specification in pps, line rate percentage or L1/L2 bandwidth

-- Action - stream can trigger a stream

- Interactive support - Fast Console, GUI

- Statistics per interface or per stream supported in hardware/software

- Latency and Jitter per stream

- Blazingly fast Python automation API

- Capture/Monitor traffic with BPF filters - no need for Wireshark

- Capture network traffic by redirecting the traffic to Wireshark

- PCAP file import/export with huge pcap file transmission support (e.g. 1TB pcap file) for DPI

- Multi-user support

- Emulate L7 applications, e.g. HTTP/HTTPS/Citrix

- Multi profile support and ability to group flows

- Performance and scale:

- High bandwidth - 200 Gb/sec

- High connection rate - order of MCPS

- Scale to millions of active established flows

- Benchmark and Stress features/devices like:

-- NAT

-- DPI

-- Load Balancer

-- Network cache devices

-- Firewalls

Stateful(STF) vs Advance Stateful (ASTF)

- Same Flexible tuple generator

- Same Clustering mode

- Same VLAN support

- NAT - no need for complex learn mode. ASTF supports NAT64 out of the box.

- Flow order. ASTF has inherent ordering verification using the TCP layer. It also checks IP/TCP/UDP checksum out of the box.

- Latency measurement is supported in both.

- In ASTF mode, you can’t control the IPG, less predictable (concurrent flows is less deterministic)

- ASTF can be interactive (start, stop, stats)

Advance Stateful mode в данном документе рассматриваться не будет

Stateless mode

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

Методика тестирования переключений

TRex позволяет одновременно отображать в консоли статистику только по 4 потокам, поэтому для проведения тестирования рекомендуется использовать минимум 4 5tuple-потока со следующими параметрами:

Описание

ID

Source parameters

Destination

Rate, pps

Frame size, bytes

Stats

1

Прямой трафик (клиент --> сервер)

10

IP:172.16.7.1-172.16.7.60

172.16.12.10

10000

1400

On

2

Прямой трафик (клиент --> сервер)

20

IP:172.16.7.61-172.16.7.120

172.16.12.20

10000

1400

On

3

Прямой трафик (клиент --> сервер)

30

IP:172.16.7.121-172.16.7.180

172.16.12.30

10000

1400

On

4

Прямой трафик (клиент --> сервер)

40

IP:172.16.7.181-172.16.7.240

172.16.12.40

10000

1400

On

*Rate (pps, Packets Per Second) : Частота генерации в пакетах в секунду

*Frame size (bytes) : Размер генерируемого пакета. Рекомендуемый размер 1400, но при наличии потерь данный параметр можно понизить

*Stats : Определяет будет ли отображаться статистика данного потока в консоли TRex (прописывается в python-скрипте, параметр flow_stats)

В отчет заносятся потери пакетов из всех отслеживаемых потоков в момент переключения, затем выбирается самое большое число потерь и переводится в миллисекунды (1 мс = 10 пакетов при частоте в 10000 pps):

Примеры отчета с односторонним потоком данных
Примеры отчета с односторонним потоком данных

В некоторых сценариях дополнительно настраивают еще 4 обратных потока без отслеживания (Stats Off) для равномерной нагрузки портов во всех направлениях:

Фрагмент отчета с двусторонним потоком данных
Фрагмент отчета с двусторонним потоком данных

Процесс настройки TRex в Stateless mode

1) Подготовим python-скрипт (ouvp_stl/new_marker_streams_p0_p1.py):

from trex_stl_lib.api import *
 
def generate_payload(length):
      word = ''
      alphabet_size = len(string.ascii_letters)
      for i in range(length):
          word += string.ascii_letters[(i % alphabet_size)]
      return word
 
class STLS1(object):
 
    def __init__ (self):
        self.fsize       =200;
 
    def create_stream_to_1 (self):
        size = self.fsize - 4;
        #generating 5tuple flows with 802.1p =0 and dscp = be (00, tos = 0), should be dropped
        base_pkt =  Ether()/IP(src="172.16.7.1", dst = "172.16.12.10")/UDP(sport=1025,dport=12)
        vm = STLScVmRaw( [ STLVmTupleGen( ip_min = "172.16.7.1",
                                          ip_max = "172.16.7.60",
                                          port_min = 1025,
                                          port_max = 65535,
                                          name = "tuple"),
                           STLVmWrFlowVar(fv_name="tuple.ip", pkt_offset="IP.src"),
                           STLVmFixIpv4(offset = "IP"),
                           STLVmWrFlowVar(fv_name="tuple.port", pkt_offset="UDP.sport"),
                          ],
                        )
        pkt = STLPktBuilder(pkt=base_pkt/generate_payload(size-len(base_pkt)), vm=vm)
 
        return STLStream( name='1 stream to',
                          packet = pkt,
                          mode = STLTXCont( pps = 10000 ),
                          flow_stats = STLFlowStats(pg_id = 10)
                        )
 
    def create_stream_to_2 (self):
        size = self.fsize - 4;
        #generating 5tuple flows with 802.1p =0 and dscp = be (00, tos = 0), should be dropped
        base_pkt =  Ether()/IP(src="172.16.7.61", dst = "172.16.12.20")/UDP(sport=1025,dport=12)
        vm = STLScVmRaw( [ STLVmTupleGen( ip_min = "172.16.7.61",
                                          ip_max = "172.16.7.120",
                                          port_min = 1025,
                                          port_max = 65535,
                                          name = "tuple"),
                           STLVmWrFlowVar(fv_name="tuple.ip", pkt_offset="IP.src"),
                           STLVmFixIpv4(offset = "IP"),
                           STLVmWrFlowVar(fv_name="tuple.port", pkt_offset="UDP.sport"),
                          ],
                        )
        pkt = STLPktBuilder(pkt=base_pkt/generate_payload(size-len(base_pkt)), vm=vm)
 
        return STLStream( name='2 stream to',
                          packet = pkt,
                          mode = STLTXCont( pps = 10000 ),
                          flow_stats = STLFlowStats(pg_id = 20)
                        )
 
    def create_stream_to_3 (self):
        size = self.fsize - 4;
        #generating 5tuple flows with 802.1p =0 and dscp = be (00, tos = 0), should be dropped
        base_pkt =  Ether()/IP(src="172.16.7.121", dst = "172.16.12.30")/UDP(sport=1025,dport=12)
        vm = STLScVmRaw( [ STLVmTupleGen( ip_min = "172.16.7.121",
                                          ip_max = "172.16.7.180",
                                          port_min = 1025,
                                          port_max = 65535,
                                          name = "tuple"),
                           STLVmWrFlowVar(fv_name="tuple.ip", pkt_offset="IP.src"),
                           STLVmFixIpv4(offset = "IP"),
                           STLVmWrFlowVar(fv_name="tuple.port", pkt_offset="UDP.sport"),
                          ],
                        )
        pkt = STLPktBuilder(pkt=base_pkt/generate_payload(size-len(base_pkt)), vm=vm)
 
        return STLStream( name='3 stream to',
                          packet = pkt,
                          mode = STLTXCont( pps = 10000 ),
                          flow_stats = STLFlowStats(pg_id = 30)
                        )
 
    def create_stream_to_4 (self):
        size = self.fsize - 4;
        #generating 5tuple flows with 802.1p =0 and dscp = be (00, tos = 0), should be dropped
        base_pkt =  Ether()/IP(src="172.16.7.181", dst = "172.16.12.40")/UDP(sport=1025,dport=12)
        vm = STLScVmRaw( [ STLVmTupleGen( ip_min = "172.16.7.181",
                                          ip_max = "172.16.7.240",
                                          port_min = 1025,
                                          port_max = 65535,
                                          name = "tuple"),
                           STLVmWrFlowVar(fv_name="tuple.ip", pkt_offset="IP.src"),
                           STLVmFixIpv4(offset = "IP"),
                           STLVmWrFlowVar(fv_name="tuple.port", pkt_offset="UDP.sport"),
                          ],
                        )
        pkt = STLPktBuilder(pkt=base_pkt/generate_payload(size-len(base_pkt)), vm=vm)
 
        return STLStream( name='4 stream to',
                          packet = pkt,
                          mode = STLTXCont( pps = 10000 ),
                          flow_stats = STLFlowStats(pg_id = 40)
                        )
 
 
 
    def get_streams (self, direction = 0, **kwargs):
        # create 4 stream
        #self.streams = streams
        return [
          self.create_stream_to_1(),
          self.create_stream_to_2(),
          self.create_stream_to_3(),
          self.create_stream_to_4(),
          ]
 
# dynamic load - used for trex console or simulator
def register():
    return STLS1()

Рекомендуется изучить документацию TRex и скрипты расположенные в директории /stl

2) Откроем TRex в двух окнах. В первом окне запустим TRex в stateless mode:

[trexlab@lab-ine-trex-01 v3.00]$ sudo ./t-rex-64 -i
 
-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  %
 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    : 3.6 sec
 test duration   : 0.0 sec

3) Во втором окне зайдем в консоль TRex:

[trexlab@lab-ine-trex-01 v3.00]$ sudo ./trex-console
 
Using 'python3' 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:   v3.00 @ STL
Server mode:      Stateless
Server CPU:       1 x Intel(R) Xeon(R) Gold 6252 CPU @ 2.10GHz
Ports count:      2 x 10Gbps @ VMXNET3 Ethernet Controller
 
-=TRex Console v3.0=-
 
Type 'help' or '?' for supported actions
 
trex>

4) Во втором окне запустим генератор используя подготовленный ранее скрипт:

trex>start -f ouvp_stl/new_marker_streams_p0_p1.py --port 0 -d 180

-f <file> : Указывает на путь до python-скрипта

--port <num> : Указывает на исходящий порт генератора, без данного ключа генерация будет выполняться со всех доступных TRex портов

-d <num> : Задает продолжительность генерации в секундах (значение по умолчанию 3600 сек)

5) Во втором окне откроем графический интерфейс TRex:

trex>tui
 
Global Statistics
 
connection   : localhost, Port 4501                       total_tx_L2  : 64.09 Mbps
version      : STL @ v3.00                                total_tx_L1  : 70.5 Mbps
cpu_util.    : 0.74% @ 1 cores (1 per dual port)          total_rx     : 64.09 Mbps
rx_cpu_util. : 0.34% / 40.06 Kpps                         total_pps    : 40.06 Kpps
async_util.  : 0% / 12.73 bps                             drop_rate    : 0 bps
total_cps.   : 0 cps                                      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.74% |              0.0% |
--         |                   |                   |
Tx bps L2  |        64.09 Mbps |             0 bps |        64.09 Mbps
Tx bps L1  |         70.5 Mbps |             0 bps |         70.5 Mbps
Tx pps     |        40.06 Kpps |             0 pps |        40.06 Kpps
Line Util. |            0.71 % |               0 % |
---        |                   |                   |
Rx bps     |             0 bps |        64.09 Mbps |        64.09 Mbps
Rx pps     |             0 pps |        40.06 Kpps |        40.06 Kpps
----       |                   |                   |
opackets   |           1476516 |                 0 |           1476516
ipackets   |                 0 |           1476516 |           1476516
obytes     |         295303200 |                 0 |         295303200
ibytes     |                 0 |         295303200 |         295303200
tx-pkts    |        1.48 Mpkts |            0 pkts |        1.48 Mpkts
rx-pkts    |            0 pkts |        1.48 Mpkts |        1.48 Mpkts
tx-bytes   |          295.3 MB |               0 B |          295.3 MB
rx-bytes   |               0 B |          295.3 MB |          295.3 MB
-----      |                   |                   |
oerrors    |                 0 |                 0 |                 0
ierrors    |                 0 |                 0 |                 0
 
status:  /
 
Press 'ESC' for navigation panel...
status:
 
tui>

6) Включим режим отображения статистики потоков, последовательно нажав клавиши «Esc», «S» и еще раз «Esc»:

Global Statistics
 
connection   : localhost, Port 4501                       total_tx_L2  : 64.17 Mbps
version      : STL @ v3.00                                total_tx_L1  : 70.58 Mbps
cpu_util.    : 0.83% @ 1 cores (1 per dual port)          total_rx     : 64.18 Mbps
rx_cpu_util. : 0.31% / 40.11 Kpps                         total_pps    : 40.1 Kpps
async_util.  : 0% / 8.93 bps                              drop_rate    : 0 bps
total_cps.   : 0 cps                                      queue_full   : 0 pkts
 
Streams Statistics
 
  PG ID    |        10         |        20         |        30         |        40
-----------+-------------------+-------------------+-------------------+------------------
Tx pps     |           10 Kpps |           10 Kpps |           10 Kpps |           10 Kpps
Tx bps L2  |           16 Mbps |           16 Mbps |           16 Mbps |           16 Mbps
Tx bps L1  |         17.6 Mbps |         17.6 Mbps |         17.6 Mbps |         17.6 Mbps
---        |                   |                   |                   |
Rx pps     |           10 Kpps |           10 Kpps |           10 Kpps |           10 Kpps
Rx bps     |           16 Mbps |           16 Mbps |           16 Mbps |           16 Mbps
----       |                   |                   |                   |
opackets   |           2074074 |           2074074 |           2074074 |           2074074
ipackets   |           2074074 |           2074074 |           2074074 |           2074074
obytes     |         414814800 |         414814800 |         414814800 |         414814800
ibytes     |         414813800 |         414813800 |         414813800 |         414813800
-----      |                   |                   |                   |
opackets   |        2.07 Mpkts |        2.07 Mpkts |        2.07 Mpkts |        2.07 Mpkts
ipackets   |        2.07 Mpkts |        2.07 Mpkts |        2.07 Mpkts |        2.07 Mpkts
obytes     |         414.81 MB |         414.81 MB |         414.81 MB |         414.81 MB
ibytes     |         414.81 MB |         414.81 MB |         414.81 MB |         414.81 MB
 
status:  /
 
Press 'ESC' for navigation panel...
status:
 
tui>

Нас интересуют расхождения в значениях «opackets» и «ipackets» в каждом потоке.

Остановить генератор можно с помощью команды «stop».

Выход из графического интерфейса и консоли выполняется с помощью команды «q».

7) Выполним переключение и занесем в отчет потери пакетов в каждом потоке.

8) При повторном тестировании необходимо выполнить следующие действия:

  • В первом окне необходимо перезапустить TRex в stateless mode;

  • Во втором окне необходимо перезайти в консоль TRex и повторить все действия.

Stateful mode

В данном режиме для запуска генератора используются два конфигурационных файла, в которых указываются все параметры генерации:

  • файл, в котором указывается первичная сетевая настройка TRex, по умолчанию это файл /etc/trex_cfg.yaml, который мы настраивали ранее;

  • файл, описывающий профиль генерируемого трафик, данные файлы в основном хранятся в директориях  /cap2 и /avl.

Процесс настройки TRex в Stateful mode

1) Проверим первый конфигурационный файл (/etc/trex_cfg.yaml):

### Config file generated by dpdk_setup_ports.py ###
 
- version: 2
  interfaces: ['13:00.0', '1b:00.0']
  port_info:
      - ip: 172.16.9.2
        default_gw: 172.16.9.1
      - ip: 172.16.9.6
        default_gw: 172.16.9.5
 
  platform:
      master_thread_id: 0
      latency_thread_id: 1
      dual_if:
        - socket: 0
          threads: [2,3,4,5,6,7]

2) Проверим второй конфигурационный файл (cap2/fw-int.yaml):

- duration : 40
  generator :
          distribution : "seq"
          clients_start : "172.16.7.1"
          clients_end   : "172.16.7.255"
          servers_start : "172.16.12.1"
          servers_end   : "172.16.12.255"
          clients_per_gb : 0
          min_clients    : 0
          dual_port_mask : "1.0.0.0"
          tcp_aging      : 0
          udp_aging      : 0
  cap_info :
     - name: cap2/Oracle.pcap
       cps : 1.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/Video_Calls.pcap
       cps : 11.4
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/rtp_160k.pcap
       cps : 3.6
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/rtp_250k_rtp_only_1.pcap
       cps : 4.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/rtp_250k_rtp_only_2.pcap
       cps : 4.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/smtp.pcap
       cps : 34.2
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/Voice_calls_rtp_only.pcap
       cps : 66.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/citrix.pcap
       cps : 105.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/dns.pcap
       cps : 240.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/exchange.pcap
       cps : 63.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/http_browsing.pcap
       cps : 267.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/http_get.pcap
       cps : 34.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/http_post.pcap
       cps : 345.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/https.pcap
       cps : 111.0
       ipg : 10000
       rtt : 10000
       w   : 4
     - name: cap2/mail_pop.pcap
       cps : 34.2
       ipg : 10000
       rtt : 10000
       w   : 4

*distribution : Currently, only sequential distribution is supported in IP allocation. This means the IP address is increased by one for each flow;

*clients_per_gb : Not used

*min_clients : Not used

*dual_port_mask : Currently, there is one global IP pool for clients and servers. It serves all templates. All templates will allocate IP from this global pool. Each TRex client/server "dual-port" (pair of ports, such as port 0 for client, port 1 for server) has its own generator offset, taken from the config file. The offset is called dual_port_mask

*tcp_aging : Time in sec to linger the deallocation of TCP flows (in particular return the src_port to the pool). Good for cases when there is a very high socket utilization (>50%) and there is a need to verify that socket source port are not wrapped and reuse. Default value is zero. Better to keep it like that from performance point of view. High value could create performance penalty

*udp_aging : Same as tcp_aging for UDP flows

*name : The name of the template pcap file. The pcap file should include only one flow. (Exception: in case of plug-ins)

*cps : Number of connections per second to generate. In the example, 1.0 means 1 connection per secod

*ipg : inter-packet gap in microseconds

*rtt : should be the same as ipg

*w : This indicates to the IP generator how to generate the flows. If w=2, two flows from the same template will be generated in a burst (more for HTTP that has burst of flows)

3) Запустим генератор используя подготовленные ранее конфигурационные файлы:

[trexlab@lab-ine-trex-01 v3.00]$ sudo ./t-rex-64 --cfg /etc/trex_cfg.yaml -f cap2/fw-int.yaml -d 30 -m 1 --nc

--cfg <file> : Use file as TRex config file instead of the default /etc/trex_cfg.yaml

-f <file> : YAML file with traffic template configuration (Will run TRex in 'stateful' mode)

-d <num> : Duration of the test in sec (default is 3600)

-m <num> : Rate multiplier. Multiply basic rate of templates by this number

--nc : If set, will not wait for all flows to be closed, before terminating - see manual for more information

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