Deficit Round Robin ( DRR ), также Deficit Weighted Round Robin ( DWRR ), является алгоритмом планирования для сетевого планировщика . DRR, как и Weighted Fair Queuing (WFQ), является пакетной реализацией идеальной политики Generalized Processor Sharing (GPS). Он был предложен M. Shreedhar и G. Varghese в 1995 году как эффективный (со сложностью O(1) ) и справедливый алгоритм. [1]
В DRR планировщик, обрабатывающий N потоков [a] , настроен с одним квантом для каждого потока. Эта глобальная идея заключается в том, что в каждом раунде поток может отправить максимум байтов, а оставшиеся, если таковые имеются, передаются в следующий раунд. Таким образом, минимальная скорость, которую поток достигнет в течение длительного периода, равна ; где — скорость соединения.
DRR последовательно сканирует все непустые очереди. Когда выбирается непустая очередь, ее счетчик дефицита увеличивается на свое квантовое значение. Затем значение счетчика дефицита представляет собой максимальное количество байтов, которые могут быть отправлены на этом этапе: если счетчик дефицита больше размера пакета в начале очереди (HoQ), этот пакет может быть отправлен, а значение счетчика уменьшается на размер пакета. Затем размер следующего пакета сравнивается со значением счетчика и т. д. Как только очередь опустеет или значение счетчика окажется недостаточным, планировщик перейдет к следующей очереди. Если очередь пуста, значение счетчика дефицита сбрасывается на 0.
Переменные и константы const integer N // Nb очередей const целое число Q[1..N] // на такт очереди целое число DC[1..N] // Счетчик дефицита на очередь очередь очередь[1..N] // Очереди
Цикл планирования while true do for i in 1..N do if not queue[i].empty() then ДК[i]:= ДК[i] + Q[i] в то время как ( не queue[i].empty() и DC[i] ≥ queue[i].head().size() ) делают DC[i] := DC[i] − очередь[i].head().size() отправить( очередь[i].head() ) очередь[i].dequeue() конец пока если очередь[i].empty() тогда ДК[i] := 0 конец если конец если конец для конца пока
Как и в других алгоритмах планирования, подобных GPS, выбор весов остается за администратором сети.
Как и WFQ, DRR предлагает минимальную скорость для каждого потока независимо от размера пакетов. В циклическом взвешенном планировании доля используемой полосы пропускания зависит от размера пакетов.
По сравнению с планировщиком WFQ, сложность которого составляет O(log(n)) ( n — количество активных потоков/очередей ), сложность DRR составляет O(1) , если квант больше максимального размера пакета этого потока. Тем не менее, эта эффективность имеет свою цену: задержка, т. е. расстояние до идеального GPS, больше в DRR, чем в WFQ. [2] Подробнее о задержках в худшем случае можно узнать здесь. [3]
Реализация алгоритма дефицитного циклического перебора была написана Патриком Макхарди для ядра Linux [4] и опубликована под лицензией GNU General Public License .
В маршрутизаторах Cisco и Juniper реализованы модифицированные версии DRR: поскольку задержка DRR может быть больше для некоторых классов трафика, эти модифицированные версии дают более высокий приоритет некоторым очередям, тогда как другие обслуживаются стандартным алгоритмом DRR. [5] [6]