Cisco TRex Traffic Generator: Meluncurkan Pengujian Beban Perangkat Jaringan





Ketika mengembangkan router lain, kami menguji kinerja jaringan menggunakan sumber terbuka yang bermanfaat - penghasil lalu lintas Cisco TRex. Apa alat ini? Bagaimana cara menggunakannya? Dan bagaimana ini bisa bermanfaat bagi para insinyur pengembangan? Di bawah ini adalah jawaban untuk pertanyaan-pertanyaan ini.



1. Apa itu Cisco TRex



Ini adalah generator lalu lintas perangkat lunak sumber terbuka yang berjalan pada prosesor berbasis Intel DPDK standar dan mendukung mode stateful / stateless. Relatif sederhana dan terukur sepenuhnya.



Dokumentasi bahasa Inggris untuk alat ini tersedia di situs web .



Trex memungkinkan Anda untuk menghasilkan berbagai jenis lalu lintas dan menganalisis data saat diterima. Bekerja di level MAC dan IP didukung. Anda dapat mengatur ukuran paket dan jumlahnya, mengontrol laju transfer data.



Bekerja dengan generator diatur dalam lingkungan Linux.



Salah satu perbedaan penting antara generator Trex adalah penggunaan teknologi DPDK, yang memungkinkan Anda untuk melewati kemacetan kinerja dalam tumpukan jaringan Linux. DPDK atau Data Plane Development Kit adalah seperangkat perpustakaan dan driver untuk pemrosesan paket cepat yang memungkinkan Anda untuk mengecualikan tumpukan jaringan Linux dari pemrosesan paket dan berinteraksi langsung dengan perangkat jaringan.



DPDK mengubah prosesor tujuan umum menjadi server penerusan paket. Transformasi ini menghilangkan kebutuhan untuk switch dan router yang mahal. Namun, DPDK memberlakukan batasan pada penggunaan adapter jaringan tertentu, daftar perangkat keras yang didukung ditunjukkan pada tautan - ini adalah platform paling populer dari Intel, yaitu dukungan perangkat keras disediakan yang berfungsi dengan driver linux e1000, ixgbe, i40e, ice, fm10k, ipn3ke, ifc, igc.



Penting juga dipahami bahwa agar server TRex dapat beroperasi pada 10 Gbps, diperlukan prosesor multi-core - mulai dari 4 core atau lebih tinggi, lebih disukai CPU Intel dengan dukungan multi-threading (hyper-threading) simultan.



2. Cara mendapatkan dan mencoba TRex



1) Unduh arsip dari server trex-tgn.cisco.com: trex-tgn.cisco.com/trex/release/ Bongkar



arsip di direktori home pengguna "/ home / user", di mana pengguna adalah nama pengguna.



[bash]>wget --no-cache https://trex-tgn.cisco.com/trex/release/latest
[bash]>tar -xzvf latest


2) Mengkonfigurasi antarmuka untuk mengirim dan menerima data.



Mari kita melakukan konfigurasi menggunakan utilitas "dpdk_setup_ports.py" yang disertakan dalam arsip dengan TRex. Anda dapat mengkonfigurasi antarmuka jaringan yang digunakan TRex di tingkat MAC atau IP. Untuk memulai, Anda perlu menjalankan utilitas ini dengan kunci pengaturan interaktif "sudo ./dpdk_setup_ports.py –i".



Langkah pertama adalah meninggalkan konfigurasi pada level MAC (Apakah Anda ingin menggunakan konfigurasi berbasis MAC? (Y / N) n).



Langkah kedua adalah memilih sepasang antarmuka jaringan yang dengannya kami akan bekerja, dalam kasus kami kartu jaringan Intel X710 bekerja dengan 4 antarmuka jaringan, kami akan menggunakan soket 1 dan 4 kartu jaringan.







Pada langkah ketiga, sistem akan menawarkan untuk secara otomatis membuat konfigurasi tertutup - ketika data meninggalkan port 1 dan tiba di port 2 (dan kembali), semua dalam satu PC. Kami harus meninggalkan skema ini dan mengkonfigurasi skema routing untuk 2 PC.



Pada langkah keempat dan kelima, kami setuju untuk menyimpan konfigurasi ke file /etc/trex_cfg.yaml.



Sebagai contoh, pertimbangkan konfigurasi pada level IP untuk skema koneksi berikut:







File konfigurasi terletak di sini: "/etc/trex_cfg.yaml". File konfigurasi sederhana ditunjukkan di bawah ini untuk NIC 2-port dengan CPU yang mendukung 8 utas:



### Config file generated by dpdk_setup_ports.py ###
- version: 2
  interfaces: ['01:00.0', '01:00.3']
  port_info:
      - ip: 192.168.253.106
        default_gw: 192.168.253.107
      - ip: 192.168.254.106
        default_gw: 192.168.254.107
 
  platform:
      master_thread_id: 0
      latency_thread_id: 1
      dual_if:
    	- socket: 0
      	threads: [2,3,4,5,6,7]


Dalam konfigurasi:



  • '01: 00.0 ', '01: 00.3' - nama Eth-interfaces dalam sistem Linux yang digunakan.
  • ip: 192.168.253.106 - alamat port dari Server TRex PC dari mana lalu lintas dihasilkan.
  • default_gw: 192.168.253.107 - alamat 1 port PC DUT (Perangkat sedang diuji).
  • ip: 192.168.254.106 - alamat port PC Server TRex, dari mana lalu lintas dikembalikan setelah melewati aturan QOS.
  • default_gw: 192.168.253.107 - alamat 2 port PC DUT.


Perhatian! Sistem TRex melarang penggunaan subnet yang sama ketika menghasilkan stream yang digunakan oleh sistem, untuk ini, ketika menghasilkan paket, subnet 16.0.0.0 dan 48.0.0.0 digunakan.



3) Mengkonfigurasi antarmuka pada mesin jarak jauh.



Hal ini diperlukan untuk mengkonfigurasi penerusan dan rute sehingga sistem (DUT) di mana kita akan melewati lalu lintas tahu ke mana harus menerima dan ke mana harus mengirim paket.



Konfigurasikan aturan perutean aliran pada DUT PC:



sudo echo 1 > /proc/sys/net/ipv4/ip_forward
sudo route add -net 16.0.0.0 netmask 255.0.0.0 gw 192.168.253.106
sudo route add -net 48.0.0.0 netmask 255.0.0.0 gw 192.168.254.106


4) Mulai server TRex dalam mode astf:



cd v2.XX
sudo ./t-rex-64 -i --astf


Jika server TRex berhasil diluncurkan, kami akan melihat informasi tentang port Ethernet yang digunakan untuk pengujian:



The ports are bound/configured.
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 
tx queues per port      : 3


5) Meluncurkan konsol TRex



Menggunakan konsol, di jendela terpisah, mulailah menghasilkan aliran dari contoh yang sudah jadi (folder dengan contoh astf ada di arsip untuk TRex):



cd v2.XX
./trex-console
start -f astf/http_simple.py -m 1
 
start (options):
-a (all ports)
-port 1 2 3 (ports 1 2 3)
-d duration (-d 100 -d 10m -d 1h)
-m stream strength (-m 1 -m 1gb -m 40%)
-f load from disk the streams file


Jika peluncuran berhasil, kami akan melihat statistik arus lalu lintas di konsol server TRex:



Global stats enabled
Cpu Utilization : 0.3  %  0.6 Gb/core 
Platform_factor : 1.0  
Total-Tx        :     759.81 Kbps  
Total-Rx        :     759.81 Kbps  
Total-PPS       :      82.81  pps  
Total-CPS       :       2.69  cps  
 
Expected-PPS    :       0.00  pps  
Expected-CPS    :       0.00  cps  
Expected-L7-BPS :       0.00  bps  
 
Active-flows    :        2  Clients :        0   Socket-util : 0.0000 %    
Open-flows      :      641


3. Otomasi pengembangan dan pengujian dengan TRex



Dalam proses mengembangkan router jaringan, kami menulis banyak tes untuk TRex, sehingga muncul pertanyaan untuk menjalankannya dalam mode otomatis menggunakan python. Bagaimana kami mengaturnya:



Kami memulai server TRex dalam mode stl:



cd v2.XX
sudo ./t-rex-64 -i --stl


Setel variabel lingkungan untuk python, karena TRex bekerja bersama dengan python.



