Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Попадая в коммутатор, пакет помещается в буфер, под него выделяется дескриптор (в дескрипторе написано в каких ячейках памяти (буферах) лежат данные пакета).

Буфер - это ячейки памяти, где лежат байты, из которых состоит пакет. В буфере пакет находится с момента прихода на входной интерфейс до момента выход с коммутатора. 1 буфер = 256 байт. В зависимости от размера пакет занимает разное кол-во буферов.
Если на устройстве включен port jumbo-frame, на 1 дескриптор выделяется до 40 буферов, в зависимости от размера пакета. (MTU 10240)
Если на устройстве выключен port jumbo-frame на 1 дескриптор выделяется до 8 буферов, в зависимости от размера пакета. (MTU 1536)

Дескриптор - это "карточка" со служебной информацией, которая прикреплена к каждому пакету. Там написан его размер, с какого порта пришёл и на какой должен уйти, класс трафика, как его нужно поменять и т.д. Эти данные хранятся в памяти - не в буферной вместе с пакетами, но тоже физически ограниченной.
Если расход буферов зависит от фактического размера пакетов и глобального MTU, то расход дескрипторов зависит от типа трафика (unicast, multicast) и количества портов, на которое нужно его отправить.
Когда через устройство проходят большие unicast пакеты (например, jumbo-frame), то на один дескриптор приходится несколько буферов. Соответственно, в такой ситуации буферы исчерпываются быстрее, чем дескрипторы. Когда чип решает, что пакет нужно отправить на N портов (multicast, broadcast), он аллоцирует (т.е. дополнительно потребляет) N-1 дескрипторов, которые все указывают на одни и те же буферы. Т.е. когда устройство передаёт много мультикаста, то дескрипторы могут исчерпываться быстрее чем буферы. Также дескрипторы выделяются под отзеркалированный трафик (SPAN/RSPAN).
Таким образом, в зависимости от характера трафика в сети (большие пакеты, multicast), узким местом может быть кол-во либо буферов, либо дескрипторов. Из-за этого чип позволяет настраивать лимиты на выходных очередях (qos tail-drop profile) как на буферы (лимит на буферы не настраивается напрямую, а задаётся как лимит дескрипторов с расчётом, что каждый пакет имеет размер MTU) , так и на дескрипторы (команды queue 1 limit xxx, port-limit yyy).

Алгоритм постановки в выходную очередь (Enqueuing) и Tail-Dropping:
В результате обработки чипом пакета дескриптору назначается выходной порт, с которого должно быть передано содержимое соответствующих буферов. На один порт может быть назначена передача бОльшего кол-ва пакетов, чем может обеспечить пропускная способность порта, поэтому дескрипторы выстраиваются в выходные FIFO-очереди. На каждом порту есть 8 очередей, куда дескрипторы помещаются в соответствии со своим TC (Traffic Class) - внутренней хар-кой дескриптора, определяемой на основе различных QoS-механизмов (доверие CoS и DSCP, Policy Map и т.д.). За порядок выбора пакетов из 8-ми очередей на передачу отвечает следующий механизм в конвеере - планировщик (Scheduler), его алгоритмы здесь не рассматриваются.

Т.к. количество дескрипторов и буферов, одновременно выделенных под пакеты, ограничено, то существование выходных очередей создаёт риск исчерпания всех ресурсов, если большое количество трафика будет перенаправляться на один порт и надолго "застревать" в очереди. Это может привести к невозможности аллоцировать дескрипторы или буферы при поступлении новых пакетов на порты устройства (т.н. ошибки ifInDiscards, которые можно посмотреть командой show rmon statistics gigabitethernet 0/xxx). Для противодействия этому существует алгоритм Tail-Dropping (дропов в конце очереди), который выполняется при постановке каждого дескриптора в очередь, и задачей которого является определить - может ли пакет быть поставлен в очередь на отправку или должен быть сразу же отброшен. Алгоритм Tail-Drop'ов представляет собой сравнение счётчиков утилизации дескрипторов и буферов с настроенными порогами в определённом порядке. Существует несколько видов счётчиков и соответствующих им порогов, которые проверяются алгоритмом:

Глобальный счётчик дескрипторов/буферов (на всех портах и очередях). Не настраивается.
Глобальный счётчик multicast/unicast дескрипторов. Не настраивается.
Глобальный счётчик Ingress и Egress зеркалируемых дескрипторов. Настраивается командами qos tail-drop mirror-limit rx aaa и qos tail-drop mirror-limit tx bbb.
Счётчик дескрипторов/буферов на порту (во всех очередях). Настраивается командой port-limit yyy.
Счётчик дескрипторов/буферов в очереди. Настраивается командой queue 1 limit xxx.

В самом простом варианте алгоритма сравнение идёт в том порядке, в котором перечислены счётчики. Если счётчик текущего потребления ресурсов меньше, чем его настроенный порог, то происходит переход к сравнению следующего счётчика. Если хотя бы один счётчик превышает порог - пакет отбрасывается, и увеличивается счётчик Tail Drop'ов на соответствующем порту и очереди. Если все счётчики находятся в пределах настроенных порогов - пакет ставится в выходную очередь.

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

Shared (разделяемые) ресурсы:

В расширенном варианте алгоритма добавляется ещё один глобальный счётчик - т.к. называемые Shared (разделяемые) ресурсы. Он предоставляет пакету "второй шанс" попасть в выходную очередь, если тот вышел за пороги дескрипторов/буферов на порту или очереди (при превышении глобальных счётчиков этого шанса не будет). Если для очереди, в которую ставится пакет, разрешено использование Shared-ресурсов, то производится увеличение Shared-счётчика и сравнение его с порогом разделяемых ресурсов . Таким образом, использование Shared-ресурсов предоставляет дополнительную квоту на постановку определённого кол-ва пакетов в очередь на отправку сверх настроенных порогов (команда queue 1 limit xxx with-sharing/without-sharing). Эта общность дескрипторов/буферов в разных очередях на разных портах также обозначается как "Shared Pool", и ограничена общим порогом на буферы и дескрипторы ("размер Shared Pool'а"). Кол-во дескрипторов, берущихся из Shared Pool, равно кол-ву заданных для порта дескрипторов минус кол-во заданных для очереди дескрипторов.

  • Нет меток