Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
P
Povídání o Linuxu
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Martin Mareš
Povídání o Linuxu
Commits
32a70b1c
Commit
32a70b1c
authored
2 years ago
by
Martin Mareš
Browse files
Options
Downloads
Patches
Plain Diff
Poznámky k traffic control
parent
b5c37237
No related branches found
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
tc.md
+142
-0
142 additions, 0 deletions
tc.md
with
142 additions
and
0 deletions
tc.md
0 → 100644
+
142
−
0
View file @
32a70b1c
# 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
-
umí 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
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment