Cisco TRex Traffic Generator: بدء اختبار تحميل أجهزة الشبكة





عند تطوير جهاز توجيه آخر ، اختبرنا أداء الشبكة باستخدام قطعة مفيدة مفتوحة المصدر - منشئ حركة مرور Cisco TRex. ما هذه الأداة؟ كيفية استخدامها؟ وكيف يمكن أن تكون مفيدة لمهندسي التنمية؟ فيما يلي إجابات لهذه الأسئلة.



1. ما هو Cisco TRex



إنه مولد حركة برمجيات مفتوح المصدر يعمل على معالجات Intel DPDK القياسية ويدعم الأوضاع ذات الحالة / بدون الحالة. بسيطة نسبيا وقابلة للتطوير بالكامل.



وثائق اللغة الإنجليزية لهذه الأداة متاحة على الموقع .



يسمح لك Trex بإنشاء أنواع مختلفة من حركة المرور وتحليل البيانات عند تلقيها. يتم دعم العمل على مستوى MAC و IP. يمكنك تحديد حجم الحزم وعددها ، والتحكم في معدل نقل البيانات.



يتم تنظيم العمل مع المولد في بيئة Linux.



أحد الاختلافات المهمة بين مولد Trex هو استخدام تقنية DPDK ، والتي تسمح لك بتجاوز اختناقات الأداء في حزمة شبكة Linux. DPDK أو Data Plane Development Kit هي مجموعة من المكتبات وبرامج التشغيل لمعالجة الحزم السريعة التي تسمح لك باستبعاد مكدس شبكة Linux من معالجة الحزم والتفاعل مباشرة مع جهاز الشبكة.



DPDK يحول المعالج للأغراض العامة إلى خادم إعادة توجيه الحزمة. هذا التحول يلغي الحاجة إلى مفاتيح وأجهزة التوجيه باهظة الثمن. ومع ذلك ، تفرض DPDK قيودًا على استخدام محولات شبكة محددة ، ويشار إلى قائمة الأجهزة المدعومة على الرابط - هنا هو النظام الأساسي الأكثر شيوعًا من Intel، بمعنى آخر. يتم توفير دعم الأجهزة الذي يعمل مع برامج تشغيل لينكس e1000 و ixgbe و i40e و ice و fm10k و ipn3ke و ifc و igc.



من المهم أيضًا أن نفهم أنه لكي يعمل خادم TRex بسرعة 10 جيجابت في الثانية ، يلزم وجود معالج متعدد النواة - من 4 نوى وما فوقها ، ويفضل أن يكون Intel CPU مع دعم متعدد الترابط المتزامن (الترابط الفائق).



2. كيفية الحصول على وتجربة TRex



1) قم بتنزيل الأرشيف من خادم trex-tgn.cisco.com: trex-tgn.cisco.com/trex/release/



فك الأرشيف في الدليل الرئيسي للمستخدم "/ home / user" ، حيث يكون المستخدم هو اسم المستخدم.



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


2) تهيئة الواجهات لإرسال واستقبال البيانات



دعنا نقوم بالتهيئة باستخدام الأداة المساعدة "dpdk_setup_ports.py" التي تأتي في الأرشيف مع TRex. يمكنك تكوين واجهات الشبكة التي يستخدمها TRex على مستوى MAC أو IP. للبدء ، تحتاج إلى تشغيل هذه الأداة باستخدام مفتاح الإعداد التفاعلي "sudo ./dpdk_setup_ports.py –i".



الخطوة الأولى هي التخلي عن التكوين على مستوى MAC (هل تريد استخدام التكوين المستند إلى MAC؟ (Y / N) n).



الخطوة الثانية هي تحديد زوج من واجهات الشبكة التي سنعمل معها ، في حالتنا تعمل بطاقة شبكة Intel X710 مع 4 واجهات شبكة ، سنستخدم المقبس الأول والرابع لبطاقة الشبكة.







في الخطوة الثالثة ، سيعرض النظام إنشاء تكوين مغلق تلقائيًا - عندما تغادر البيانات المنفذ 1 وتصل إلى المنفذ 2 (والعودة) ، كل ذلك على جهاز كمبيوتر واحد. اضطررنا للتخلي عن هذا النظام وتكوين مخطط التوجيه لجهازين كمبيوتر.



في الخطوتين الرابعة والخامسة ، نوافق على حفظ التكوين في ملف /etc/trex_cfg.yaml.



على سبيل المثال ، ضع في الاعتبار التكوين على مستوى IP لنظام الاتصال التالي:







يوجد ملف التكوين هنا: "/etc/trex_cfg.yaml". يظهر ملف تكوين بسيط أدناه لبطاقة واجهة الشبكة (NIC) ثنائية المنفذ مع وحدة معالجة مركزية تدعم 8 مؤشرات ترابط:



### 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]


في التكوين:



  • "01: 00.0" و "01: 00.3" - اسم واجهات Eth في نظام Linux المستخدم.
  • ip: 192.168.253.106 - عنوان المنفذ الخاص بـ Server TRex PC الذي يتم إنشاء حركة المرور منه.
  • default_gw: 192.168.253.107 - عنوان منفذ واحد لـ DUT للكمبيوتر (الجهاز قيد الاختبار).
  • ip: 192.168.254.106 - عنوان منفذ Server TRex للكمبيوتر ، الذي يتم إرجاع حركة المرور منه بعد المرور عبر قواعد QOS.
  • default_gw: 192.168.253.107 - عنوان منفذي PC DUT


