{
    "mode": "man",
    "parameter": "tc-fq_pie",
    "section": "8",
    "url": "https://www.chedong.com/phpMan.php/man/tc-fq_pie/8/json",
    "generated": "2026-05-30T07:11:35Z",
    "synopsis": "tc qdisc ... fqpie [ limit PACKETS ] [ flows NUMBER ]\n[ target TIME ] [ tupdate TIME ]\n[ alpha NUMBER ] [ beta NUMBER ]\n[ quantum BYTES ] [ memorylimit BYTES ]\n[ ecnprob PERENTAGE ] [ [no]ecn ]\n[ [no]bytemode ] [ [no]dqrateestimator ]",
    "sections": {
        "NAME": {
            "content": "FQ-PIE - Flow Queue Proportional Integral controller Enhanced\n\n",
            "subsections": []
        },
        "SYNOPSIS": {
            "content": "tc qdisc ... fqpie [ limit PACKETS ] [ flows NUMBER ]\n[ target TIME ] [ tupdate TIME ]\n[ alpha NUMBER ] [ beta NUMBER ]\n[ quantum BYTES ] [ memorylimit BYTES ]\n[ ecnprob PERENTAGE ] [ [no]ecn ]\n[ [no]bytemode ] [ [no]dqrateestimator ]\n\n",
            "subsections": []
        },
        "DESCRIPTION": {
            "content": "FQ-PIE  (Flow Queuing with Proportional Integral controller Enhanced) is a queuing discipline\nthat combines Flow Queuing with the PIE AQM scheme. FQ-PIE uses a Jenkins  hash  function  to\nclassify  incoming  packets  into  different flows and is used to provide a fair share of the\nbandwidth to all the flows using the qdisc. Each such flow is managed by the PIE algorithm.\n\n",
            "subsections": []
        },
        "ALGORITHM": {
            "content": "The FQ-PIE algorithm consists of two logical parts: the scheduler which selects  which  queue\nto  dequeue  a packet from, and the PIE AQM which works on each of the queues. The major work\nof FQ-PIE is mostly in the scheduling part. The interaction between the scheduler and the PIE\nalgorithm is straight forward.\n\nDuring  the enqueue stage, a hashing-based scheme is used, where flows are hashed into a num‐\nber of buckets with each bucket having its own queue. The number of buckets is  configurable,\nand  presently  defaults to 1024 in the implementation.  The flow hashing is performed on the\n5-tuple of source and destination IP addresses, port numbers and IP protocol number. Once the\npacket  has been successfully classified into a queue, it is handed over to the PIE algorithm\nfor enqueuing. It is then added to the tail of the selected queue, and the queue's byte count\nis  updated  by  the packet size. If the queue is not currently active (i.e., if it is not in\neither the list of new or the list of old queues) , it is added to the end of the list of new\nqueues,  and  its  number  of  credits is initiated to the configured quantum. Otherwise, the\nqueue is left in its current queue list.\n\nDuring the dequeue stage, the scheduler first looks at the list of new queues; for the  queue\nat  the  head  of that list, if that queue has a negative number of credits (i.e., it has al‐\nready dequeued at least a quantum of bytes), it is given an additional  quantum  of  credits,\nthe  queue  is  put  onto the end of the list of old queues, and the routine selects the next\nqueue and starts again. Otherwise, that queue is selected for dequeue again. If the  list  of\nnew  queues  is empty, the scheduler proceeds down the list of old queues in the same fashion\n(checking the credits, and either selecting the queue for dequeuing, or  adding  credits  and\nputting  the  queue back at the end of the list). After having selected a queue from which to\ndequeue a packet, the PIE algorithm is invoked on that queue.\n\nFinally, if the PIE algorithm does not return a packet, then the queue must be empty and  the\nscheduler does one of two things:\n\nIf the queue selected for dequeue came from the list of new queues, it is moved to the end of\nthe list of old queues. If instead it came from the list of old queues, that queue is removed\nfrom  the  list, to be added back (as a new queue) the next time a packet arrives that hashes\nto that queue. Then (since no packet was available for dequeue), the whole dequeue process is\nrestarted from the beginning.\n\nIf,  instead,  the  scheduler  did get a packet back from the PIE algorithm, it subtracts the\nsize of the packet from the byte credits for the selected queue and returns the packet as the\nresult of the dequeue operation.\n\n",
            "subsections": []
        },
        "PARAMETERS": {
            "content": "",
            "subsections": [
                {
                    "name": "limit",
                    "content": "It  is the limit on the queue size in packets. Incoming packets are dropped when the limit is\nreached. The default value is 10240 packets.\n\n"
                },
                {
                    "name": "flows",
                    "content": "It is the number of flows into which the incoming packets are classified. Due to the stochas‐\ntic nature of hashing, multiple flows may end up being hashed into the same slot. Newer flows\nhave priority over older ones. This parameter can be set only at load time since  memory  has\nto be allocated for the hash table. The default value is 1024.\n\n"
                },
                {
                    "name": "target",
                    "content": "It  is the queue delay which the PIE algorithm tries to maintain. The default target delay is\n15ms.\n\n"
                },
                {
                    "name": "tupdate",
                    "content": "It is the time interval at which the system drop probability is calculated.  The  default  is\n15ms.\n\n"
                },
                {
                    "name": "alpha",
                    "content": ""
                },
                {
                    "name": "beta",
                    "content": "alpha  and beta are parameters chosen to control the drop probability. These should be in the\nrange between 0 and 32.\n\n"
                },
                {
                    "name": "quantum",
                    "content": "quantum signifies the number of bytes that may be dequeued from a queue before  switching  to\nthe next queue in the deficit round robin scheme.\n\n\nmemorylimit\nIt is the maximum total memory allowed for packets of all flows. The default is 32Mb.\n\n\necnprob\nIt  is  the drop probability threshold below which packets will be ECN marked instead of get‐\nting dropped. The default is 10%. Setting this parameter requires ecn to be enabled.\n\n\n[no]ecn\nIt has the same semantics as pie and can be used to mark packets instead of dropping them. If\necn has been enabled, noecn can be used to turn it off and vice-a-versa.\n\n\n[no]bytemode\nIt  is  used  to scale drop probability proportional to packet size bytemode to turn on byte‐\nmode, nobytemode to turn off bytemode. By default, bytemode is turned off.\n\n\n[no]dqrateestimator\ndqrateestimator can be used to calculate queue delay using Little's Law, nodqrateestima‐‐\ntor  can  be  used to calculate queue delay using timestamp. By default, dqrateestimator is\nturned off.\n\n"
                }
            ]
        },
        "EXAMPLES": {
            "content": "# tc qdisc add dev eth0 root fqpie\n# tc -s qdisc show dev eth0\nqdisc fqpie 8001: root refcnt 2 limit 10240p flows 1024 target 15.0ms tupdate 16.0ms alpha 2\nbeta 20 quantum 1514b memorylimit 32Mb ecnprob 10\nSent 159173586 bytes 105261 pkt (dropped 24, overlimits 0 requeues 0)\nbacklog 75700b 50p requeues 0\npktsin 105311 overlimit 0 overmemory 0 dropped 24 ecnmark 0\nnewflowcount 7332 newflowslen 0 oldflowslen 4 memoryused 108800\n\n# tc qdisc add dev eth0 root fqpie dqrateestimator\n# tc -s qdisc show dev eth0\nqdisc fqpie 8001: root refcnt 2 limit 10240p flows 1024 target 15.0ms tupdate 16.0ms alpha 2\nbeta 20 quantum 1514b memorylimit 32Mb ecnprob 10 dqrateestimator\nSent 8263620 bytes 5550 pkt (dropped 4, overlimits 0 requeues 0)\nbacklog 805448b 532p requeues 0\npktsin 6082 overlimit 0 overmemory 0 dropped 4 ecnmark 0\nnewflowcount 94 newflowslen 0 oldflowslen 8 memoryused 1157632\n\n",
            "subsections": []
        },
        "SEE ALSO": {
            "content": "tc(8), tc-pie(8), tc-fqcodel(8)\n\n",
            "subsections": []
        },
        "SOURCES": {
            "content": "RFC 8033: https://tools.ietf.org/html/rfc8033\n\n",
            "subsections": []
        },
        "AUTHORS": {
            "content": "FQ-PIE was implemented by Mohit P. Tahiliani. Please report corrections to the Linux Network‐\ning mailing list <netdev@vger.kernel.org>.\n\n\n\niproute2                                   23 January 2020                                 FQ-PIE(8)",
            "subsections": []
        }
    },
    "summary": "FQ-PIE - Flow Queue Proportional Integral controller Enhanced",
    "flags": [],
    "examples": [
        "# tc qdisc add dev eth0 root fqpie",
        "# tc -s qdisc show dev eth0",
        "qdisc fqpie 8001: root refcnt 2 limit 10240p flows 1024 target 15.0ms tupdate 16.0ms alpha 2",
        "beta 20 quantum 1514b memorylimit 32Mb ecnprob 10",
        "Sent 159173586 bytes 105261 pkt (dropped 24, overlimits 0 requeues 0)",
        "backlog 75700b 50p requeues 0",
        "pktsin 105311 overlimit 0 overmemory 0 dropped 24 ecnmark 0",
        "newflowcount 7332 newflowslen 0 oldflowslen 4 memoryused 108800",
        "# tc qdisc add dev eth0 root fqpie dqrateestimator",
        "# tc -s qdisc show dev eth0",
        "qdisc fqpie 8001: root refcnt 2 limit 10240p flows 1024 target 15.0ms tupdate 16.0ms alpha 2",
        "beta 20 quantum 1514b memorylimit 32Mb ecnprob 10 dqrateestimator",
        "Sent 8263620 bytes 5550 pkt (dropped 4, overlimits 0 requeues 0)",
        "backlog 805448b 532p requeues 0",
        "pktsin 6082 overlimit 0 overmemory 0 dropped 4 ecnmark 0",
        "newflowcount 94 newflowslen 0 oldflowslen 8 memoryused 1157632"
    ],
    "see_also": [
        {
            "name": "tc",
            "section": "8",
            "url": "https://www.chedong.com/phpMan.php/man/tc/8/json"
        },
        {
            "name": "tc-pie",
            "section": "8",
            "url": "https://www.chedong.com/phpMan.php/man/tc-pie/8/json"
        },
        {
            "name": "tc-fqcodel",
            "section": "8",
            "url": "https://www.chedong.com/phpMan.php/man/tc-fqcodel/8/json"
        }
    ]
}