From 694fd2cb8d10be0deb8bd7d41dee73601f31d415 Mon Sep 17 00:00:00 2001 From: Jasvinder Singh Date: Tue, 26 Nov 2019 14:28:29 +0000 Subject: [PATCH] doc: update QoS scheduler guides Updates documentation to reflect the changes in the QoS scheduler library and example. Signed-off-by: Jasvinder Singh Acked-by: Cristian Dumitrescu --- .../prog_guide/img/sched_hier_per_port.png | Bin 58973 -> 0 bytes .../prog_guide/img/sched_hier_per_port.svg | 492 ++++++++++++++++++ doc/guides/prog_guide/qos_framework.rst | 110 +++- doc/guides/sample_app_ug/ip_pipeline.rst | 24 +- doc/guides/sample_app_ug/qos_scheduler.rst | 92 +++- 5 files changed, 678 insertions(+), 40 deletions(-) delete mode 100644 doc/guides/prog_guide/img/sched_hier_per_port.png create mode 100644 doc/guides/prog_guide/img/sched_hier_per_port.svg diff --git a/doc/guides/prog_guide/img/sched_hier_per_port.png b/doc/guides/prog_guide/img/sched_hier_per_port.png deleted file mode 100644 index 462e88aaab4418d8893137659a08ee43f97842d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58973 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 b-2Q;{!goGRpvI5)3GjI@r6gG + + + + + + + + + + + + + + + + + Page-1 + + + + Sheet.234 + + Sheet.1 + + + + Sheet.2 + + + + Sheet.3 + + + + Sheet.4 + + + + Sheet.6 + + + + Sheet.7 + + + + Sheet.8 + + + + Sheet.9 + + + + Sheet.10 + + + + Sheet.11 + + + + Sheet.12 + + + + Sheet.13 + + + + Sheet.14 + + + + Sheet.15 + + + + Sheet.16 + + + + Sheet.17 + + + + Sheet.26 + + + + Sheet.27 + + + + Sheet.28 + + + + Sheet.29 + + + + Sheet.30 + + + + Sheet.31 + + + + Sheet.32 + + + + Sheet.33 + + + + Sheet.40 + + + + Sheet.42 + + + + Sheet.44 + + + + Sheet.46 + + + + Sheet.47 + + + + Sheet.48 + + + + Sheet.49 + + + + Sheet.50 + + + + Dynamic connector + + + + Dynamic connector.52 + + + + Dynamic connector.157 + + + + Dynamic connector.158 + + + + Dynamic connector.159 + + + + Dynamic connector.160 + + + + Dynamic connector.161 + + + + Dynamic connector.162 + + + + Dynamic connector.163 + + + + Dynamic connector.164 + + + + Dynamic connector.165 + + + + Dynamic connector.166 + + + + Dynamic connector.167 + + + + Dynamic connector.168 + + + + Dynamic connector.170 + + + + Dynamic connector.171 + + + + Dynamic connector.172 + + + + Dynamic connector.173 + + + + Dynamic connector.174 + + + + Dynamic connector.175 + + + + Sheet.176 + Queue + + + + Queue + + Sheet.177 + + + + Sheet.178 + + + + Sheet.179 + + + + Sheet.180 + + + + Sheet.181 + + + + Sheet.182 + + + + Sheet.183 + + + + Sheet.184 + + + + Sheet.185 + + + + Sheet.186 + + + + Sheet.187 + + + + Sheet.188 + + + + Sheet.189 + + + + Sheet.190 + + + + Sheet.191 + + + + Sheet.192 + + + + Sheet.193 + + + + Sheet.194 + + + + Sheet.195 + + + + Sheet.196 + + + + Sheet.197 + + + + Sheet.198 + + + + Sheet.199 + + + + Sheet.200 + + + + Sheet.201 + + + + Sheet.202 + + + + Sheet.203 + + + + Sheet.204 + + + + Sheet.205 + + + + Sheet.206 + + + + Sheet.207 + + + + Sheet.208 + + + + Dynamic connector.209 + + + + Dynamic connector.210 + + + + Dynamic connector.211 + + + + Dynamic connector.212 + + + + Dynamic connector.213 + + + + Dynamic connector.214 + + + + Dynamic connector.215 + + + + Dynamic connector.216 + + + + Dynamic connector.217 + + + + Dynamic connector.218 + + + + Dynamic connector.219 + + + + Dynamic connector.220 + + + + Dynamic connector.221 + + + + Dynamic connector.222 + + + + Dynamic connector.223 + + + + Dynamic connector.224 + + + + Dynamic connector.225 + + + + Dynamic connector.226 + + + + Dynamic connector.227 + + + + Dynamic connector.228 + + + + Sheet.230 + Traffic Class + + + + TrafficClass + + Sheet.231 + Pipe + + + + Pipe + + Sheet.232 + Subport + + + + Subport + + Sheet.233 + Port + + + + Port + + + diff --git a/doc/guides/prog_guide/qos_framework.rst b/doc/guides/prog_guide/qos_framework.rst index a7527b21ca..a159709450 100644 --- a/doc/guides/prog_guide/qos_framework.rst +++ b/doc/guides/prog_guide/qos_framework.rst @@ -171,7 +171,7 @@ The functionality of each hierarchical level is detailed in the following table. | | | | token bucket per pipe. | | | | | | +---+--------------------+----------------------------+---------------------------------------------------------------+ - | 4 | Traffic Class (TC) | 4 | #. TCs of the same pipe handled in strict priority order. | + | 4 | Traffic Class (TC) | 13 | #. TCs of the same pipe handled in strict priority order. | | | | | | | | | | #. Upper limit enforced per TC at the pipe level. | | | | | | @@ -183,8 +183,13 @@ The functionality of each hierarchical level is detailed in the following table. | | | | adjusted value that is shared by all the subport pipes. | | | | | | +---+--------------------+----------------------------+---------------------------------------------------------------+ - | 5 | Queue | 4 | #. Queues of the same TC are serviced using Weighted Round | - | | | | Robin (WRR) according to predefined weights. | + | 5 | Queue | High priority TCs: 1, | #. All the high priority TCs (TC0, TC1, ...,TC11) have | + | | | Lowest priority TC: 4 | exactly 1 queue, while the lowest priority TC (TC12), | + | | | | called Best Effort (BE), has 4 queues. | + | | | | | + | | | | #. Queues of the lowest priority TC (BE) are serviced using | + | | | | Weighted Round Robin (WRR) according to predefined weights| + | | | | weights. | | | | | | +---+--------------------+----------------------------+---------------------------------------------------------------+ @@ -730,10 +735,10 @@ Implementation of Strict Priority Scheduling Strict priority scheduling of traffic classes within the same pipe is implemented by the pipe dequeue state machine, which selects the queues in ascending order. -Therefore, queues 0..3 (associated with TC 0, highest priority TC) are handled before -queues 4..7 (TC 1, lower priority than TC 0), -which are handled before queues 8..11 (TC 2), -which are handled before queues 12..15 (TC 3, lowest priority TC). +Therefore, queue 0 (associated with TC 0, highest priority TC) is handled before +queue 1 (TC 1, lower priority than TC 0), +which is handled before queue 2 (TC 2, lower priority than TC 1) and it conitnues until queues of all TCs except the +lowest priority TC are handled. At last, queues 12..15 (best effort TC, lowest priority TC) are handled. Upper Limit Enforcement ''''''''''''''''''''''' @@ -753,14 +758,14 @@ as described in :numref:`table_qos_10` and :numref:`table_qos_11`. | # | Subport or pipe field | Unit | Description | | | | | | +===+=======================+=======+=======================================================================+ - | 1 | tc_time | Bytes | Time of the next update (upper limit refill) for the 4 TCs of the | + | 1 | tc_time | Bytes | Time of the next update (upper limit refill) for the TCs of the | | | | | current subport / pipe. | | | | | | | | | | See Section `Internal Time Reference`_ for the | | | | | explanation of why the time is maintained in byte units. | | | | | | +---+-----------------------+-------+-----------------------------------------------------------------------+ - | 2 | tc_period | Bytes | Time between two consecutive updates for the 4 TCs of the current | + | 2 | tc_period | Bytes | Time between two consecutive updates for the all TCs of the current | | | | | subport / pipe. This is expected to be many times bigger than the | | | | | typical value of the token bucket tb_period. | | | | | | @@ -815,7 +820,7 @@ as described in :numref:`table_qos_10` and :numref:`table_qos_11`. Weighted Round Robin (WRR) """""""""""""""""""""""""" -The evolution of the WRR design solution from simple to complex is shown in :numref:`table_qos_12`. +The evolution of the WRR design solution for the lowest priority traffic class (best effort TC) from simple to complex is shown in :numref:`table_qos_12`. .. _table_qos_12: @@ -977,33 +982,33 @@ with the third approach selected for implementation. | | | | +-----+---------------------------+-------------------------------------------------------------------------+ -Typically, the subport TC oversubscription feature is enabled only for the lowest priority traffic class (TC 3), +Typically, the subport TC oversubscription feature is enabled only for the lowest priority traffic class, which is typically used for best effort traffic, with the management plane preventing this condition from occurring for the other (higher priority) traffic classes. -To ease implementation, it is also assumed that the upper limit for subport TC 3 is set to 100% of the subport rate, -and that the upper limit for pipe TC 3 is set to 100% of pipe rate for all subport member pipes. +To ease implementation, it is also assumed that the upper limit for subport best effort TC is set to 100% of the subport rate, +and that the upper limit for pipe best effort TC is set to 100% of pipe rate for all subport member pipes. Implementation Overview ''''''''''''''''''''''' The algorithm computes a watermark, which is periodically updated based on the current demand experienced by the subport member pipes, -whose purpose is to limit the amount of traffic that each pipe is allowed to send for TC 3. +whose purpose is to limit the amount of traffic that each pipe is allowed to send for best effort TC. The watermark is computed at the subport level at the beginning of each traffic class upper limit enforcement period and the same value is used by all the subport member pipes throughout the current enforcement period. illustrates how the watermark computed as subport level at the beginning of each period is propagated to all subport member pipes. At the beginning of the current enforcement period (which coincides with the end of the previous enforcement period), -the value of the watermark is adjusted based on the amount of bandwidth allocated to TC 3 at the beginning of the previous period that +the value of the watermark is adjusted based on the amount of bandwidth allocated to best effort TC at the beginning of the previous period that was not left unused by the subport member pipes at the end of the previous period. -If there was subport TC 3 bandwidth left unused, +If there was subport best effort TC bandwidth left unused, the value of the watermark for the current period is increased to encourage the subport member pipes to consume more bandwidth. -Otherwise, the value of the watermark is decreased to enforce equality of bandwidth consumption among subport member pipes for TC 3. +Otherwise, the value of the watermark is decreased to enforce equality of bandwidth consumption among subport member pipes for best effort TC. The increase or decrease in the watermark value is done in small increments, so several enforcement periods might be required to reach the equilibrium state. -This state can change at any moment due to variations in the demand experienced by the subport member pipes for TC 3, for example, +This state can change at any moment due to variations in the demand experienced by the subport member pipes for best effort TC, for example, as a result of demand increase (when the watermark needs to be lowered) or demand decrease (when the watermark needs to be increased). When demand is low, the watermark is set high to prevent it from impeding the subport member pipes from consuming more bandwidth. @@ -1084,10 +1089,27 @@ The highest value for the watermark is picked as the highest rate configured for | | | | | | | tc3_cons = subport_tc3_credits_per_period - subport_tc3_credits; | | | | | - | | | tc3_cons_max = subport_tc3_credits_per_period - (tc0_cons + tc1_cons + | - | | | tc2_cons); | + | | | tc4_cons = subport_tc4_credits_per_period - subport_tc4_credits; | + | | | | + | | | tc5_cons = subport_tc5_credits_per_period - subport_tc5_credits; | + | | | | + | | | tc6_cons = subport_tc6_credits_per_period - subport_tc6_credits; | + | | | | + | | | tc7_cons = subport_tc7_credits_per_period - subport_tc7_credits; | + | | | | + | | | tc8_cons = subport_tc8_credits_per_period - subport_tc8_credits; | | | | | - | | | if(tc3_consumption > (tc3_consumption_max - MTU)){ | + | | | tc9_cons = subport_tc9_credits_per_period - subport_tc9_credits; | + | | | | + | | | tc10_cons = subport_tc10_credits_per_period - subport_tc10_credits; | + | | | | + | | | tc11_cons = subport_tc11_credits_per_period - subport_tc11_credits; | + | | | | + | | | tc_be_cons_max = subport_tc_be_credits_per_period - (tc0_cons + tc1_cons + | + | | | tc2_cons + tc3_cons + tc4_cons + tc5_cons + tc6_cons + tc7_cons + tc8_cons + | + | | | tc9_cons + tc10_cons + tc11_cons); | + | | | | + | | | if(tc_be_consumption > (tc_be_consumption_max - MTU)){ | | | | | | | | wm -= wm >> 7; | | | | | @@ -1555,6 +1577,52 @@ A sample RED configuration is shown below. In this example, the queue size is 64 tc 3 wred inv prob = 10 10 10 tc 3 wred weight = 9 9 9 + tc 4 wred min = 28 22 16 + tc 4 wred max = 32 32 32 + tc 4 wred inv prob = 10 10 10 + tc 4 wred weight = 9 9 9 + + tc 5 wred min = 28 22 16 + tc 5 wred max = 32 32 32 + tc 5 wred inv prob = 10 10 10 + tc 5 wred weight = 9 9 9 + + tc 6 wred min = 28 22 16 + tc 6 wred max = 32 32 32 + tc 6 wred inv prob = 10 10 10 + tc 6 wred weight = 9 9 9 + + tc 7 wred min = 28 22 16 + tc 7 wred max = 32 32 32 + tc 7 wred inv prob = 10 10 10 + tc 7 wred weight = 9 9 9 + + tc 8 wred min = 28 22 16 + tc 8 wred max = 32 32 32 + tc 8 wred inv prob = 10 10 10 + tc 8 wred weight = 9 9 9 + + tc 9 wred min = 28 22 16 + tc 9 wred max = 32 32 32 + tc 9 wred inv prob = 10 10 10 + tc 9 wred weight = 9 9 9 + + + tc 10 wred min = 28 22 16 + tc 10 wred max = 32 32 32 + tc 10 wred inv prob = 10 10 10 + tc 10 wred weight = 9 9 9 + + tc 11 wred min = 28 22 16 + tc 11 wred max = 32 32 32 + tc 11 wred inv prob = 10 10 10 + tc 11 wred weight = 9 9 9 + + tc 12 wred min = 28 22 16 + tc 12 wred max = 32 32 32 + tc 12 wred inv prob = 10 10 10 + tc 12 wred weight = 9 9 9 + With this configuration file, the RED configuration that applies to green, yellow and red packets in traffic class 0 is shown in :numref:`table_qos_18`. diff --git a/doc/guides/sample_app_ug/ip_pipeline.rst b/doc/guides/sample_app_ug/ip_pipeline.rst index 4da0fcf896..56014be174 100644 --- a/doc/guides/sample_app_ug/ip_pipeline.rst +++ b/doc/guides/sample_app_ug/ip_pipeline.rst @@ -249,27 +249,35 @@ Traffic manager tmgr subport profile - + + + - + pps + qsize + + + Add traffic manager pipe profile :: tmgr pipe profile - + + + - + + Create traffic manager port :: tmgr rate spp - pps - qsize - - fo mtu cpu + fo + mtu + cpu Configure traffic manager subport :: diff --git a/doc/guides/sample_app_ug/qos_scheduler.rst b/doc/guides/sample_app_ug/qos_scheduler.rst index cdd29d90c3..b5010657a7 100644 --- a/doc/guides/sample_app_ug/qos_scheduler.rst +++ b/doc/guides/sample_app_ug/qos_scheduler.rst @@ -22,7 +22,7 @@ There are two flavors of the runtime execution for this application, with two or three threads per each packet flow configuration being used. The RX thread reads packets from the RX port, classifies the packets based on the double VLAN (outer and inner) and -the lower two bytes of the IP destination address and puts them into the ring queue. +the lower byte of the IP destination address and puts them into the ring queue. The worker thread dequeues the packets from the ring and calls the QoS scheduler enqueue/dequeue functions. If a separate TX core is used, these are sent to the TX ring. Otherwise, they are sent directly to the TX port. @@ -129,18 +129,28 @@ The profile file has the following format: 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] + number of pipes per subport = 4096 + queue sizes = 64 64 64 64 64 64 64 64 64 64 64 64 64 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 4 rate = 1250000000; Bytes per second + tc 5 rate = 1250000000; Bytes per second + tc 6 rate = 1250000000; Bytes per second + tc 7 rate = 1250000000; Bytes per second + tc 8 rate = 1250000000; Bytes per second + tc 9 rate = 1250000000; Bytes per second + tc 10 rate = 1250000000; Bytes per second + tc 11 rate = 1250000000; Bytes per second + tc 12 rate = 1250000000; Bytes per second + tc period = 10; Milliseconds tc oversubscription period = 10; Milliseconds @@ -156,17 +166,32 @@ The profile file has the following format: tc 1 rate = 305175; Bytes per second tc 2 rate = 305175; Bytes per second tc 3 rate = 305175; Bytes per second + tc 4 rate = 305175; Bytes per second + tc 5 rate = 305175; Bytes per second + tc 6 rate = 305175; Bytes per second + tc 7 rate = 305175; Bytes per second + tc 8 rate = 305175; Bytes per second + tc 9 rate = 305175; Bytes per second + tc 10 rate = 305175; Bytes per second + tc 11 rate = 305175; Bytes per second + tc 12 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 + tc 4 oversubscription weight = 1 + tc 5 oversubscription weight = 1 + tc 6 oversubscription weight = 1 + tc 7 oversubscription weight = 1 + tc 8 oversubscription weight = 1 + tc 9 oversubscription weight = 1 + tc 10 oversubscription weight = 1 + tc 11 oversubscription weight = 1 + tc 12 oversubscription weight = 1 + + tc 12 wrr weights = 1 1 1 1 ; RED params per traffic class and color (Green / Yellow / Red) @@ -191,6 +216,51 @@ The profile file has the following format: tc 3 wred inv prob = 10 10 10 tc 3 wred weight = 9 9 9 + tc 4 wred min = 48 40 32 + tc 4 wred max = 64 64 64 + tc 4 wred inv prob = 10 10 10 + tc 4 wred weight = 9 9 9 + + tc 5 wred min = 48 40 32 + tc 5 wred max = 64 64 64 + tc 5 wred inv prob = 10 10 10 + tc 5 wred weight = 9 9 9 + + tc 6 wred min = 48 40 32 + tc 6 wred max = 64 64 64 + tc 6 wred inv prob = 10 10 10 + tc 6 wred weight = 9 9 9 + + tc 7 wred min = 48 40 32 + tc 7 wred max = 64 64 64 + tc 7 wred inv prob = 10 10 10 + tc 7 wred weight = 9 9 9 + + tc 8 wred min = 48 40 32 + tc 8 wred max = 64 64 64 + tc 8 wred inv prob = 10 10 10 + tc 8 wred weight = 9 9 9 + + tc 9 wred min = 48 40 32 + tc 9 wred max = 64 64 64 + tc 9 wred inv prob = 10 10 10 + tc 9 wred weight = 9 9 9 + + tc 10 wred min = 48 40 32 + tc 10 wred max = 64 64 64 + tc 10 wred inv prob = 10 10 10 + tc 10 wred weight = 9 9 9 + + tc 11 wred min = 48 40 32 + tc 11 wred max = 64 64 64 + tc 11 wred inv prob = 10 10 10 + tc 11 wred weight = 9 9 9 + + tc 12 wred min = 48 40 32 + tc 12 wred max = 64 64 64 + tc 12 wred inv prob = 10 10 10 + tc 12 wred weight = 9 9 9 + Interactive mode ~~~~~~~~~~~~~~~~ @@ -295,11 +365,11 @@ This application classifies based on the QinQ double VLAN tags and the IP destin | 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) | + | Traffic Class | 13 | TCs of the same pipe services in strict priority | Destination IP address (0.0.0.X) | | | | | | +----------------+-------------------------+--------------------------------------------------+----------------------------------+ - | Queue | 4 | Queue of the same TC serviced in WRR | Destination IP address (0.0.0.X) | - | | | | | + | Queue | High Priority TC: 1, | Queue of lowest priority traffic | Destination IP address (0.0.0.X) | + | | Lowest Priority TC: 4 | class (Best effort) serviced in WRR | | +----------------+-------------------------+--------------------------------------------------+----------------------------------+ Please refer to the "QoS Scheduler" chapter in the *DPDK Programmer's Guide* for more information about these parameters. -- 2.20.1