Shaping

Shaping causes a traffic flow to conform to a bandwidth value referred to as the shaping rate. Excess traffic beyond the shaping rate is queued inside the shaper and transmitted only when doing so does not violate the defined shaping rate.

A shaper is implemented using a token bucket. If a packet fulfills the bandwidth/burst specification, it can pass. Otherwise, the packet is kept in a delay queue until it fulfills the bandwidth/burst specification. As soon as the delay queue is full, the incoming packets are dropped.

Shaping is applied to egress traffic on physical interfaces.

../../../_images/shap_design.svg

Shaper templates

Shaper templates are created in the global qos context with the shaper command. They can then be referenced by a physical interface for egress.

Enter the global qos context and create a shaper:

vrouter running config# qos
vrouter running qos#
vrouter running qos# shaper shaper1
vrouter running shaper shaper1#! bandwidth 1G
vrouter running shaper shaper1# burst 2K
vrouter running shaper shaper1# queue-size 128
vrouter running shaper shaper1# ..
vrouter running qos#

Interfaces that use this shaper will have their frame bandwidth shaped to 1 Gbps, with bursts up to 2 Kbytes. Frames that would cause this profile to be exceeded will be temporary saved in a delay queue to be sent later to fulfill the frame rate limitation. When the delay queue is full, the incoming frames are dropped.

By default the size of the delay queue is 256 packets. It can be changed via the queue-size command.

vrouter running config# qos
vrouter running qos#
vrouter running qos# shaper shaper1
vrouter running shaper shaper1# queue-size 128
vrouter running shaper shaper1# ..
vrouter running qos#

Note

If a scheduler and a shaper template are applied on an interface, the queue size of the shaper template is ignored. In this case the different queues of the scheduler are also used as delay queues.

In order to take into account bytes added to the frame size by the layer 1 level (by default 24 bytes for Ethernet CRC, Internet Frame Gap and preamble), you can specify an amount of bytes to add to the frame size in rate and burst calculations via the layer1-overhead command.

vrouter running config# qos
vrouter running qos#
vrouter running qos# shaper shaper2
vrouter running shaper shaper2#! bandwidth 10G
vrouter running shaper shaper2# layer1-overhead 24
vrouter running shaper shaper2# ..
vrouter running qos#

Review the QoS configuration:

vrouter running# show config qos
qos
    shaper shaper1
        bandwidth 1G
        burst 2K
        queue-size 128
        layer1-overhead 0
        ..
    shaper shaper2
        bandwidth 10G
        queue-size 256
        layer1-overhead 24
        ..
    ..

The same settings can be applied using the following NETCONF XML configuration:

vrouter running config qos# show config xml absolute
<config xmlns="urn:6wind:vrouter">
  <qos xmlns="urn:6wind:vrouter/qos">
    <shaper>
      <name>shaper1</name>
      <burst>2000</burst>
      <layer1-overhead>0</layer1-overhead>
      <queue-size>128</queue-size>
      <bandwidth>1000000000</bandwidth>
    </shaper>
    <shaper>
      <name>shaper2</name>
      <layer1-overhead>24</layer1-overhead>
      <queue-size>256</queue-size>
      <bandwidth>10000000000</bandwidth>
    </shaper>
  </qos>
</config>

Configuring a shaper on an interface

Shapers are configured in the qos context of physical interfaces.

Enter the qos context of the eth0 physical interface:

vrouter running config# vrf main
vrouter running vrf main# interface physical eth0
vrouter running physical eth0# qos

Configure shaper2 as the rate limiter for egress traffic:

vrouter running qos# egress rate-limit shaper shaper2
vrouter running qos# ..
vrouter running physical eth0#

Review eth0 configuration:

vrouter running physical eth0# show config nodefault
physical eth0
    (...)
    qos
        egress
            rate-limit
                shaper shaper1
                ..
            ..
        ..
    ..

Commit the configuration:

vrouter running physical eth0# commit
Configuration committed.
vrouter running physical eth0# /
vrouter running config#

Review the QoS state of the interface:

vrouter running config# show state vrf main interface physical eth0
physical eth0
    qos
        egress
            rate-limit
                shaper
                    bandwidth 10G
                    burst 125M
                    queue-size 256
                    layer1-overhead 24
                    stats
                        pass-packets 0
                        drop-packets 0
                        ..
                    ..
                ..
            ..
        ..
    ..
..

The same settings can be applied using the following NETCONF XML configuration:

vrouter running config# show config xml absolute
<config xmlns="urn:6wind:vrouter">
  <vrf>
    <name>main</name>
    <interface xmlns="urn:6wind:vrouter/interface">
      <physical>
        <name>eth0</name>
        (...)
    </qos>
        <qos>
          <egress>
            <rate-limit>
              <shaper>shaper1</shaper>
            </rate-limit>
          </egress>
        </qos>
      </physical>
    </interface>
  </vrf>
</config>

Protecting critical control plane traffic

When configuring a simple shaper on the output of an interface that is constantly fed with traffic over the limit, a part of the traffic is necessarily dropped. There is a risk that critical control plane traffic be dropped.

In order to protect this critical control plane and preserve it from being dropped, a simple QoS scheduler and traffic filter should be configured in addition to the shaper. Please refer to chapter Shaping the output while protecting critical control plane traffic.