ekspor PYTHONPATH = / rumah / !!! pengguna !!! / v2.XX / automation / trex_control_plane / interaktif, di mana "!!! user !!!" - nama pengguna dan direktori home, v2.XX - versi perangkat lunak TRex yang diunduh dan dibongkar ke dalam folder ini.



Kami memulai generator traffic menggunakan python, daftar contoh konfigurasi diberikan di bawah ini.



python example_test_2bidirectstream.py



Output yang Diharapkan:



Transmit: 10000.24576MByte/s Receive: 10000.272384MByte/s
Stream 1 TX: 4487179200 Bit/s RX: 4487179200 Bit/s
Stream 2 TX: 2492873600 Bit/s RX: 2492873600 Bit/s
Stream 3 TX: 1994294400 Bit/s RX: 1994294400 Bit/s
Stream 4 TX: 997147200 Bit/s RX: 997147200 Bit/s


Mari kita lihat contoh ini:



c = STLClient (server = '127.0.0.1')



Buat koneksi ke server TRex, dalam hal ini, koneksi dibuat ke mesin yang sama dengan server.



  • "Base_pkt_dir_a, base_pkt_dir_b, base_pkt_dir_c, base_pkt_dir_d" - template paket, yang berisi alamat sumber dan tujuan, sumber dan port tujuan. Dalam contoh ini, 4 aliran dibuat, 2 dalam satu arah dan 2 dalam arah yang berlawanan.
  • "S1, s2, s3, s4" - meminta parameter dari aliran yang dihasilkan dari kelas STLStream, seperti stream ID dan bitrate, dalam ID1 kasus kami = 4,5 Gbps, ID2 = 2,5 Gbps, ID3 = 2 Gbps, ID4 = 1 Gbps.


Daftar file konfigurasi aliran example_test_2bidirectstream.py



# get TRex APIs
from trex_stl_lib.api import *
 
c = STLClient(server = '127.0.0.1')
c.connect()
 
try:
    # create a base packet with scapy
    base_pkt_dir_a = Ether()/IP(src="16.0.0.1",dst="48.0.0.1")/UDP(dport=5001,sport=50001)
    base_pkt_dir_b = Ether()/IP(src="48.0.0.1",dst="16.0.0.1")/UDP(dport=50001,sport=5001)
 
    base_pkt_dir_c = Ether()/IP(src="16.0.0.2",dst="48.0.0.2")/UDP(dport=5002,sport=50002)
    base_pkt_dir_d = Ether()/IP(src="48.0.0.2",dst="16.0.0.2")/UDP(dport=50002,sport=5002)
 
    # pps : float
    # Packets per second
    #
    # bps_L1 : float
    # Bits per second L1 (with IPG)
    #
    # bps_L2 : float
    # Bits per second L2 (Ethernet-FCS)
    packet_size = 1400
 
    def pad(base_pkt):
        pad = (packet_size - len(base_pkt)) * 'x'
        return pad
 
    s1 = STLStream(packet=STLPktBuilder(base_pkt_dir_a/pad(base_pkt_dir_a)), mode=STLTXCont(bps_L2=4500000000), flow_stats=STLFlowStats(pg_id=1))
    s2 = STLStream(packet=STLPktBuilder(base_pkt_dir_b/pad(base_pkt_dir_b)), mode=STLTXCont(bps_L2=2500000000), flow_stats=STLFlowStats(pg_id=2))
    s3 = STLStream(packet=STLPktBuilder(base_pkt_dir_c/pad(base_pkt_dir_c)), mode=STLTXCont(bps_L2=2000000000), flow_stats=STLFlowStats(pg_id=3))
    s4 = STLStream(packet=STLPktBuilder(base_pkt_dir_d/pad(base_pkt_dir_d)), mode=STLTXCont(bps_L2=1000000000), flow_stats=STLFlowStats(pg_id=4))
 
    my_ports = [0, 1]
 
    c.reset(ports = [my_ports[0], my_ports[1]])
 
    # add the streams
    c.add_streams(s1, ports = my_ports[0])
    c.add_streams(s2, ports = my_ports[1])
    c.add_streams(s3, ports = my_ports[0])
    c.add_streams(s4, ports = my_ports[1])
 
    # start traffic with limit of 10 seconds (otherwise it will continue forever)
    # bi direction
    testduration = 10
    c.start(ports=[my_ports[0], my_ports[1]], duration=testduration)
    # hold until traffic ends
    c.wait_on_traffic()
 
    # check out the stats
    stats = c.get_stats()
 
    # get global stats
    totalstats = stats['global']
    totaltx = round(totalstats.get('tx_bps'))
    totalrx = round(totalstats.get('rx_bps'))
    print('Transmit: {}MByte/s Receive: {}MByte/s'.format((totaltx / 1000000), (totalrx / 1000000)))
    c.clear_stats(ports = [my_ports[0], my_ports[1]])
 
    # get flow stats
    totalstats = stats['flow_stats']
    stream1 = totalstats[1]
 
    stream2 = totalstats[2]
    stream3 = totalstats[3]
    stream4 = totalstats[4]
    totaltx_1 = stream1.get('tx_pkts')
    totalrx_1 = stream1.get('rx_pkts')
    print('Stream 1 TX: {} Bit/s RX: {} Bit/s'.format((totaltx_1['total'] / testduration * packet_size * 8),
                                                               (totalrx_1['total'] / testduration * packet_size * 8)))
    totaltx_2 = stream2.get('tx_pkts')
    totalrx_2 = stream2.get('rx_pkts')
    print('Stream 2 TX: {} Bit/s RX: {} Bit/s'.format((totaltx_2['total'] / testduration * packet_size * 8),
                                                               (totalrx_2['total'] / testduration * packet_size * 8)))
    totaltx_3 = stream3.get('tx_pkts')
    totalrx_3 = stream3.get('rx_pkts')
    print('Stream 3 TX: {} Bit/s RX: {} Bit/s'.format((totaltx_3['total'] / testduration * packet_size * 8),
                                                               (totalrx_3['total'] / testduration * packet_size * 8)))
    totaltx_4 = stream4.get('tx_pkts')
    totalrx_4 = stream4.get('rx_pkts')
    print('Stream 4 TX: {} Bit/s RX: {} Bit/s'.format((totaltx_4['total'] / testduration * packet_size * 8),
                                                               (totalrx_4['total'] / testduration * packet_size * 8)))