انتباه! يحظر نظام TRex استخدام نفس الشبكة الفرعية عند توليد التدفقات التي يستخدمها النظام ؛ لهذا ، عند إنشاء الحزم ، يتم استخدام الشبكات الفرعية 16.0.0.0 و 48.0.0.0.



3) تكوين الواجهات على الآلة البعيدة من



الضروري تكوين إعادة التوجيه والمسارات حتى يعرف النظام (DUT) الذي سنمرر من خلاله حركة المرور إلى أين نتلقى وأين يتم إرسال الحزم.



تكوين قواعد توجيه التدفق على 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) بدء تشغيل خادم TRex في وضع astf:



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


إذا تم تشغيل خادم TRex بنجاح ، فسوف نرى معلومات حول منافذ Ethernet المستخدمة للاختبار:



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) بدء تشغيل وحدة التحكم TRex



باستخدام وحدة التحكم ، في نافذة منفصلة ، ابدأ في إنشاء دفق من الأمثلة الجاهزة (المجلد بأمثلة astf موجود في أرشيف 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


إذا كان الإطلاق ناجحًا ، فسترى إحصائيات تدفق حركة المرور في وحدة تحكم خادم 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. أتمتة التطوير والاختبار مع TRex



في عملية تطوير موجه شبكة ، كتبنا العديد من الاختبارات لـ TRex ، لذلك نشأ السؤال حول تشغيلها في الوضع التلقائي باستخدام python. كيف



نظمناها : بدأنا خادم TRex في وضع stl:



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


قم بتعيين متغير البيئة لـ python ، لأن TRex يعمل مع python.



تصدير PYTHONPATH = / home / !!! user !!! / v2.XX / automation / trex_control_plane / Interactive ، حيث "!!! user !!!" - اسم المستخدم والدليل الرئيسي ، الإصدار 2.XX - إصدار برنامج TRex الذي تم تنزيله وتفريغه في هذا المجلد.



بدأنا مولد حركة المرور باستخدام python ، فيما يلي قائمة بتكوين المثال.



python example_test_2bidirectstream.py



الناتج المتوقع:



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


لنلق نظرة على هذا المثال:



c = STLClient (server = '127.0.0.1')



قم بإنشاء اتصال بخادم TRex ، في هذه الحالة ، يتم إنشاء الاتصال بنفس الجهاز مثل الخادم.



  • "Base_pkt_dir_a، base_pkt_dir_b، base_pkt_dir_c، base_pkt_dir_d" - قوالب الحزم ، التي تحتوي على عناوين المصدر والوجهة ، ومنافذ المصدر والوجهة. في هذا المثال ، يتم إنشاء 4 تيارات ، 2 في اتجاه واحد و 2 في الاتجاه المعاكس.
  • "S1، s2، s3، s4" - طلب معلمات الدفق الذي تم إنشاؤه من فئة STLStream ، مثل معرف الدفق ومعدل البت ، في حالتنا ID1 = 4.5 جيجابت في الثانية ، ID2 = 2.5 جيجابت في الثانية ، ID3 = 2 جيجابت في الثانية ، ID4 = 1 جيجابايت / ثانية.


قائمة ملف تكوين الدفق 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()


خاتمة



عند إعداد هذا الدليل لحبر ، أطلقنا واختبرنا تشغيل نظام DUT مع 4 خيوط ، وجمعنا معلومات عن الخيوط والإحصاءات العالمية.



يتم إطلاق العملية الموضحة أعلاه باستخدام python ، مما يعني أنه باستخدام TRex ، يمكنك أتمتة اختبار وتصحيح أخطاء أجهزة الشبكة ومنتجات البرامج - في حلقة أو عند تشغيل الاختبارات في python بالتتابع.



فلماذا TRex سيسكو أفضل أو أسوأ من مولدات حركة المرور المماثلة الأخرى؟ على سبيل المثال ، برنامج خادم العميل الشهير iperf؟ في سيناريو استخدام TRex ، نرى وصفًا لإعداد التدفقات والعمل معها. كل من أدوات الاختبار والتصحيح جيدة: iperf - لإجراء اختبار سريع للوظائف أثناء التنقل ، ويقوم TRex بعمل ممتاز في أتمتة اختبار وتطوير أجهزة وأنظمة الشبكة المعقدة ، حيث تكون القدرة على تكوين تدفقات متعددة الخيوط أمرًا مهمًا لتكوين كل دفق لمهمة محددة وتحليل نتائج المخرجات ...



يسمح لك TRex بإنشاء قوالب لأي نوع من حركة المرور تقريبًا وتضخيمها لإنشاء هجمات DDoS واسعة النطاق ، بما في ذلك تدفقات TCP-SYN و UDP و ICMP. تسمح لك القدرة على توليد تدفقات حركة مرور ضخمة بمحاكاة الهجمات من عملاء متعددين على عدة خوادم مستهدفة.



لذلك إذا لم تكن قد جربت هذه الأداة بعد ، فيمكنك تدوين ملاحظة. وإذا حاولت - شارك الأمثلة والتعليقات الخاصة بك في التعليقات. من المثير للاهتمام معرفة ما يفكر به TRex ويستخدمه زملاؤه من المهندسين.



All Articles