#server-performance

Linuxi liikluse juhtimine (tc): praktiline juhend

12 min lugemine - 5. juuni 2026

hero section cover

Ribalaiuse kontrollimine, liikluse prioriseerimine ning sissetuleva ja väljamineva liikluse kujundamine Linuxis tc abil. Töötavad HTB-, IFB-, DSCP- ja fq_codel-konfiguratsioonid reaalsete serverite jaoks.

Linuxi liikluse juhtimine (tc): praktiline juhend

Linuxi tc käsu abil saate otseselt kontrollida, kuidas teie server võrguliiklust haldab. Saate piirata ribalaiust teenuse kaupa, tagada interaktiivsete sessioonide (nt SSH) reageerimisvõime ka suurte andmeülekannete tippkoormuse ajal ning kujundada nii väljaminevat kui ka sissetulevat liiklust ühe tööriista abil. Käesolev juhend käsitleb põhimõisteid, toimivat HTB-seadistust, sissetuleva liikluse kujundamist IFB abil, DSCP-põhist prioriteerimist ning veaotsingut, kui midagi ei tööta.


 

Kuidas tc töötab

Iga tc seadistus koosneb neljast liikuvast osast:

  • qdisc (järjekorrakorraldus). Võrguliidesega seotud ajastaja. See otsustab, kuidas pakette järjekorda lisatakse ja sealt eemaldatakse.
  • Klass. Alajaotus klassipõhises qdisc-is. Mõelge sellele kui sõidurajale, millel on oma kiiruspiirang.
  • Filter. Kontrollib pakettide päiseid (IP-aadresse, porte, märgistusi) ja määrab iga paketi klassi.
  • Action. Mida paketiga juhtub, kui see vastab tingimustele: edastamine, kõrvaldamine, ümbersuunamine.

Need moodustavad puu. Paketid sisenevad juur-qdisc'i, läbivad filtrid, sorteeritakse klassidesse major:minor käepideme järgi klassidesse ja jõuavad edastamiseks lehe-qdisci järjekorda.

Kui soovite midagi keerulisemat kui pordipõhine vastavus, märgistage paketid iptables’i või nftables’i abil mangle-tabelis ning kasutage seejärel fw filtrit tc märgistuse järgi klassifitseerimiseks. See skaleerub palju paremini kui toore u32 reeglite ahelamisest iga liiklustüübi jaoks.

Väljaminev vs sissetulev

Suund on oluline. Tuum võib väljaminevaid pakette puhverdada ja viivitada, mis võimaldabki tõelist liikluse kujundamist. Sissetulevad paketid on juba võrgu läbinud, kui te neid näete, seega saate neid ainult kontrollida (kõrvaldada, kui ületavad künnise), kui te neid esmalt IFB-seadmesse ümber ei suuna.

FunktsioonVäljaminevSissetulev
SuundVäljaminevSissetulev
KujundaminePõhinebNõuab IFB-d
JärelevalveToetatudToetatud
Tüüpiline kasutusQoS, ribalaiuse jagamine, andmeedastuse reguleerimineKiiruse piiramine, põhiline DDoS-rünnakute leevendamine

Qdiscid, mida tegelikult kasutate

  • HTB (Hierarchical Token Bucket). Klassipõhine. Kasutage seda, kui soovite tagada igale teenusele minimaalse ribalaiuse, säilitades võimaluse laenata kasutamata võimsust teistest klassidest.
  • TBF (Token Bucket Filter). Klassivaba. Kasutage seda, kui soovite lihtsalt piirata kogu liidese ühe kindla kiirusega.
  • fq_codel (Fair Queuing Controlled Delay). Ühendab voogupõhise õigluse aktiivse järjekorrahaldusega, et vältida bufferbloati. See on olnud vaikimisi qdisc enamikus Linuxi distributsioonides alates systemd 217-st ja on vaikimisi kaasas RHEL 9-s. Ühendage see alati lehe-qdiscina HTB-klasside alla, vastasel juhul võib üks ahne voog kogu klassi enda alla haarata.

tc seadistamine Linuxi serveris

