tc из пакета iproute2 управляет qdisc (queueing discipline) интерфейса — очередью, через которую проходит исходящий трафик перед отправкой в сеть. По умолчанию на большинстве интерфейсов стоит pfifo_fast — обычная очередь без ограничений, пакеты уходят так быстро, как успевает железо.
Самый простой способ срезать полосу — tbf (token bucket filter), чистый шейпер без классов и приоритетов:
tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
rate — целевая скорость, burst — сколько можно пропустить одним всплеском до начала троттлинга, latency — сколько пакет может просидеть в очереди, прежде чем его дропнут. Без burst достаточного размера tbf начинает резать трафик резче, чем кажется на бумаге — токены кончаются быстрее, чем предполагает номинальный rate.
Если нужно не просто урезать всё под одну гребёнку, а поделить полосу на классы (например, гарантировать VoIP-трафику минимум, а остальному отдавать излишки) — htb (hierarchical token bucket):
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k
Класс 1:1 получает гарантированный rate, но может занимать и больше, если соседние классы простаивают — в отличие от tbf, который режет жёстко независимо от того, свободна сеть или нет.
Удалить qdisc и вернуть интерфейс к поведению по умолчанию:
tc qdisc del dev eth0 root
#linux #network
