• TRex学习之旅四


    1. 低端机器

    从版本 2.37 开始,添加了在低端机器(如弱笔记本电脑)上运行 TRex 的功能。

    要启用此模式,请在平台配置文件中定义 low_end 参数:

    1. - version: 2
    2. interfaces: ['82:00.0', '82:00.1']
    3. low_end: true 1
    4. low_end_core: 3 2
    5. ...

    说明:
    1:启用低端模式。

    2:设置此核心的进程亲和性(默认为 0)

    此模式意味着以下内容:

    • 所有 TRex 线程将分配给单核
      (默认为 0,可通过 low_end_core 配置)

    • 较低的内存分配/要求。
      如果您已经在没有 low_end 参数的情况下启动,请重新启动 Linux 以释放大页面。

    • 在调度程序中休眠而不是忙等待
      (不太准确,但可以节省电量)

    • 如果队列已满,请勿重试发送数据包。

    • 配置文件中的“平台”部分被忽略。

    我们已经使用以下虚拟机进行了测试:

    • 1个核心

    • 475MB 内存

    • 两个虚拟网卡 E1000

    比如无状态IMIX:

    1. >start -f stl/imix.py -m 100kpps
    2. Tx bps L2 | 289.67 Mbps | 289.67 Mbps | 579.34 Mbps
    3. Tx bps L1 | 305.68 Mbps | 305.68 Mbps | 611.36 Mbps
    4. Tx pps | 100.07 Kpps | 100.07 Kpps | 200.14 Kpps
    5. Line Util. | 30.57 % | 30.57 % |
    1. "top" output:
    2. %CPU COMMAND
    3. 1.0 _t-rex-64
    4. 0.0 `- eal-intr-thread
    5. 13.0 `- Trex DP core 1
    6. 3.0 `- TRex RX
    7. 0.0 `- Trex Publisher
    8. 0.0 `- Trex Publisher
    9. 0.0 `- Trex ZMQ sync
    10. 0.0 `- Trex Watchdog
    11. 0.0 `- Trex ZMQ sync
    12. 0.0 `- Trex ZMQ sync

    2. Linux 接口

    另一个有趣的低端用例是使用原生 Linux 接口。
    (从 2.37 版本开始)

    优点:

    • 可以使用任何类型的 NIC(Linux 支持),尤其是没有 PCI 地址的虚拟接口。

    • 不需要大页面。

    • 可以在 Linux 中捕获流量(Wireshark / tcpdump 等)。

    • 启动速度非常快(网卡未初始化)

    • 不需要特殊的内核模块(igb_uio.ko 等)

    缺点:

    • 单个 TX/RX 内核,特别是速率将限制在 ~1Mpps。

    • 需要更多的 CPU 利用率。

    • 整体降低 Linux 速度。

    平台配置文件示例:

    1. - port_limit: 2
    2. version: 2
    3. interfaces: ['eth2', 'eth3']
    4. ...

    在幕后,它被替换为以下内容(也可以使用这个完整的语法,可能包含另一个 DPDK 参数):

    1. - port_limit: 2
    2. version: 2
    3. interfaces: ['--vdev=net_af_packet0,iface=eth2', '--vdev=net_af_packet1,iface=eth3']
    4. ...

    3. memif 接口

    它包装了共享内存红外环。有四个参数可以将 2 个 memif 互连以进行通信:socketidrole、secret

    Socket、id 和 secret 需要相同(对于连接的 memif 对),角色必须不同。

    其中一对需要有角色master和第二个slave

    套接字用于交换协议控制消息。(FD.io VPP 中的默认 /run/vpp/memif.sock)Id 必须匹配。每对 memif 都是独一无二的。Secret 是必须匹配的可选字符串(默认为空)。

    3.1 memif 环回示例

    要将两个 memif 互连到环回中:

    trex_cfg.yaml
    1. - port_limit: 2
    2. version: 2
    3. interfaces: ["--vdev=net_memif0,id=0,role=master",
    4. "--vdev=net_memif1,id=0,role=slave"]

    3.2 memif 互连的 trex 和 FD.io VPP 示例

    要将 trex 与两个 VPP memif 接口连接:

    trex_cfg.yaml
    1. - port_limit: 2
    2. version: 2
    3. interfaces: ["--vdev=net_memif0,socket=/run/vpp/memif.sock,role=slave,id=0",
    4. "--vdev=net_memif1,socket=/run/vpp/memif.sock,role=slave,id=1"]

    用于创建相应接口的 VPP CLI 命令:

    1. vpp# create interface memif id 0 master
    2. vpp# set interface state memif0/0 up
    3. vpp# create interface memif id 1 master
    4. vpp# set interface state memif0/1 up

    然后可以通过以下方式验证状态:

    vpp# show memif

    4. 仿真堆栈

    可以选择 TRex 在交互模式 (STL/ASTF) 中如何响应 ping/ARP 的方法。(从版本 2.43 开始)

    有效值:

    • "legacy" - 默认值,TRex 使用它自己的代码来回答 pings/ARPs。

    • "linux_based" - ARPs/pings 被重定向到处理它们的 Linux 接口。
      Linux 接口驻留在单独的网络命名空间中,以便拥有自己的 ARP 表并且不干扰系统的其余部分。
      将来可以扩展到:

      • 支持 Linux 原生支持的其他协议

      • 许多 [数千] 模拟客户端,而 TRex 端口充当连接所有客户端的交换机。

    平台配置文件示例:

    1. - version: 2
    2. interfaces: ['82:00.0', '82:00.1']
    3. stack: linux_based
    4. ...
    Stack:legacylinux_based

    L2:

    yes

    yes

    IPv4:

    yes

    yes

    IPv6:

    no

    yes

    VLAN:

    yes

    yes

    STL:

    fully

    in service

    ASTF:

    fully

    fully

                                                                    表. 堆栈的特征

    linux_based 栈需要服务模式才能在 STL 模式下处理 RX 数据包

    配置示例:

    控制台:

    L2、IPv4、VLAN - 以相同方式配置两个堆栈。

    IPv6:

    1. trex>ipv6 --help
    2. usage: port [-h] -p PORT (--off | --auto | -s SRC_IPV6)
    3. Configures IPv6 of a port
    4. optional arguments:
    5. -h, --help show this help message and exit
    6. -p PORT, --port PORT source port for the action
    7. --off Disable IPv6 on port.
    8. --auto Enable IPv6 on port with automatic address.
    9. -s SRC_IPV6, --src SRC_IPV6
    10. Enable IPv6 on port with specific address.

    API:

    see IPv6 configuration

    5.  虚拟端口

    虚拟端口可用于解决 2 个问题:

    • 奇数个接​​口。例如,只有一个接口的 TRex。

    • 相邻接口属于不同 NUMA 时的性能下降。

    配置示例:

    1. ...
    2. interfaces: ['07:00.0', 'dummy', 'dummy', '8a:00.0']
    3. ...

    错误配置示例:

    1. ...
    2. interfaces: ['dummy', 'dummy', 'dummy', '8a:00.0']
    3. ....

    (每对端口应至少有一个非虚拟端口)

    1. 自 v2.38+ 起在 TRex 中受支持。

    2. 早于 v2.38 的客户端(Python API、trex-console)将无法使用虚拟端口。将您的客户端更新到 v2.38 或更高版本。

    3. 虚拟端口可用于所有 TRex 模式(无状态、有状态和 ASTF)。

    如果为单个接口 TRex 生成器使用虚拟端口,请考虑以下事项:

    配置

    模式

    支持状态

    注释

    单 TRex 发生器,单接口

    无状态

    功能性的

    单向

    有状态的

    半功能

    只会发送流的单向侧

    ASTF

    取决于远程

    需要双向 TCP 栈,如果远程支持 TCP 栈,将工作,否则将不工作

    两个 TRex 发生器,单一界面

    无状态

    功能性的

    双向

    有状态的

    半功能

    将“工作”,但流程不会同步

    ASTF

    功能性的

    完整的 TCP 堆栈

    6. 绑定接口

    它提供了与 Linux 绑定驱动程序类似的功能。模式 4 支持链路聚合 802.3AD。有关详细信息,请参见此处

    配置示例:

    1. ...
    2. interfaces: [ '--vdev=net_bonding0,mode=0,slave=d8:00.0,slave=d8:00.1', 'dummy' ]
    3. ...

    绑定设备从第一个从设备继承属性。所有从设备应具有相同的速度和双工。

    当使用模式 4 时,可能需要更多的稳定时间。使用 -w 命令行选项为其提供足够的时间。

    7. 配置为使用路由器(或其他 L3 设备)作为 DUT 运行

    您可以按照此演示文稿获取有关如何将路由器配置为 DUT 的示例。

    本指南将帮助您将Cisco ASR1K配置为DUT连接到TRex并以有状态模式运行。

    这可以很容易地用于任何L3设备。最后还显示了将Linux配置为DUT的等效命令。

    为配置路由器提供了两个选项。基于策略的路由和静态路由。你应该选择一个适合你需要的。

    TRex应直接连接到ASR1K端口,并将充当客户端和服务器。

    安装描述:

    TRex将模拟下图所述的网络(在DUT的每一侧,路由器连接到一个或多个客户端/服务器网络)。

    请注意,不支持以下设置(让TRex模拟通过交换机连接到DUT的一组主机)。这意味着“generator”部分中定义的TRex IP地址应位于不同的网络中,而不是port\u info部分中定义的DUT地址和TRex地址。

    TRex 配置

    您可以指定由--cfg命令行参数使用的配置文件,或使用默认的配置文件/etc/trex_cfg.yaml

    下面是如何配置TRex IP地址的示例。TRex将在每个端口上为default_gw发出ARP,并为ip发送免费的ARP。从TRex版本2.10开始,这就可以工作了。如果您想手动配置MAC地址(相当于静态ARP),或运行较旧的TRex版本,则在演示文稿的末尾提供了相关信息。配置文件参数的完整说明可在手册中找到。

    1. - port_limit : 2
    2. port_info :
    3. - default_gw : 11.11.11.1 #<1>
    4. ip : 11.11.11.2 #<2>
    5. - default_gw : 12.12.12.1 #<3>
    6. ip : 12.12.12.2 #<4>

    说明:

    1、TRex端口0配置-应该是路由器的TenG 0/0/0 IP。TRex将尝试通过发送ARP请求来解析此地址。

    2、路由器的下一跳TenG 0/0/0。TRex将发送此地址的免费ARP。

    3、TRex端口1配置-应为路由器的TenG 0/0/1 IP。TRex将尝试通过发送ARP请求来解析此地址。

    4、路由器的下一跳TenG 0/0/0。TRex将发送此地址的免费ARP。

    流量配置文件中的TRex仿真服务器/客户端IPs定义

    您可以通过使用-f 运行TRex来指定流量配置文件,-f <file name>(TRex有状态模式)。

    客户端配置文件的示例位于TREX_ROOT/scripts/cfg目录中。

    在流量配置文件中添加以下部分,以定义客户端和服务器的IP范围。

    1. generator :
    2. distribution : "seq"
    3. clients_start : "16.0.0.1"
    4. clients_end : "16.0.0.255"
    5. servers_start : "48.0.0.1"
    6. servers_end : "48.0.0.240"

    在此示例中,有:

    255个客户端与240个服务器对话

    路由器配置. 步骤 1 - 静态路由

    1. interface TenGigabitEthernet0/0/0
    2. ip address 11.11.11.1 255.255.255.0
    3. !
    4. `
    5. interface TenGigabitEthernet0/0/1
    6. ip address 12.12.12.1 255.255.255.0
    7. !
    8. ip route 16.0.0.0 255.0.0.0 11.11.11.2 <1>
    9. ip route 48.0.0.0 255.0.0.0 12.12.12.2 <2>

    说明:

    1、将客户端网络路由到TRex服务器仿真接口。

    2、将服务器网络路由到TRex客户端仿真接口。

    路由器配置. 步骤 2 - PBR

    路由器配置为静态路由数据包,从0/0/0到0/0/1,从0/0/1到0/0/0。

    路由器配置:

    1. interface TenGigabitEthernet0/0/0
    2. ip address 11.11.11.1 255.255.255.0 <1>
    3. ip policy route-map p1_to_p2 <2>
    4. load-interval 30
    5. !
    6. interface TenGigabitEthernet0/0/1
    7. ip address 12.12.12.1 255.255.255.0 <1>
    8. ip policy route-map p2_to_p1 <2>
    9. load-interval 30
    10. !

    说明:

    1、配置端口的ip地址。

    2、配置PBR策略-请参考如下

    1. route-map p1_to_p2 permit 10
    2. set ip next-hop 12.12.12.2 <1>
    3. !
    4. route-map p2_to_p1 permit 10
    5. set ip next-hop 11.11.11.2 <2>

    说明:

    1、在TenG 0/0/1子网中,将目标设置为12.12.12.2。

    2、将目标设置为11.11.11.2,子网中设置为TenG 0/0/0。

    验证电缆连接

    要验证TRex端口0是否真的连接到路由器0/0/0,可以运行以下操作。

    $./t-rex-64 -f cap2/dns.yaml -m 1  -d 10  -l 1000 --lo --lm 1

    它仅从TRex端口0(-lm 1)发送数据包

    要仅从TRex端口1发送,请执行以下操作:

    $./t-rex-64 -f cap2/dns.yaml -m 1  -d 10  -l 1000 --lo --lm 2

    如果连接到交换机,则必须先从两个方向发送数据包几秒钟,以便交换机了解双方的MAC地址。

    $./t-rex-64 -f cap2/dns.yaml -m 1  -d 10  -l 1000

    基于MAC的配置

    如果您使用的TRex版本早于2.10,或者希望使用基于MAC的配置,则TRex配置文件必须包含以下内容(而不是“ip”和“default_gw”)。

    1. - port_limit : 2
    2. port_info : # set eh mac addr
    3. - dest_mac : [0x0,0x0,0x0,0x1,0x0,0x0]
    4. src_mac : [0x0,0x0,0x0,0x2,0x0,0x0]
    5. - dest_mac : [0x0,0x0,0x0,0x3,0x0,0x0]
    6. src_mac : [0x0,0x0,0x0,0x4,0x0,0x0]

    注意:

    1、应该是路由器的TenG 0/0/0 mac地址。

    2、路由器应配置为发送到此mac地址。

    3、应该是路由器的TenG 0/0/1 mac地址。

    4、路由器应配置为发送到此mac地址。

    在路由器端,您必须添加以下静态ARP配置。

    1. arp 11.11.11.2 0000.0002.0000 ARPA #<1>
    2. arp 12.12.12.2 0000.0004.0000 ARPA #<2>

    说明:

    1、TRex端口0源mac地址。

    2、TRex端口1源mac地址。

    Linux配置

    假设Linux的设置与DUT相同,而不是路由器,则可以执行以下操作。

    将Linux接口的IP配置为12.12.12.1和11.11.11.1

    1. route add -net 48.0.0.0 netmask 255.0.0.0 gw 12.12.12.2
    2. route add -net 16.0.0.0 netmask 255.0.0.0 gw 11.11.11.2

    如果您有基于MAC的TRex配置,还应添加:

    1. arp -s 11.11.11.2 00:00:00:02:00:00 #<1>
    2. arp -s 12.12.12.2 00:00:00:04:00:00 #<2>

    说明:

    1、TRex端口0源mac地址。

    2、TRex端口1源mac地址。

    静态路由配置-IPV6

    1. interface TenGigabitEthernet1/0/0
    2. ip address 11.11.11.1 255.255.255.0
    3. ip policy route-map p1_to_p2
    4. load-interval 30
    5. ipv6 enable #<1>
    6. ipv6 address 2001:DB8:1111:2222::1/64 #<2>
    7. ipv6 policy route-map ipv6_p1_to_p2 #<3>
    8. !
    9. ipv6 unicast-routing #<4>
    10. ipv6 neighbor 3001::2 TenGigabitEthernet0/1/0 0000.0002.0002 #<5>
    11. ipv6 neighbor 2001::2 TenGigabitEthernet0/0/0 0000.0003.0002
    12. route-map ipv6_p1_to_p2 permit 10 #<6>
    13. set ipv6 next-hop 2001::2
    14. !
    15. route-map ipv6_p2_to_p1 permit 10
    16. set ipv6 next-hop 3001::2
    17. !
    18. csi-mcp-asr1k-40(config)#ipv6 route 4000::/64 2001::2
    19. csi-mcp-asr1k-40(config)#ipv6 route 5000::/64 3001::2

    说明:

    1、启用ipv6

    2、添加ipv6地址

    3、添加pbr

    4、启用ipv6路由

    5、Mac地址设置应类似于TRex

    6、PBR配置

  • 相关阅读:
    Spring的一些专业术语
    史上最强C语言教程----万字初识C语言
    【Java SE】2.java中变量和表达式计算的相关问题
    GIS 数据结构整理:网格索引
    静态ip和动态ip区别在哪?
    【LeetCode】383. 赎金信
    HTML网页设计制作——响应式网页影视动漫资讯bootstrap网页(9页)
    系统架构师备考倒计时20天(每日知识点)
    Java面向对象编程(六)
    Oracle-动态sql学习笔记,由易至难讲解七个例子
  • 原文地址:https://blog.csdn.net/qq_35029061/article/details/125419825