Планировщик сети

Планировщик сети (англ. network scheduler, также планировщик пакетов, очередь дисциплины (англ. queueing discipline, qdisc), или алгоритм управления очередями) — это арбитр на узле в сети с коммутацией пакетов. Он управляет порядком передачи сетевых пакетов в очередях отправки и приёма стека протоколов и сетевого интерфейсного контроллера. Существуют различные реализации планировщиков сети для операционных систем, использующих многочисленные существующие алгоритмы управления очередями.

Логика планировщика сети определяет, какой сетевой пакет будет передан следующим. Планировщик работает в связке с системой очередей, временно хранящих пакеты до их передачи. В системах может быть как одна очередь, так и несколько, в последнем случае каждая из них может содержать пакеты определённого потока, классификации или приоритета.

В некоторых случаях выполнение всех передач не укладывается в ограничения системы. Тогда задача планировщика — определить, какой трафик передать, а какой подвергнуть сбросу.

Терминология и задачи

Планировщик сети также участвует в реализации механизмов управления сетевым трафиком. Управление трафиком охватывает все меры по снижению перегрузки сети, задержек и потерь пакетов. В частности, активное управление очередями (AQM) предполагает выборочный сброс пакетов для предотвращения чрезмерной перегрузки. Планировщик выбирает, какие пакеты сбросить. Формирование трафика (traffic shaping) сглаживает требования к пропускной способности путём задержки пакетов при пакетировании их в очереди. Планировщик определяет момент передачи каждого пакета. Качество обслуживания (QoS) означает приоритезацию трафика по классу услуги (англ. Differentiated services) или по выделенному соединению (англ. Integrated services).

Алгоритмы

С течением времени было разработано множество дисциплин обслуживания очередей в сети. Каждая из них определяет определённые правила переупорядочивания или сброса пакетов в буферах передачи и приёма[1]. Дисциплины управления очередями обычно применяются для компенсации различных сетевых условий, например, для снижения задержки определённых классов трафика, и часто используются в реализации мер QoS.[2][3][4]

Классовые (classful) дисциплины управления очередями позволяют создавать «классы», подобно ветвям дерева, и настраивать правила, направляющие пакеты в определённые подклассы. В каждом классе могут быть определены и другие классовые или бесклассовые (classless) дисциплины. Бесклассовые дисциплины не позволяют включать внутри себя дополнительные дисциплины[5].

Примеры алгоритмов, применяемых для управления трафиком:

Алгоритмы управления очередями
Алгоритм Аббревиатура Тип Аппаратная поддержка
Алгоритм регулирования скорости ячеек GCRA
Choose and Kill for unresponsive flows CHOKe Бесклассовый
Управление задержкой CoDel Бесклассовый
Усовершенствованный для прикладных задач CAKE
Earliest TxTime First ETF Бесклассовый Да
Первым пришёл — первым обслужен FIFO Бесклассовый
Справедливая очередь FQ Бесклассовый
Справедливая очередь с управлением задержкой FQ-CoDel Бесклассовый
Flow Queuing with Proportional Integral controller Enhanced FQ-PIE Бесклассовый
Генерализованный ранний случайный сброс GRED Бесклассовый
Heavy-Hitter Filter[6] HHF Бесклассовый
Multiqueue Priority MQ-PRIO Бесклассовый Да
Multiqueue MULTIQ Бесклассовый Да
Эмулятор сети[7] NETEM Бесклассовый
Усовершенствованный пропорционально-интегральный контроллер[8] PIE Бесклассовый
Случайный ранний сброс RED Бесклассовый
Стохастический справедливый Blue SFB Бесклассовый
Стохастическое справедливое обслуживание очереди SFQ Бесклассовый
Фильтр пакетной ёмкости TBF Бесклассовый
Основанное на классах управление очередью CBQ Классовый
Справедливая очередь на основе кредита CBS Классовый Да
Дефицитный круговой перебор[9] DRR Классовый
Усиленный выбор передачи ETS Классовый
Иерархическая справедливая кривая обслуживания HFSC Классовый
Иерархический фильтр пакетной ёмкости[10] HTB Классовый
Приоритет PRIO Классовый
Быстрая справедливая очередь[11] QFQ Классовый
Time Aware Priority Shaper TAPRIO Классовый Да

Некоторые из перечисленных алгоритмов реализованы как модули ядра Linux[12][13] и доступны свободно с открытым исходным кодом.

Проблема избыточного буферизации (Bufferbloat)

Bufferbloat — явление в сетях с коммутацией пакетов, при котором чрезмерная буферизация пакетов приводит к высоким задержкам и высокой вариативности задержки. Данной проблеме противодействует планировщик, осуществляющий стратегический сброс пакетов для предотвращения накопления избыточного числа пакетов в буфере. Примеры соответствующих алгоритмов — CoDel, FQ-CoDel и случайный ранний сброс.

Реализации

Ядро Linux

undefined

