#server-performance

Linux Traffic Control (tc): praktický průvodce

12 min čtení - 5. června 2026

hero section cover

Řízení šířky pásma, prioritizace provozu a tvarování příchozího a odchozího provozu v systému Linux pomocí nástroje tc. Funkční konfigurace HTB, IFB, DSCP a fq_codel pro skutečné servery.

Linux Traffic Control (tc): praktický průvodce

Příkaz tc vám umožňuje přímo řídit, jak váš server zpracovává síťový provoz. Můžete omezit šířku pásma pro jednotlivé služby, zajistit, aby interaktivní relace jako SSH zůstaly odezvu i při náhlém nárůstu hromadných přenosů, a pomocí jediného nástroje regulovat jak odchozí, tak příchozí datové toky. Tato příručka se zabývá základními pojmy, funkčním nastavením HTB, regulací příchozího provozu pomocí IFB, prioritizací na základě DSCP a tím, jak provádět ladění v případě, že něco nefunguje.


 

Jak funguje tc

Každé tc konfigurace se skládá ze čtyř pohyblivých částí:

  • qdisc (queuing discipline). Plánovač připojený k síťovému rozhraní. Rozhoduje o tom, jak jsou pakety zařazovány do fronty a z ní odebírány.
  • Třída. Podskupina v rámci qdisc s třídami. Představte si to jako jízdní pruh s vlastním rychlostním limitem.
  • Filter. Kontroluje hlavičky paketů (IP adresy, porty, značky) a přiřazuje každý paket do určité třídy.
  • Akce. Co se stane s paketem, jakmile splní podmínky: předání, zahození, přesměrování.

Tyto prvky tvoří strom. Pakety vstupují do kořenového qdisc, procházejí filtry, jsou roztříděny do tříd pomocí major:minor identifikátoru a nakonec jsou zařazeny do fronty na listovém qdiscu k přenosu.

Pro cokoli složitějšího než porovnávání na základě portů označte pakety pomocí iptables nebo nftables v tabulce mangle a poté použijte fw filtr v tc k třídění podle značky. Škáluje se to mnohem lépe než řetězení surových u32 pravidel pro každý typ provozu.

Odchozí vs. příchozí

Na směru záleží. Jádro může odchozí pakety ukládat do vyrovnávací paměti a zpožďovat, což umožňuje skutečné tvarování provozu. Příchozí pakety již v okamžiku, kdy je vidíte, prošly sítí, takže je můžete pouze regulovat (zahozením při překročení prahové hodnoty), pokud je nejprve nepřesměrujete na zařízení IFB.

FunkceOdchozíPříchozí
SměrOdchozíPříchozí
TvarováníNativníVyžaduje IFB
PolicingPodporovánoPodporováno
Typické použitíQoS, sdílení šířky pásma, regulace rychlostiOmezení rychlosti, základní ochrana proti DDoS

Qdiscy, které budete skutečně používat

  • HTB (Hierarchical Token Bucket). S třídami. Použijte jej, pokud chcete zaručit minimální šířku pásma pro každou službu s možností vypůjčit si nevyužitou kapacitu z jiných tříd.
  • TBF (Token Bucket Filter). Beztřídní. Použijte jej, pokud potřebujete pouze omezit celé rozhraní na jednu rychlost.
  • fq_codel (Fair Queuing Controlled Delay). Kombinuje spravedlivé rozdělení toku s aktivní správou front, čímž eliminuje bufferbloat. Od verze systemd 217 je to výchozí qdisc ve většině linuxových distribucí a je dodáván jako výchozí v RHEL 9. Vždy jej připojujte jako listový qdisc pod třídami HTB, jinak může jediný nenasytný tok zabrat celou třídu.

Nastavení tc na linuxovém serveru

tc je součástí balíčku iproute2. V systémech Debian a Ubuntu jej nainstalujte příkazem apt-get install iproute2. V systémech RHEL a jejich derivátech yum install iproute. Budete potřebovat oprávnění root nebo sudo.

Nejprve zjistěte správný název rozhraní. Nesprávné pojmenování rozhraní je nejčastějším důvodem, proč konfigurace bez varování nefunguje:

ip link show

Zkontrolujte, co se již na rozhraní nachází, včetně aktuálních čítačů:

tc -s qdisc show dev eth0

Před aplikací nové konfigurace odstraňte všechny existující root qdisc, abyste se vyhnuli RTNETLINK answers: File exists chybám:

tc qdisc del dev eth0 root 2>/dev/null || true

Pokud aktualizujete stávající pravidlo, místo abyste začínali od nuly, použijte replace místo add pro atomickou výměnu.

Hardwarové odlehčení, jako jsou TSO a GSO, sdružuje pakety způsobem, který narušuje tvarování. Vypněte je na rozhraní, na kterém se provádí tvarování:

sudo ethtool -K eth0 tso off gso off

Nastavte fq_codel jako systémové výchozí qdisc pro nová rozhraní:

sysctl -w net.core.default_qdisc=fq_codel

U vytížených serverů jej kombinujte s algoritmem řízení přetížení BBR (jádro 4.9+). BBR udržuje vysokou propustnost bez prodlužování front:

sysctl -w net.ipv4.tcp_congestion_control=bbr

Jeden bezpečnostní zvyk, pokud konfigurujete vzdálený počítač přes SSH: otevřete druhou relaci a mějte tc qdisc del dev eth0 root připravené k vložení. Chybné pravidlo filtru vás může okamžitě odříznout.

Řízení odchozího provozu pomocí HTB

HTB vám umožňuje každé službě přiřadit garantované minimum (rate) a maximální limit (ceil). Nevyužitá šířka pásma se přiděluje tomu, kdo ji potřebuje, v pořadí podle priority. Zde je funkční tříúrovňové nastavení pro uplink o rychlosti 1 Gbps.

Vytvořte kořenový qdisc HTB. Ten default 30 odešle jakýkoli neklasifikovaný paket do třídy 1:30 , místo aby jej nechal obejít vaše pravidla:

tc qdisc add dev eth0 root handle 1: htb default 30

Omezte celkovou propustnost na 900 Mbps. Vždy nastavujte tvarování mírně pod skutečnou kapacitou spojení, jinak se vytvoří fronta na upstreamovém routeru nebo modemu, který nemáte pod kontrolou:

tc class add dev eth0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit

Definujte úrovně služeb. Nižší prio hodnoty získají nevyužitou šířku pásma jako první:

# High priority: web and API traffic
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1
 
# Medium priority: database replication
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300mbit ceil 900mbit prio 2
 
# Low priority: bulk and backup traffic
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 100mbit ceil 900mbit prio 3

Připojte fq_codel jako listový qdisc ke každé třídě, aby jeden tok nemohl dominovat své úrovni:

tc qdisc add dev eth0 parent 1:10 handle 10: fq_codel
tc qdisc add dev eth0 parent 1:20 handle 20: fq_codel
tc qdisc add dev eth0 parent 1:30 handle 30: fq_codel

Nyní klasifikujte provoz. Pro jednoduché porovnání portů u32 je nejrychlejší:

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
  match ip dport 443 0xffff flowid 1:10

Pro cokoli, co vyžaduje sledování stavu, označte v iptables a porovnejte označení s fw:

iptables -t mangle -A OUTPUT -p tcp --dport 5432 -j MARK --set-mark 2
tc filter add dev eth0 protocol ip parent 1:0 prio 2 handle 2 fw flowid 1:20

Tvarování příchozího provozu pomocí IFB

Příchozí provoz nelze nativně tvarovat, protože v okamžiku, kdy paket dorazí, již spotřeboval vaši šířku pásma. Řešením je přesměrování příchozího provozu na virtuální rozhraní Intermediate Functional Block (IFB), kde jej jádro považuje za odchozí a umožňuje vám použít qdiscy s třídami.

Načtěte modul a spusťte rozhraní:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Přidejte qdisc pro příchozí provoz k fyzickému rozhraní a přesměrujte vše na ifb0:

tc qdisc add dev eth0 ingress handle ffff:
tc filter add dev eth0 parent ffff: protocol all u32 \
  match u32 0 0 action mirred egress redirect dev ifb0

Od tohoto okamžiku ifb0 se chová jako jakékoli jiné rozhraní. Použijte na něj svůj strom HTB přesně tak, jak byste to udělali u odchozího provozu:

tc qdisc add dev ifb0 root handle 1: htb default 30
tc class add dev ifb0 parent 1: classid 1:1 htb rate 900mbit ceil 900mbit
tc class add dev ifb0 parent 1:1 classid 1:10 htb rate 500mbit ceil 900mbit prio 1

Prioritizace provozu pomocí DSCP