tc on kaasas iproute2 paketiga. Debianis ja Ubuntus installige see käsuga apt-get install iproute2. RHEL-is ja selle derivaatides yum install iproute. Vajate root-õigusi või sudo-õigusi.

Selgitage esmalt välja õige liidese nimi. Liidese valesti nimetamine on kõige levinum põhjus, miks konfiguratsioon vaikimisi midagi ei tee:

ip link show

Kontrollige, mis liidesel juba on, sealhulgas reaalajas loendurid:

tc -s qdisc show dev eth0

Kustutage enne uue konfiguratsiooni rakendamist kõik olemasolevad root-qdisc-id, et vältida RTNETLINK answers: File exists vigu:

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

Kui te ei alusta nullist, vaid uuendate olemasolevat reeglit, kasutage replace asemel add , et tagada muutuste terviklikkus.

Riistvaraline koormuse ülekandmine, nagu TSO ja GSO, koondab pakette viisil, mis segab kujundamist. Lülitage need kujundataval liidesel välja:

sudo ethtool -K eth0 tso off gso off

Määrake fq_codel uute liideste süsteemiülese vaikimisi qdisc-iks:

sysctl -w net.core.default_qdisc=fq_codel

Hõivatud serverite puhul kombineerige seda BBR-i ülekoormuse kontrolli algoritmiga (tuum 4.9+). BBR hoiab läbilaskevõime kõrgena ilma järjekordi pikendamata:

sysctl -w net.ipv4.tcp_congestion_control=bbr

Üks ohutusharjumus, kui konfigureerite kaugseadet SSH kaudu: avage teine sessioon ja hoidke tc qdisc del dev eth0 root valmis kleepimiseks. Vale filtrireegel võib teid koheselt välja lukustada.

Väljamineva liikluse kujundamine HTB abil

HTB võimaldab määrata igale teenusele garanteeritud miinimumi (rate) ja ülempiiri (ceil). Kasutamata ribalaius suunatakse sellele, kes seda vajab, prioriteetide järjekorras. Siin on toimiv kolmetasandiline seadistus 1 Gbps üleslingi jaoks.

Looge juur-HTB qdisc. default 30 saadab kõik klassifitseerimata paketid klassi 1:30 , selle asemel et lasta sellel teie reegleid mööda minna:

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

Piirata koguläbilaskevõimet 900 Mbps-ni. Kujundage läbilaskevõime alati veidi alla tegeliku ühenduse võimsuse, vastasel juhul tekib järjekord ülesvoolu ruuteris või modemis, mida te ei kontrolli:

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

Määrake teenustasemed. Madalamad prio väärtused saavad kasutamata ribalaiuse esimesena:

# 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

Lisage fq_codel iga klassi lehe-qdisc-iks, et üks voog ei saaks oma taset domineerida:

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

Nüüd liigita liiklus. Lihtsa pordi sobitamise puhul u32 on kiireim:

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

Kõigi seisundipõhiste juhtumite puhul märgista iptablesis ja sobi märge kokku 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

Sissetuleva liikluse kujundamine IFB abil

Sissetulevat liiklust ei saa algselt kujundada, sest kui pakett saabub, on see juba teie ribalaiust kasutanud. Lahenduseks on suunata sissetulev liiklus Intermediate Functional Block (IFB) virtuaalse liidese kaudu, kus tuum käsitleb seda väljaminevana ja võimaldab teil rakendada klassipõhiseid qdisc-e.

Laadige moodul ja käivitage liides:

modprobe ifb numifbs=1
ip link set dev ifb0 up

Lisage füüsilisele liidesele sissetuleva liikluse qdisc ja suunake kogu liiklus ümber aadressile 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

Sellest hetkest alates ifb0 käitub see nagu iga teine liides. Rakendage sellele oma HTB-puu täpselt samamoodi, nagu teeksite väljamineva liikluse puhul:

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

Liikluse prioriseerimine DSCP abil

