Skip to content
Snippets Groups Projects
Select Git revision
  • ee3589e32d9d07b42863dd31663a1e5b4be699bb
  • master default protected
2 results

tc.md

Blame
  • Traffic Control (náhodné poznámky)

    Queueing Disciplines

    • ingress qdisc: může jenom klasifikovat a zahazovat pakety

      • lze obejít přeposíláním paketů do imq (Intermediate Queueing Device)
    • egress qdisc: může i zpožďovat pakety

    • číslování major:minor

      • root je obvykle 1:0 (lze zkrátit na 1:)
      • vstup do qdisc je major:0, třídy uvnitř mohou mít různé minors
    • pfifo_fast

      • classless
      • 3 bands (priority)
      • tabulka překládající 4 bity TOS na band
    • tbf (Token Bucket Filter)

      • classless
      • účtuje se v bytech
      • limit (maximální množství dat ve frontě na tokeny)
        • též jde zadat jako maximální latence
      • burst (velikost kyblíku)
      • mpu (minimální velikost paketu)
      • rate
    • prio

      • classful
      • bands (priority)
      • filtry přidělují band
      • pro každý band další qdisc
      • příklad:

        tc qdisc add dev eth0 root handle 1: prio

        This instantly creates classes 1:1, 1:2, 1:3

        tc qdisc add dev eth0 parent 1:1 handle 10: sfq

        tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000

        tc qdisc add dev eth0 parent 1:3 handle 30: sfq

        CAVEAT: kbit = k bits/second, kbps = k bytes/second

        Let us see what we created:

        tc -s qdisc ls dev eth0

    • htb (Hierarchical Token Bucket)

      • classful
    • multiq (mq)

      • pro karty s více HW frontami
      • classful, každá HW fronta má svou qdisc (typicky pfifo_fast)
    • mqprio

      • jako mqueue, ale navíc umí priority
      • až 16 traffic classes, každé přiřadíme interval HW front
      • překlad sbk->priority na traffic class, priorita se získá z:
        • setsockopt
        • iptables
        • net_prio cgroup
      • umí HW-offloaded shaper pro každou třídu

    Filtry

    # tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip dport 22 0xffff flowid 10:1
    # tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip sport 80 0xffff flowid 10:1
    # tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2

    Nebo:

    # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1
    # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1
    # tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2

    Nebo kombinace:

    # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match ip sport 80 0xffff flowid 10:1
    • u32

      • obecné matchovátko bajtů v paketech
      • umí HW offloading
    • flower

      • příjemnější matchování podle vlastností paketů (à la xtables)
      • též HW offloading
    • též jde klasifikovat podle fwmarků nebo routing realms (i pro zdrojové adresy!)

    • policing filter: umí pakety nad/pod nějakou mez průtoku/velikosti

      • zahazovat
      • reklasifikovat na best-effort
      • pipe: předat další akci v pořadí
    • ht: hash table

    • xt: zavolá chain v xtables

    • ematch

    • akce:

      • drop
      • mirred (mirror nebo redirect na jiné zařízení)
      • lze definovat uživatelské (tc action)
      • vlan (změna VLAN tagu)

    Advanced Queue Management

    • RED (1993)
    • good queue / bad queue
    • korelace mezi flows
    • měnící se podmínky

    ECN = Explicit Congestion Notification

    • 2 bity v hlavičce IP (ukradeny z TOS):
      • 00 = ECN not requested
      • 01 / 10 = ECN requested
        • 01 a 10 jsou ekvivalentní, ale dají se používat po experimentální ověřování toho, jak routery po cestě původně rezervované bity ovlivňují
      • 11 = congestion experienced
    • TCP posílá notifikaci odesílateli
      • 2 bity v hlavičce: ECE a CWR
      • při SYN a SYN+ACK se posílají oba (tím zapneme podporu ECN)
      • kdykoliv mi přijde paket s IP ECN, nastavím si flag
      • dokud mám flag nastavený, posílám protistraně TCP ECE
      • až mi od protistrany přijde CWR, shodím flag
      • Linux má 3 režimy: off / on / jen odpovídat
        • také umí tcp_ecn_fallback
    • modifikace RED, aby pří malé pravděpodobnosti posílal ECN

    CoDel

    • https://www.bufferbloat.net/projects/
    • https://www.rfc-editor.org/rfc/rfc8289.html
    • měří dobu, kterou paket strávil ve frontě
      • počítá minimum z této doby přes časové okno (doporučených 100 ms funguje dobře skoro vždy, ale při použití jen uvnitř serverovny se může hodit řádově menší hodnota)
      • snaží se udržet ho pod 5% šířky okna
      • proto mu nevadí změny rychlosti, ani více front krmících tutéž linku => fq_codel
      • může nastavovat ECN

    Flow Queue CoDel

    • https://www.rfc-editor.org/rfc/rfc8290
    • pakety se hešují podle flow ID (protocol, src IP+port, dest IP+port), defaultně 1K kyblíků
      • uvnitř každého kyblíku CoDel
      • něco-jako-round-robin střídá fronty pro odesílání (snaží se odebírat stejné množství dat i při různě velkých paketech)
    • pozor na interakci s offloadingem

    CAKE

    • https://www.bufferbloat.net/projects/codel/wiki/CakeTechnical/
    • kombinuje fq_codel se shaperem
    • hešování flows je 8-cestně množinově asociativní (omezuje efekt kolizí)
    • traffic classes (priority): defaultně 4, automatická klasifikace
    • umí započítat overhead linkové vrstvy (třeba i ATM)
    • umí rozebrat superpakety pro GSO/GRO, pokud je potřeba
    • tc qdisc add dev eth2 root cake bandwidth 50mbit