Планировщик пакетов в ядре Linux — неотъемлемая часть сетевого стека ядра Linux, управляющая буферами передачи и приёма всех сетевых интерфейсов.

Планировщик настраивается утилитой tc (сокр. от traffic control). По умолчанию используется дисциплина управления очередями FIFO под названием pfifo_fast[14], однако начиная с версии 217 systemd меняет дисциплину по умолчанию на fq_codel[15].

Утилиты ifconfig и ip позволяют администраторам настраивать размер буферов через параметры txqueuelen и rxqueuelen для каждого устройства по числу кадров Ethernet; размер фрейма значения не имеет. При этом в сетевом стеке ядра присутствуют и другие буферы, которые не подчиняются планировщику сети.

Классификаторам планировщика могут быть присоединены фильтры Berkeley Packet Filter. Функциональность eBPF, появившаяся в версии 4.1 ядра Linux (2015 год), расширяет классические классификаторы BPF до eBPF[16]. Они могут быть скомпилированы через компилятор LLVM (bpf backend) и загружены в работающее ядро с помощью tc[17].

BSD и OpenBSD

ALTQ — реализация планировщика сети в системах семейства BSD. В OpenBSD, начиная с версии 5.5, ALTQ заменён на HFSC-планировщик.

Планирование в беспроводных сетях с разделяемыми ресурсами (Cell-Free Network Scheduling)

Планировщики в системах связи управляют распределением ресурсов, включая приоритезацию пакетов, временные интервалы передачи и распределение каналов. В современных реализациях для решения сложных задач всё чаще применяются методы искусственного интеллекта. Так, для беспроводных сетей c архитектурой распределённых радиоузлов (cell-free) предложены планировщики на основе нейронных сетей, что позволяет эффективно организовывать взаимодействие между несколькими радиобазовыми точками (RU) и абонентскими устройствами (UE). Такой подход снижает вычислительную сложность при одновременной оптимизации задержки, пропускной способности и распределения ресурсов, что делает его перспективным для сетей стандарта «за пределами 5G».

Примечания

  1. Traffic Control HOWTO: Classless Queuing Disciplines (qdiscs) (англ.). tldp.org. Дата обращения: 15 июня 2024. Архивировано 22 февраля 2014 года.
  2. Traffic Control HOWTO: Components of Linux Traffic Control (англ.). tldp.org. Дата обращения: 15 июня 2024. Архивировано 18 февраля 2014 года.
  3. Traffic Control HOWTO: Traditional Elements of Traffic Control (англ.). tldp.org. Дата обращения: 15 июня 2024. Архивировано 27 мая 2013 года.
  4. Queuing Disciplines: Order of Packet Transmission and Dropping (англ.). tau.ac.il (25 октября 2006). Дата обращения: 15 июня 2024. Архивировано 4 марта 2016 года.
  5. Advanced traffic control - ArchWiki (англ.). wiki.archlinux.org. Дата обращения: 15 июня 2024. Архивировано 22 сентября 2023 года.
  6. Heavy-Hitter Filter qdisc (англ.). kernel.org. Дата обращения: 15 июня 2024. Архивировано 22 февраля 2017 года.
  7. Network emulator Linux kernel network scheduler module (англ.). kernel.org. Дата обращения: 15 июня 2024. Архивировано 22 февраля 2017 года.
  8. Proportional Integral controller Enhanced (PIE) (англ.). kernel.org. Дата обращения: 15 июня 2024. Архивировано 22 февраля 2017 года.
  9. DRR Linux kernel network scheduler module (англ.). kernel.org. Дата обращения: 15 июня 2024. Архивировано 23 февраля 2017 года.
  10. HTB Linux kernel network scheduler module. kernel.org. Дата обращения: 15 июня 2024.
  11. QFQ Linux kernel network scheduler module (англ.). kernel.org. Дата обращения: 15 июня 2024. Архивировано 23 февраля 2017 года.
  12. The Linux kernel network scheduler (англ.). kernel.org (26 декабря 2012). Дата обращения: 15 июня 2024.
  13. tc(8) — руководство по Linux (англ.). man7.org. Дата обращения: 15 июня 2024. Архивировано 7 сентября 2023 года.
  14. Linux Advanced Routing and Traffic Control HOWTO, раздел 9.2.1. pfifo_fast (англ.). lartc.org (19 мая 2012). Дата обращения: 15 июня 2024. Архивировано 21 сентября 2014 года.
  15. systemd System and Service Manager: NEWS file (англ.). freedesktop.org (22 мая 2015). Дата обращения: 15 июня 2024. Архивировано 22 декабря 2014 года.
  16. Linux kernel 4.1, раздел 11. Сетевые технологии (англ.). kernelnewbies.org (21 июня 2015). Дата обращения: 15 июня 2024. Архивировано 16 октября 2015 года.
  17. BPF and XDP Reference Guide (англ.). Cilium documentation web site. Дата обращения: 15 июня 2024. Архивировано 24 апреля 2018 года.