Понятийный минимум
- qdisc (queueing discipline) - правило очереди на интерфейсе.
На каждом интерфейсе ВСЕГДА есть qdisc - по умолчанию
pfifo_fastилиfq_codel. - class - иерархия внутри qdisc (для деления bandwidth между трафиком)
- filter - что в какой class попадает (по портам, IP, маркеру)
Просмотр
tc qdisc show # qdisc на всех интерфейсах
tc qdisc show dev eth0
tc -s qdisc show dev eth0 # -s: со статистикой (bytes, packets, dropped)
tc class show dev eth0
tc filter show dev eth0
netem: симуляция плохой сети
Самый частый use-case для CI / chaos-тестов:
sudo tc qdisc add dev eth0 root netem delay 200ms
sudo tc qdisc add dev eth0 root netem delay 100ms 20ms # +-20ms jitter
sudo tc qdisc add dev eth0 root netem loss 5%
sudo tc qdisc add dev eth0 root netem corrupt 1%
sudo tc qdisc add dev eth0 root netem duplicate 1%
sudo tc qdisc add dev eth0 root netem reorder 25% 50%
# Комбо - сразу несколько эффектов:
sudo tc qdisc replace dev eth0 root netem delay 50ms loss 1%
# Снять:
sudo tc qdisc del dev eth0 root
Проверить эффект - пинговать через интерфейс, смотреть retransmits
в cmd-ss -ti.
tbf: лимит bandwidth
Token Bucket Filter - простой rate-limiter:
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
▸1 Mbit/s outgoing, очередь до 400мс
htb: иерархическое деление полосы
# 100Mbit на интерфейсе, разделено: 70 для класса 1:10, 30 для 1:20
sudo tc qdisc add dev eth0 root handle 1: htb default 20
sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 70mbit ceil 100mbit
sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 100mbit
# Распихать трафик: SSH (port 22) - в premium-класс
sudo tc filter add dev eth0 parent 1: protocol ip prio 1 \
u32 match ip dport 22 0xffff flowid 1:10
Применение к loopback (для тестов)
netem на lo - самый быстрый chaos-тест локально, без подъёма топологии:
sudo tc qdisc add dev lo root netem delay 200ms
ping -c 3 127.0.0.1
▸RTT теперь ~200ms
sudo tc qdisc del dev lo root
Capability
Для всех tc add/del нужен CAP_NET_ADMIN. В контейнерах -
--cap-add=NET_ADMIN.