Tag Archives: QoS

QoS в Linux: tbf (token bucket filter)

TBF является классовой дисциплиной, предназначенной для шейпинга(shaping) трафика, т.е. подразумевается наличие буфера пакетов, в отличии от полисинга(policing). В Linux дисциплина tbf имеет следующие ключевые возможности: ограничение средней и максимальной скоростей, возможность задания другой дисциплины для управления очередью(буфером пакетов), что позволяет распределить трафик внутри заданной полосы, например с помощью абсолютной приоритезации или честного(fair) распределения потоков.

В самом простейшем случае, алгоритм работы tbf можно представить таким образом:

tbf token bucket
Continue reading

Advertisements

QoS в Linux: pfifo, prio, tc filter, SO_PRIORITY socket

В этой заметке будут рассмотрены две дисциплины – бесклассовая pfifo(самая простая дисциплина в Linux) и классовая prio(абсолютная приоритезация). В отличии от pfifo_fast, дисциплина prio имеет возможность параметризации – задание количества очередей(bands) и priomap(маппинг Linux Priority(LP) в очередь), а также (ввиду того, что prio является классовой дисциплиной) позволяет применить какую-либо другую дисциплину к каждой своей очереди, например для различных очередей можно задать разные значения размера буфера(длины очереди), ограничить по полосе или сделать “справедливое”(fair-queue) распределение трафика между потоками(tcp/udp/icmp-flows) внутри очереди.

С помощью tc filter будет продемонстировано каким образом можно поместить трафик(например, по критерию l4protocol=icmp) в определённый класс(в случае prio, номер класса однозначно соответствует номеру очереди). Кроме того, будет показано как можно устанавливать LP(linux priority) или tc class непосредственно из локального приложения (для языков программирования C и PHP(условно недокументированная возможность)). Continue reading

QoS в Linux: 802.1p, net_prio cgroups

В реальной сети трафик окрашивается тремя способами – IPv4/IPv6 TOS(DSCP), MPLS TC Field (старое название MPLS EXP bits) и 802.1p. Поскольку mpls на текущий момент отсутствует в ванильном ядре, вопрос об окраске mpls-трафика на Linux пока нет смысла рассматривать.

В прошлой заметке было рассказано о том, как linux priority(он же internal priority или skb->priority) может быть использован для приоритезации трафика((!) а не раскраски его). В этой заметке будет рассмотрен вопрос о том, каким образом можно использовать linux priority(далее LP) для установки 802.1p(окраска трафика на втором(ethernet) уровне), а также будет показано как можно установить LP для конкретного локального процесса средством net_prio cgroup(а не с помощью классификации по типу трафика).

Использование 802.1p актуально, как минимум, в двух случаях:
– коммутатор, к которому подключен сервер(или где-то дальше) не умеет учитывать TOS/DSCP
– для раскраски non-IP трафика (например pppoe, arp)
Continue reading

QoS в Linux: поведение по умолчанию: pfifo_fast, mq

Этой заметкой начинается цикл статей на русском языке о QoS в Linux с актуальностью на момент времени 2014Q2. Базовой user space утилитой для управления трафиком является tc(traffic control), документация к которой устарела и содержит неточности. Различные HOWTO в большинстве своём датируются началом 2000-ых годов. Единственным достоверным источником о том как оно работает являются исходники ядра. Предполагается, что читатель владеет такими понятиями как классификация, маркировка, планирование(scheduling).

В качестве linux-дистрибутива будет использоваться Ubuntu 14.04(ядро 3.13.0-24-generic, но в один момент будет заменено на 3.14.1-031401-generic)

В Linux управление трафиком сосредоточено на исходящих интерфейсах, что вполне логично, поскольку напрямую мы не можем влиять на то, сколько трафика приходит на интерфейс; управление входящим трафиком, вообще говоря, может быть осуществлено только косвенно. По отношению к входящему(ingress) трафику тоже можно применять некоторые действия(в основном, policing, т.е. тупое удаление лишнего трафика), но в данной заметке это рассмотрено не будет. В действительности, для применения более сложных методов(чем простое удаление лишнего трафика) по отношению к входящему трафику существует два подхода – использование виртуальных интерфейсов ifb(с перенаправлением входящего трафика на ifb, а с ifb уже на исходящий интерфейс) или управление трафиком на исходящем интерфейсе(второй способ неудобен тем, что может быть два активных исходящих интерфейса и тем, что требуется классификация входящего трафика(в случае ISP, это уметь классифицировать абонента)). Таким образом, достаточно научиться управлять исходящим(egress) трафиком. Continue reading