DSCP (Differentiated Services Code Point) označuje pakety 6bitovou hodnotou v bajtu TOS, takže vaše tc filtry mohou provádět klasifikaci podle značky, místo aby prohledávaly porty v celé sadě pravidel. Při porovnávání DSCP v tc, posuňte hodnotu o 2 bity doleva. DSCP EF (46) se změní na 0xb8. Maska 0xfc odděluje 6 bitů DSCP od 2 bitů ECN.

Rozumné výchozí přiřazení pro serverové úlohy:

Typ provozuDSCPTOS (hex)Příklady
InteraktivníEF0xb8SSH, DNS, VoIP
ObchodníAF410x88HTTP, HTTPS, API
HromadnéCS10x20Zálohy, FTP, aktualizace balíčků
Podle možnostíCS00x00Vše ostatní

Označte odchozí pakety v iptables, než se dostanou k vašim tc filtry:

iptables -t mangle -A OUTPUT -p tcp --dport 22 -j DSCP --set-dscp 46

Poté porovnejte značku v tc a nasměrujte je do správné třídy HTB:

# EF (SSH, VoIP) goes to the high-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
  match ip tos 0xb8 0xfc flowid 1:10
 
# AF41 (web traffic) goes to the medium class
tc filter add dev eth0 protocol ip parent 1:0 prio 2 u32 \
  match ip tos 0x88 0xfc flowid 1:20
 
# CS1 (bulk) goes to the low-priority class
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
  match ip tos 0x20 0xfc flowid 1:30

Monitorování a řešení problémů

Tři příkazy, které budete neustále používat:

tc -s qdisc show dev eth0
tc -s class show dev eth0
tc -s filter show dev eth0

Sledujte dropped a overlimits počítadla. Ztracené pakety znamenají, že fronta je přetížená; překročení limitů znamená, že jste dosáhli stropu dané třídy a jádro muselo zpozdit nebo odhodit provoz. Pro živý náhled:

watch -n 1 'tc -s class show dev eth0'

Přidejte -d pro interní parametry (target, interval, quantum) a -j pro výstup v JSON, pokud data přesměrováváte do metrikového stacku. Spojte to s ss -tin pro zobrazení odhadů RTT a opakovaných přenosů na úrovni TCP.

Většina selhání spadá do následujícího krátkého seznamu:

PříznakPravděpodobná příčinaŘešení
RTNETLINK answers: File existsKořenový qdisc je již nakonfigurovántc qdisc del dev eth0 root nejprve
Pravidla se uplatňují, ale provoz není omezenNesprávné rozhraní nebo je stále zapnuto TSO/GSOOvěřte pomocí ip link show, deaktivujte offloady pomocí ethtool -K
Filtr se nikdy neshodujeChybná syntaxe portu/IP nebo nesprávné zarovnání maskyPřidejte protiopatření a zkontrolujte počet zásahů v tc -s filter show
Pravidla zmizela po restartuKonfigurace je uložena pouze v pamětiZabalte do skriptu a vyvolejte ze systemd nebo dispečera NetworkManager
Vysoká latence u prioritního provozuChybí leaf qdisc nebo je burst příliš nízkýPřipojte fq_codel k třídám leaf, zvýšit burst

Pokud se někdy kvůli nesprávné konfiguraci zablokujete, reset je jednoduchý:

tc qdisc del dev eth0 root

tc nemůžete vytvořit šířku pásma, kterou nemáte, ale na dobře dimenzovaném uplinku to znamená rozdíl mezi předvídatelným výkonem a serverem, který se zhroutí v okamžiku, kdy jeden nájemce spustí velký přenos. Pokud potřebujete surovou šířku pásma a svobodu ji tvarovat, jak se vám zlíbí, podívejte se na dedikované servery FDC.

Blog

Tento týden byly představeny

Další články
Návod k programu iperf3: Testování rychlosti sítě v systémech Linux a Windows
#bandwidth#server-performance

Návod k programu iperf3: Testování rychlosti sítě v systémech Linux a Windows

Nainstalujte si iperf3, proveďte testy šířky pásma a vyladěte TCP buffery, abyste dosáhli přesných výsledků v systémech Linux a Windows. Zahrnuje testování UDP, obousměrné testy a testy 10GbE+.

10 min čtení - 7. května 2026

#server-performance

Optimalizované profily pro optimalizaci zatížení linuxových serverů

16 min čtení - 9. června 2026

Další články
background image

Máte dotazy nebo potřebujete vlastní řešení?

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení

icon

Flexibilní možnosti

icon

Globální dosah

icon

Okamžité nasazení