except STLError as e:
    print(e)
 
finally:
    c.disconnect()


Kesimpulan



Saat menyiapkan panduan ini untuk Habr, kami meluncurkan dan menguji operasi sistem DUT dengan 4 utas, mengumpulkan informasi tentang utas dan statistik global.



Operasi yang dijelaskan di atas diluncurkan menggunakan python, yang berarti menggunakan TRex, Anda dapat mengotomatiskan pengujian dan debugging perangkat jaringan dan produk perangkat lunak - dalam satu lingkaran atau saat menjalankan pengujian dalam python secara berurutan.



Jadi mengapa Cisco TRex lebih baik atau lebih buruk daripada generator lalu lintas serupa lainnya? Misalnya, program iperf client-server yang populer? Dalam skenario penggunaan TRex, kami melihat deskripsi menyiapkan dan bekerja dengan stream. Baik alat pengujian dan debugging baik: iperf - untuk pengujian cepat fungsionalitas saat dalam perjalanan, dan TRex melakukan pekerjaan yang sangat baik untuk mengotomatisasi pengujian dan pengembangan perangkat dan sistem jaringan yang kompleks, di mana kemampuan untuk mengkonfigurasi aliran multi-ulir sangat penting untuk mengonfigurasi setiap aliran untuk tugas tertentu dan menganalisis hasil keluaran ...



TRex memungkinkan Anda membuat templat untuk hampir semua jenis lalu lintas dan memperkuatnya untuk menghasilkan serangan DDoS skala besar, termasuk aliran TCP-SYN, UDP, dan ICMP. Kemampuan untuk menghasilkan aliran lalu lintas besar memungkinkan Anda untuk mensimulasikan serangan dari beberapa klien di beberapa server target.



Jadi, jika Anda belum mencoba alat ini, Anda dapat membuat catatan. Dan jika Anda mencoba - bagikan contoh dan umpan balik Anda di komentar. Sangat menarik untuk mengetahui apa yang dipikirkan dan digunakan TRex oleh sesama insinyur.



All Articles