官方文档查看地址:
http://doc.dpdk.org/guides/sample_app_ug/qos_scheduler.html
PDF下载地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-sample-applications-user-guide.html?eu-cookie-notice
本篇难度系数:
翻译:☆☆☆☆☆
理解:★★☆☆☆
30.QoS调度器示例应用程序
示例应用程序演示了使用DPDK提供QoS调度的方法。
30.1.概述
QoS调度程序应用程序的体系结构如下图所示。
Fig. 1 QoS Scheduler Application Architecture
这个应用程序有两种运行时执行方式,每个数据包流配置使用两个或三个线程。RX线程从RX端口读取数据包,根据双VLAN(外部和内部)以及IP目标地址的低两个字节对数据包进行分类,并将它们放入环形队列。工作线程将数据包从环中取出,并调用QoS调度程序入列/出列函数。如果使用单独的TX核,这些包将被发送到TX环。否则,它们将被直接发送到TX端口。如果存在TX线程,则从TX环读取数据包并将其写入TX端口。
30.2.编译应用程序
要编译示例应用程序,请参见Compiling the Sample Applications。
应用程序位于qos_sched子目录中。
- 请注意
此应用程序仅适用于linux。 - 请注意
要使用下一节中描述的命令行接口获取示例应用程序的统计信息,必须编译DPDK,定义CONFIG_RTE_SCHED_COLLECT_STATS,这可以通过更改要编译的特定目标的配置文件来完成。
30.3.运行应用程序
- 请注意
为了运行应用程序,必须为每个使用的套接字(取决于使用的内核)总共设置至少4 G的大页面。
应用程序有许多命令行选项:
./qos_sched [EAL options] -- <APP PARAMS>
强制应用参数包括:
- –pfc “RX PORT, TX PORT, RX LCORE, WT LCORE, TX CORE”:包流配置。可以在命令行中配置多个pfc实体,有4个或5个条目(无论是否定义了TX core)。
可选的应用程序参数包括:
- -i:它使应用程序以交互模式启动。在这种模式下,应用程序显示了一个命令行,该命令行可用于在进行调度时获取统计信息(有关更多信息,请参阅下面的交互模式)。
- -mst n:主核心索引(默认值为1)。
- -rsz“A, B, C”:ring尺寸:
- A = I/O RX lcore读取的每个NIC RX环的大小(以缓冲区描述符的数量为单位)(默认值为128)。
- B = I/O RX lcore用于向worker lcore发送数据包的每个软件环的大小(以元素数量为单位)(默认值为8192)。
- C = worker lcore写的每个NIC TX环的大小(以缓冲区描述符的数量为单位)(默认值为256)
- -bsz " A, B, C, D ":突发大小
- A = I/O RX lcore从NIC RX读取突发大小(默认值为64)
- B = I/O RX lcore向输出软件环写入突发大小,worker lcore从输入软件环读取突发大小,QoS队列大小(默认值为64)
- C = QoS退队列大小(默认值为32)
- D = Worker lcore将突发大小写入NIC TX(默认值为64)
- -msz M:每个pfc的内存池大小(以mbufs的数量为单位)(默认为2097152)
- –rth “A, B, C”:RX队列阈值参数
- A = RX预取阈值(默认值为8)
- B = RX主机阈值(默认值为8)
- C = RX回写阈值(默认值为4)
- -tth“A, B, C”:TX队列阈值参数
- A = TX预取阈值(默认值为36)
- B = TX主机阈值(默认值为0)
- C = TX回写阈值(默认值为0)
- -cfg文件:要加载的配置文件
有关运行应用程序和环境抽象层(EAL)选项的一般信息,请参阅DPDK入门指南(DPDK Getting Started Guide)。
概要配置文件定义了QoS调度程序配置所需的所有端口/子端口/管道/流量类/队列参数。
概要文件的格式如下:
; port configuration [port]
frame overhead = 24
number of subports per port = 1
number of pipes per subport = 4096
queue sizes = 64 64 64 64
; Subport configuration
[subport 0]
tb rate = 1250000000; Bytes per second
tb size = 1000000; Bytes
tc 0 rate = 1250000000; Bytes per second
tc 1 rate = 1250000000; Bytes per second
tc 2 rate = 1250000000; Bytes per second
tc 3 rate = 1250000000; Bytes per second
tc period = 10; Milliseconds
tc oversubscription period = 10; Milliseconds
pipe 0-4095 = 0; These pipes are configured with pipe profile 0
; Pipe configuration
[pipe profile 0]
tb rate = 305175; Bytes per second
tb size = 1000000; Bytes
tc 0 rate = 305175; Bytes per second
tc 1 rate = 305175; Bytes per second
tc 2 rate = 305175; Bytes per second
tc 3 rate = 305175; Bytes per second
tc period = 40; Milliseconds
tc 0 oversubscription weight = 1
tc 1 oversubscription weight = 1
tc 2 oversubscription weight = 1
tc 3 oversubscription weight = 1
tc 0 wrr weights = 1 1 1 1
tc 1 wrr weights = 1 1 1 1
tc 2 wrr weights = 1 1 1 1
tc 3 wrr weights = 1 1 1 1
; RED params per traffic class and color (Green / Yellow / Red)
[red]
tc 0 wred min = 48 40 32
tc 0 wred max = 64 64 64
tc 0 wred inv prob = 10 10 10
tc 0 wred weight = 9 9 9
tc 1 wred min = 48 40 32
tc 1 wred max = 64 64 64
tc 1 wred inv prob = 10 10 10
tc 1 wred weight = 9 9 9
tc 2 wred min = 48 40 32
tc 2 wred max = 64 64 64
tc 2 wred inv prob = 10 10 10
tc 2 wred weight = 9 9 9
tc 3 wred min = 48 40 32
tc 3 wred max = 64 64 64
tc 3 wred inv prob = 10 10 10
tc 3 wred weight = 9 9 9
30.3.1交互模式
以下是当前在命令行界面下工作的命令:
控制命令
- -quit:退出application。
- 一般的统计数据
- stats app:显示一个包含应用程序内计算的统计数据的表。
- stats port X subport Y:对于特定的子端口,它显示正确通过调度程序的包的数量和被删除的包的数量。同样的信息以字节表示。信息显示在一个表中,该表将信息分隔在不同的流量类中。
- stats port X subport Y pipe Z:对于特定的管道,它显示正确通过调度程序的包的数量和被删除的包的数量。同样的信息以字节表示。此信息显示在一个表中,该表将其分隔在各个队列中。
- 平均队列大小
所有这些命令的工作方式都是相同的,平均每个特定队列子集中的数据包数量。
在调用这些命令之前,可以为此配置两个参数:
- qavg n X: n是计算发生的次数。数字越大,精确度越高。默认值是10。
- qavg period(周期) X:周期是每次计算之间允许的微秒数。默认值是100。
可用于测量平均队列大小的命令有:
- qavg port X subport Y:显示每个子端口的平均队列大小。
- qavg port X subport Y tc Z:显示特定流量类的每个子端口的平均队列大小。
- qavg port X subport Y pipe Z:显示每个管道的平均队列大小。
- qavg port X subport Y pipe Z tc A:显示特定流量类的每个管道的平均队列大小。
- qavg port X subport Y pipe Z tc A q B:显示特定队列的平均队列大小。
30.3.2例子
下面是一个单包流配置的命令示例:
./qos_sched -l 1,5,7 -n 4 -- --pfc "3,2,5,7" --cfg ./profile.cfg
本例使用一个包流配置,它在lcore 5上创建一个RX线程,从端口3读取数据,在lcore 7上创建一个工作线程,从端口2写入数据。
另一个例子是两个包流配置使用不同的端口,但共享相同的核心QoS调度如下:
./qos_sched -l 1,2,6,7 -n 4 -- --pfc "3,2,2,6,7" --pfc "1,0,2,6,7" --cfg ./profile.cfg
注意,还支持每个RX、WT和TX线程的包流配置的独立内核,提供了平衡工作的灵活性。
EAL coremask/corelist被限制只包含默认的主内核1和RX、WT和TX内核。
30.4.解释
端口/子端口/管道/流量类/队列(Port/Subport/Pipe/Traffic Class/Queu)是典型QoS应用中的层次实体:
- 子端口表示预定义的用户组。
- 管道表示单个用户/订阅者。
- 流量类是具有特定丢包率、延迟和抖动要求的不同流量类型的表示;如数据语音、视频或数据传输。
- 队列承载来自属于同一用户的同一类型的一个或多个连接的包。
需要配置的流量( traffic flows)依赖于应用程序。此应用程序基于QinQ双VLAN标签和IP目的地址进行分类,如下表所示。
Level Name | Siblings per Parent | QoS Functional Description | Selected By |
---|---|---|---|
Port | - | Ethernet port | Physical port |
Subport | Config (8) | Traffic shaped (token bucket) | Outer VLAN tag |
Pipe | Config (4k) | Traffic shaped (token bucket) | Inner VLAN tag |
Traffic Class | 4 | TCs of the same pipe services in strict priority | Destination IP address (0.0.X.0) |
Queue | 4 | Queue of the same TC serviced in WRR | Destination IP address (0.0.0.X) |
有关这些参数的更多信息,请参阅DPDK程序员指南(DPDK Programmer’s Guide )中的“QoS Scheduler”一章。