DSCP (Differentiated Services Code Point) märgistab pakette 6-bitise väärtusega TOS-baitis, nii et teie tc filtrid saaksid klassifitseerida märgistuse järgi, selle asemel et reeglistikus pordid üles otsida. DSCP-väärtuse sobitamisel tc, nihutage väärtust 2 bitti vasakule. DSCP EF (46) muutub 0xb8. Mask 0xfc eraldab 6 DSCP-bitti 2 ECN-bitist.

Mõistlik vaikimisi seos serveri töökoormuste jaoks:

Liikluse tüüpDSCPTOS (kuueteistkümnendkood)Näited
InteraktiivneEF0xb8SSH, DNS, VoIP
ÄriAF410x88HTTP, HTTPS, API-d
HulgiCS10x20Varukoopiad, FTP, pakettide uuendused
Parim võimalikCS00x00Kõik muu

Märgi väljaminevad paketid iptablesis enne, kui need jõuavad su tc filtritesse jõudmiseks:

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

Seejärel otsi sildit tc ja suunake see õigesse HTB-klassi:

# 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

Seire ja veaotsing

Kolm käsku, mida kasutate pidevalt:

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

Jälgi dropped ja overlimits loendureid. Kaotatud paketid tähendavad, et järjekord on ülekoormatud; piirmäärade ületamine tähendab, et olete jõudnud klassi ülempiirini ja tuum pidi liiklust edasi lükkama või kõrvaldama. Reaalajas ülevaate saamiseks:

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

lisage -d sisemiste parameetrite (sihtmärk, intervall, kvant) jaoks ning -j JSON-väljundiks, kui suunad andmed mõõdikute kuhja. Kasuta seda koos ss -tin , et näha RTT-hinnanguid ja kordusülekandeid TCP-kihis.

Enamik rikkeid kuulub järgmisse lühikesse nimekirja:

SümptomTõenäoline põhjusLahendus
RTNETLINK answers: File existsRoot qdisc on juba konfigureeritudtc qdisc del dev eth0 root esimene
Reeglid kehtivad, kuid liiklust ei piirataVale liides või TSO/GSO on endiselt sisse lülitatudKinnita käskuga ip link show, lülita maha koormuse ülekandmine käsuga ethtool -K
Filter ei leia kunagi vastetVale pordi/IP-süntaks või maski joondusLisa vastumeede ja kontrolli tabamuste arvu tc -s filter show
Reeglid kaovad pärast taaskäivitamistKonfiguratsioon asub ainult mälusPakenda skriptiks ja kutsu välja systemd või NetworkManageri dispetšeri kaudu
Suur viivitus prioriteetsel liikluselPuudub leaf-qdisc või purske piirang on liiga madalLiita fq_codel leheklassidele, tõsta burst

Kui sa peaksid end kunagi valesti konfigureerides välja lukustama, on taastamine lihtne:

tc qdisc del dev eth0 root

tc ei saa luua ribalaiust, mida sul pole, kuid hästi varustatud üleslingil teeb see vahe, kas jõudlus on ennustatav või server kukub kokku niipea, kui üks klient alustab suurt andmeedastust. Kui vajad toor-ribalaiust ja vabadust seda kujundada just nii, nagu soovid, vaata FDC pühendatud servereid.

Blogi

Sel nädalal esile tõstetud

Rohkem artikleid
iperf3 juhend: võrgu kiiruse testimine Linuxis ja Windowsis
#bandwidth#server-performance

iperf3 juhend: võrgu kiiruse testimine Linuxis ja Windowsis

Paigaldage iperf3, viige läbi ribalaiuse testid ja häälestage TCP-puhvrid, et saada täpseid tulemusi Linuxis ja Windowsis. Hõlmab UDP-, kahesuunalisi ja 10GbE+ teste

10 min lugemine - 7. mai 2026

#server-performance

Linuxi serverite töökoormuse optimeerimiseks häälestatud profiilid

16 min lugemine - 9. juuni 2026

Rohkem artikleid
background image

Kas teil on küsimusi või vajate kohandatud lahendust?

icon

Paindlikud võimalused

icon

Ülemaailmne haare

icon

Kohene kasutuselevõtt

icon

Paindlikud võimalused

icon

Ülemaailmne haare

icon

Kohene kasutuselevõtt