FQ-PIE(8)               (23 January 2020)               FQ-PIE(8)

          FQ-PIE - Flow Queue Proportional Integral controller

          tc qdisc ... fq_pie [ limit PACKETS ] [ flows NUMBER ]
                              [ target TIME ] [ tupdate TIME ]
                              [ alpha NUMBER ] [ beta NUMBER ]
                              [ quantum BYTES ] [ memory_limit BYTES ]
                              [ ecn_prob PERENTAGE ] [ [no]ecn ]
                              [ [no]bytemode ] [
          [no_]dq_rate_estimator ]

          FQ-PIE (Flow Queuing with Proportional Integral controller
          Enhanced) is a queuing discipline that combines Flow Queuing
          with the PIE AQM scheme. FQ-PIE uses a Jenkins hash function
          to classify incoming packets into different flows and is
          used to provide a fair share of the bandwidth to all the
          flows using the qdisc. Each such flow is managed by the PIE

          The FQ-PIE algorithm consists of two logical parts: the
          scheduler which selects which queue to dequeue a packet
          from, and the PIE AQM which works on each of the queues. The
          major work of FQ-PIE is mostly in the scheduling part. The
          interaction between the scheduler and the PIE algorithm is
          straight forward.

          During the enqueue stage, a hashing-based scheme is used,
          where flows are hashed into a number of buckets with each
          bucket having its own queue. The number of buckets is con-
          figurable, and presently defaults to 1024 in the implementa-
          tion.  The flow hashing is performed on the 5-tuple of
          source and destination IP addresses, port numbers and IP
          protocol number. Once the packet has been successfully clas-
          sified into a queue, it is handed over to the PIE algorithm
          for enqueuing. It is then added to the tail of the selected
          queue, and the queue's byte count is updated by the packet
          size. If the queue is not currently active (i.e., if it is
          not in either the list of new or the list of old queues) ,
          it is added to the end of the list of new queues, and its
          number of credits is initiated to the configured quantum.
          Otherwise, the queue is left in its current queue list.

     Page 1                      iproute2            (printed 5/23/22)

     FQ-PIE(8)               (23 January 2020)               FQ-PIE(8)

          During the dequeue stage, the scheduler first looks at the
          list of new queues; for the queue at the head of that list,
          if that queue has a negative number of credits (i.e., it has
          already dequeued at least a quantum of bytes), it is given
          an additional quantum of credits, the queue is put onto the
          end of the list of old queues, and the routine selects the
          next queue and starts again. Otherwise, that queue is
          selected for dequeue again. If the list of new queues is
          empty, the scheduler proceeds down the list of old queues in
          the same fashion (checking the credits, and either selecting
          the queue for dequeuing, or adding credits and putting the
          queue back at the end of the list). After having selected a
          queue from which to dequeue a packet, the PIE algorithm is
          invoked on that queue.

          Finally, if the PIE algorithm does not return a packet, then
          the queue must be empty and the scheduler does one of two

          If the queue selected for dequeue came from the list of new
          queues, it is moved to the end of the list of old queues. If
          instead it came from the list of old queues, that queue is
          removed from the list, to be added back (as a new queue) the
          next time a packet arrives that hashes to that queue. Then
          (since no packet was available for dequeue), the whole
          dequeue process is restarted from the beginning.

          If, instead, the scheduler did get a packet back from the
          PIE algorithm, it subtracts the size of the packet from the
          byte credits for the selected queue and returns the packet
          as the result of the dequeue operation.

          It is the limit on the queue size in packets. Incoming pack-
          ets are dropped when the limit is reached. The default value
          is 10240 packets.

          It is the number of flows into which the incoming packets
          are classified. Due to the stochastic nature of hashing,
          multiple flows may end up being hashed into the same slot.
          Newer flows have priority over older ones. This parameter
          can be set only at load time since memory has to be allo-
          cated for the hash table. The default value is 1024.

          It is the queue delay which the PIE algorithm tries to main-
          tain. The default target delay is 15ms.

     Page 2                      iproute2            (printed 5/23/22)

     FQ-PIE(8)               (23 January 2020)               FQ-PIE(8)

          It is the time interval at which the system drop probability
          is calculated.  The default is 15ms.

          alpha and beta are parameters chosen to control the drop
          probability. These should be in the range between 0 and 32.

          quantum signifies the number of bytes that may be dequeued
          from a queue before switching to the next queue in the defi-
          cit round robin scheme.

          It is the maximum total memory allowed for packets of all
          flows. The default is 32Mb.

          It is the drop probability threshold below which packets
          will be ECN marked instead of getting dropped. The default
          is 10%. Setting this parameter requires ecn to be enabled.

          It has the same semantics as pie and can be used to mark
          packets instead of dropping them. If ecn has been enabled,
          noecn can be used to turn it off and vice-a-versa.

          It is used to scale drop probability proportional to packet
          size bytemode to turn on bytemode, nobytemode to turn off
          bytemode. By default, bytemode is turned off.

          dq_rate_estimator can be used to calculate queue delay using
          Little's Law, no_dq_rate_estimator can be used to calculate
          queue delay using timestamp. By default, dq_rate_estimator
          is turned off.

          # tc qdisc add dev eth0 root fq_pie
          # tc -s qdisc show dev eth0
          qdisc fq_pie 8001: root refcnt 2 limit 10240p flows 1024
          target 15.0ms tupdate 16.0ms alpha 2 beta 20 quantum 1514b

     Page 3                      iproute2            (printed 5/23/22)

     FQ-PIE(8)               (23 January 2020)               FQ-PIE(8)

          memory_limit 32Mb ecn_prob 10
           Sent 159173586 bytes 105261 pkt (dropped 24, overlimits 0
          requeues 0)
           backlog 75700b 50p requeues 0
            pkts_in 105311 overlimit 0 overmemory 0 dropped 24
          ecn_mark 0
            new_flow_count 7332 new_flows_len 0 old_flows_len 4
          memory_used 108800

          # tc qdisc add dev eth0 root fq_pie dq_rate_estimator
          # tc -s qdisc show dev eth0
          qdisc fq_pie 8001: root refcnt 2 limit 10240p flows 1024
          target 15.0ms tupdate 16.0ms alpha 2 beta 20 quantum 1514b
          memory_limit 32Mb ecn_prob 10 dq_rate_estimator
           Sent 8263620 bytes 5550 pkt (dropped 4, overlimits 0
          requeues 0)
           backlog 805448b 532p requeues 0
            pkts_in 6082 overlimit 0 overmemory 0 dropped 4 ecn_mark 0
            new_flow_count 94 new_flows_len 0 old_flows_len 8
          memory_used 1157632

          tc(8), tc-pie(8), tc-fq_codel(8)

          RFC 8033: https://tools.ietf.org/html/rfc8033

          FQ-PIE was implemented by Mohit P. Tahiliani. Please report
          corrections to the Linux Networking mailing list

     Page 4                      iproute2            (printed 5/23/22)