这篇文章主要是教大家如何编译生产TestPMD,并且告诉你如何启动它。
TestPMD主要是用来测试两个网卡之间收发包,可以支持RSS,filters和Flow Director。
第1中场景:测试两块网卡间的数据收发。
Figure 1. Setup 1 – With an external traffic generator.
第2中场景,测试同一块网卡两个口之间的数据收发。
Figure 2. Setup 2 – TestPMD in loopback mode.
TestPMD有3中不同的转发模式。
后两种模式分别用于收发测试。
出这三种模式外,其它模式详见 TestPMD documentation.
在DPDK源码目录下,可以使用下面的命令在编译dpdk的同时,编译生成TestPMD:
$ make config T=x86_64-native-linuxapp-gcc
$ make
内核加载 uio:
$ sudo modprobe uio
内核加载igb_uio驱动:
$ sudo insmod ./build/kmod/igb_uio.ko
设置TestPMD使用的大页内存. 一种简单的方法是通过dpdk-setup.sh这个脚本来设置(这个脚本也在dpdk的源码目录下):
$ sudo ./usertools/dpdk-setup.sh
还有一种方法可以参考另一篇文章:https://blog.csdn.net/superbfly/article/details/105589151
绑定网卡到 igb_uio驱动. 假设我们的PCI插槽地址分别为0000:83:00.1 和 0000:87:00.1,则命令如下:
$ sudo ./usertools/dpdk-devbind.py –b igb_uio 0000:83:00.1 0000:87:00.1
TestPMD 可以运行在交互和非交互两种模式下,参数 -i 代表进入交互模式,此时可以使用命令行。通过命令行可以对TestPMD进行动态设置:
$ sudo ./build/app/testpmd –l 12,13,14 –n 4 -- -i
上面的例子中 -l 参数用来设置用到的逻辑核。12核用来管理命令行,13,14核用来转发数据包。-n 参数用来指定使用的内存通道数。当程序运行起来时,将看到如下打印输出:
$ sudo ./build/app/testpmd –l 12,13,14 –n 4 -- -i
EAL: Detected 40 lcore(s)
EAL: Probing VFIO support...
EAL: PCI device 0000:83:00.0 on NUMA socket 1
EAL: probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:83:00.1 on NUMA socket 1
EAL: probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:87:00.0 on NUMA socket 1
EAL: probe driver: 8086:10fb net_ixgbe
EAL: PCI device 0000:87:00.1 on NUMA socket 1
EAL: probe driver: 8086:10fb net_ixgbe
Interactive-mode selected
USER1: create a new mbuf pool :
n=163456, size=2176, socket=0
Configuring Port 0 (socket 0)
Port 0: 00:1B:21:B3:44:51
Configuring Port 1 (socket 0)
Port 1: 00:1B:21:57:EE:71
Checking link statuses...
Port 0 Link Up - speed 10000 Mbps - full-duplex
Port 1 Link Up - speed 10000 Mbps - full-duplex
Done
testpmd>
“testpmd>”响应用户输入的命令。被称为运行时命令行。 例如,可以使用下面的命令查看转发配置:
testpmd> show config fwd
io packet forwarding - ports=2 - cores=1 - streams=2 NUMA support disabled, MP over anonymous pages disabled
Logical Core 13 (socket 1) forwards packets on 2 streams:P=0/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:01P=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
从上面的结果可以看出,当前采用的是默认的收发模式,13核用于将port 0收到的数据从prot 1发出,同时也将port 1收到的数据从port 0转发出去。12和用来处理运行时命令行。
使用“start”命令开启转发:
testpmd> start
使用下面的命令可以查看当前所有在用端口的相关统计:
testpmd> show port stats all
################### NIC statistics for port 0 ######################
RX-packets: 8480274 RX-missed: 0 RX-bytes: 508816632
RX-errors: 0
RX-nombuf: 0
TX-packets: 5763344 TX-errors: 0 TX-bytes: 345800320
Throughput (since last show)
Rx-pps: 1488117
Tx-pps: 1488116
#####################################################################
################### NIC statistics for port 1 ######################
RX-packets: 5763454 RX-missed: 0 RX-bytes: 345807432
RX-errors: 0
RX-nombuf: 0
TX-packets: 8480551 TX-errors: 0 TX-bytes: 508832612
Throughput (since last show)
Rx-pps: 1488085
Tx-pps: 1488084
####################################################################
上面输出了各个网口键入“start”命令之后收到与发出的数据包的统计。从上面的例子可以看到,所有的收发均达到了理想的1.44兆pps(理论上万兆网口收发包的最大数量)。
键入“stop”命令后停止程序,此时会显示出各个端口的独立统计和总体统计。
testpmd> stop
Telling cores to stop...
Waiting for lcores to finish...
------------------ Forward statistics for port 0 ----------------------
RX-packets: 136718750 RX-dropped: 0 RX-total: 136718750
TX-packets: 136718750 TX-dropped: 0 TX-total: 136718750
------------------------------------------------------------------------
------------------ Forward statistics for port 1 ----------------------
RX-packets: 136718750 RX-dropped: 0 RX-total: 136718750
TX-packets: 136718750 TX-dropped: 0 TX-total: 136718750
------------------------------------------------------------------------
+++++++++++ Accumulated forward statistics for all ports +++++++++++++++
RX-packets: 273437500 RX-dropped: 0 RX-total: 273437500
TX-packets: 273437500 TX-dropped: 0 TX-total: 273437500
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
当使用一个核不能满足我们的收发需求时,可以使用多核来处理每个网口的数据。
如果想使用其它核工作,可以使用一下命令:
testpmd> set nbcore 2
testpmd> show config fwd
io packet forwarding - ports=2 - cores=2 - streams=2 NUMA support disabled, MP over anonymous pages disabled
Logical Core 13 (socket 1) forwards packets on 1 streams:P=0/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:01
Logical Core 14 (socket 1) forwards packets on 1 streams:P=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00
这里可以看到13核用来接收port 0的数据,然后从port 1发出,14核接收port 1 的数据,从port 0 发出。
使用下面命令可以设置TestPMD为接收模式:
testpmd> set fwd rxonly
testpmd> start
现在我们查看网口统计将发现只有收包统计,而发包统计计数全部为0:
testpmd> show port stats all
################### NIC statistics for port 0 ######################
RX-packets: 524182888 RX-missed: 0 RX-bytes: 31450974816
RX-errors: 0
RX-nombuf: 0
TX-packets: 0 TX-errors: 0 TX-bytes: 0
Throughput (since last show)
Rx-pps: 14880770
Tx-pps: 0
#####################################################################
################### NIC statistics for port 1 ######################
RX-packets: 486924876 RX-missed: 0 RX-bytes: 29215494352
RX-errors: 0
RX-nombuf: 0
TX-packets: 0 TX-errors: 0 TX-bytes: 0
Throughput (since last show)
Rx-pps: 14880788
Tx-pps: 0
#####################################################################
通过“help”命令可以获取帮助信息。
testpmd> help
显示的帮助信息为如下内容:
help control : Start and stop forwarding.
help display : Displaying port, stats and config information.
help config : Configuration information.
help ports : Configuring ports.
help registers : Reading and setting port registers.
help filters : Filters configuration help.
help all : All of the above sections.
“help display”将显示统计和其它信息:
testpmd> help display
Display:
--------
show port (info|stats|xstats|fdir|stat_qmap|dcb_tc|cap) (port_id|all)
Display information for port_id, or all.
show port X rss reta (size) (mask0,mask1,...)
Display the rss redirection table entry indicated by masks on port X. size is used to indicate the hardware supported reta size
show port rss-hash ipv4|ipv4-frag|ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|ipv6-other|l2-payload|ipv6-ex|ipv6-tcp-ex|ipv6-udp-ex [key]
Display the RSS hash functions and RSS hash key of port X
clear port (info|stats|xstats|fdir|stat_qmap) (port_id|all)
Clear information for port_id, or all.
show (rxq|txq) info (port_id) (queue_id)
Display information for configured RX/TX queue.
show config (rxtx|cores|fwd|txpkts)
Display the given configuration.
read rxd (port_id) (queue_id) (rxd_id)
Display an RX descriptor of a port RX queue.
read txd (port_id) (queue_id) (txd_id)
Display a TX descriptor of a port TX queue.
附加信息
了解更多 DPDK相关内容请参考 documentation, 了解更多TestPMD内容参考 DPDK TestPMD Application User Guide.