100 lines
3.8 KiB
ReStructuredText
100 lines
3.8 KiB
ReStructuredText
Queue limits
|
|
------------
|
|
|
|
.. heading hierarchy:
|
|
------------- Chapter
|
|
************* Section (#.#)
|
|
============= Subsection (#.#.#)
|
|
############# Paragraph (no number)
|
|
|
|
This section documents the queue limits model, which is used by the traffic control
|
|
to limit the NetDevices queueing delay. It operates on the transmission path of
|
|
the network node.
|
|
|
|
The reduction of the NetDevices queueing delay is essential to improve the effectiveness of
|
|
Active Queue Management (AQM) algorithms.
|
|
Careful assessment of the queueing delay includes a byte-based measure of the NetDevices
|
|
queue length. In this design, traffic control can use different byte-based schemes to
|
|
limit the queueing delay. Currently the only available scheme is DynamicQueueLimits, which is
|
|
modelled after the dynamic queue limit library of Linux.
|
|
|
|
Model Description
|
|
*****************
|
|
|
|
The source code for the model lives in the directory ``src/network/utils``.
|
|
|
|
The model allows a byte-based measure of the netdevice queue. The byte-based measure
|
|
more accurately approximates the time required to empty the queue than a packet-based measure.
|
|
|
|
To inform the upper layers about the transmission of packets, NetDevices can call a couple
|
|
of functions:
|
|
|
|
* ``void NotifyQueuedBytes (uint32_t bytes)``: Report the number of bytes queued to the device queue
|
|
* ``void NotifyTransmittedBytes (uint32_t bytes)``: Report the number of bytes transmitted by device
|
|
|
|
Based on this information, the QueueLimits object can stop the transmission queue.
|
|
|
|
In case of multiqueue NetDevices this mechanism is available for each queue.
|
|
|
|
The QueueLimits model can be used on any NetDevice modelled in ns-3.
|
|
|
|
Design
|
|
======
|
|
|
|
An abstract base class, class QueueLimits, is subclassed for specific
|
|
byte-based limiting strategies.
|
|
|
|
Common operations provided by the base class QueueLimits include:
|
|
|
|
* ``void Reset ()``: Reset queue limits state
|
|
* ``void Completed (uint32_t count)``: Record the number of completed bytes and recalculate the limit
|
|
* ``int32_t Available () const``: Return how many bytes can be queued
|
|
* ``void Queued (uint32_t count)``: Record number of bytes queued
|
|
|
|
DynamicQueueLimits
|
|
##################
|
|
|
|
Dynamic queue limits (DQL) is a basic library implemented in the Linux kernel to limit the Ethernet
|
|
queueing delay. DQL is a general purpose queue length controller. The goal of DQL is to calculate
|
|
the limit as the minimum number of bytes needed to prevent starvation.
|
|
|
|
Three attributes are defined in the DynamicQueueLimits class:
|
|
|
|
* ``HoldTime``: The DQL algorithm hold time
|
|
* ``MaxLimit``: Maximum limit
|
|
* ``MinLimit``: Minimum limit
|
|
|
|
The DQL algorithm hold time is 1 s. Reducing the HoldTime increases the responsiveness of
|
|
DQL with consequent greater number of limit variation events. Conversely, increasing the HoldTime
|
|
decreases the responsiveness of DQL with a minor number of limit variation events.
|
|
The limit calculated by DQL is in the range from MinLimit to MaxLimit.
|
|
The default values are respectively 0 and DQL_MAX_LIMIT.
|
|
Increasing the MinLimit is recommended in case of higher NetDevice transmission rate (e.g. 1 Gbps)
|
|
while reducing the MaxLimit is recommended in case of lower NetDevice transmission rate (e.g. 500 Kbps).
|
|
|
|
There is one trace source in DynamicQueueLimits class that may be hooked:
|
|
|
|
* ``Limit``: Limit value calculated by DQL
|
|
|
|
Usage
|
|
*****
|
|
|
|
Helpers
|
|
=======
|
|
|
|
A typical usage pattern is to create a traffic control helper and configure
|
|
the queue limits type and attributes from the helper, such as this example:
|
|
|
|
.. sourcecode:: cpp
|
|
|
|
TrafficControlHelper tch;
|
|
uint32_t handle = tch.SetRootQueueDisc("ns3::PfifoFastQueueDisc", "Limit", UintegerValue(1000));
|
|
|
|
tch.SetQueueLimits("ns3::DynamicQueueLimits", "HoldTime", StringValue("4ms"));
|
|
|
|
then install the configuration on a NetDevices container
|
|
|
|
.. sourcecode:: cpp
|
|
|
|
tch.Install (devices);
|