31 мая 2011 г.

Контроль передачи данных в конвергентных сетях. часть 3

Часть 2 здесь

Давайте сравним методы контроля передачи данных в Fibre Channel и 10GE. Основная из задача – обеспечивать временную остановку передачи данных в случае нехватки входящих буферов портов-получателей. Напомню, что в FC используется механизм контроля счетчиков буферных кредитов. Объединяясь в фабрику, порты коммутаторов обмениваются информацией об общем количестве входных буферов и выставляют соответствующие значения счетчиков буферных кредитов (BB-credits). Отправив пакет, порт декрементирует свой счетчик. Если он обнуляется, отправитель должен остановить передачу. Порт-получатель в свою очередь, обязан явно сообщать о каждой освободившейся ячейке буфера посылкой слова-примитива Receiver Ready (R_RDY), Получив R_RDY, порт получатель инктеменитует значение BB credits.
Такой механизм гарантирует, что порты отправитель и получатель всегда имеют точную информацию о количестве свободных буферов на другом конце линка.


Очень важно отметить, что R_RDY является не FC фреймом (с заголовком, payload, CRC и т. д.), а 4byte (40bit) словом, т. е. объектом минимального размера, допустим для передачи по протоколу Fibre Channel. Соответственно, с точки зрения утилизации каналов накладные расходы контроля передачи данных практически не заметны.

Однако у каждой медали есть обратная сторона. Время между отправкой фрейма и получением сигнала R_RDY сильно зависит от расстояния между портами. Чем больше расстояние, тем дольше отправитель должен ждать инкрементации BB Credits. А это, в случае нехватки кредитов, приводит к задержкам передачи данных и падению загрузки линка.


На приведенном графике значение длины линка, при котором начинается падение утилизации канала, зависит от скорости передачи (Transfer Rate) и количества входных буферов. Увеличение количества доступных входных буферов, приводит к тому, счетчик буферных кредитов обнулится на больших расстояниях. Соответственно, точка перегиба на графике сдвигается вправо.


Давайте теперь рассмотрим протокол Ethernet. Он не имеет примитивов и предусматривает передачу данных в сети только фреймами. Минимальный размер фрейма 64bytes. Если бы в этом протоколе контроль передачи данных был реализован таким же образом, как и в FC, он был бы в 16 раз менее эффективным. Поэтому и был выбран другой метод. Вместо того чтобы постоянно сообщать о количестве свободных буферов, устройства в Ethernet явно сообщают только о событии, когда их не хватает. Таким образом, существенно экономится пропускная способность каналов.


Главным недостатком этого механизма является то, что как и в Fibre Channel, общая эффективность контроля передачи данных заметно падает с увеличением длины линка. Утилизация длинных линков становится низкой.


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


На самом деле это выбор без выбора, ведь с отключением Flow Control появится вероятность потери фреймов, что для трафика FCoE совершенно не приемлемо. Поэтому производители увеличивают количество буферных ячеек. На данный момент Cisco повысила максимальную длину линков между своими коммутаторами с 300м. до 3км. (NX-OS 5.0(2)N1.1).

  • Nexus 55xx - Nexus 55xx – 3км.
  • Nexus 50x0 - Nexus 50x0 - 3 км.
  • Nexus 50x0 - Nexus 55xx - 3 км.
  • Nexus 55xx - Nexus 2232 – 300м.
  • Nexus 50x0 - Nexus 2232 – 300м.

Brocade, вроде, пока ограничивает длину линков 300м.

18 мая 2011 г.

Контроль передачи данных в конвергентных сетях. часть 2

Часть 1 здесь
Использовалась статья Cisco

Итак, мы остановились на том, что чем длиннее кабель, тем раньше должна быть передана пауза. Насколько раньше? Для того чтобы не потерять ни одного фрейма данных, “запаса” свободных буферов должно быть достаточно для сохранения всех фреймов которые будут посланы, пока PAUSE дойдет до отправителя и будет им обработана. Пороговое значение количества свободных буферов, при котором высылается пауза должно быть установлено, учитывая следующие факторы:
  • Обмен данными возможен в обоих направлениях. Если порт получатель уже начал передавать какой-то пакет, то прерывать эту передачу для того, чтобы послать PAUSE не разумно. Поэтому будет задержка, достаточная для передачи данных объемом MTU-1bit (рассматриваем самый худший случай). Напоминаю, MTU = Maximum Transmission Unit. Так как MTU для различных CoS может быть разным, нужно брать максимальный.

  • Скорость распространения электромагнитного сигнала в меди составляет около 70% от скорости в вакууме. В оптическом кабеле она еще чуть меньше и составляет 65%. Поэтому каждые 100м. кабеля добавляют 476нс. (медь) или 513нс. (оптика) задержки. За время пока PAUSE путешествует по 100м. кабелю, порт-отправитель на 10Gbps передаст 641byte (берем худший случай более медленной оптики). А так как на момент отправки PAUSE по кабелю к получателю уже передавались какие-то данные, этот объем надо удвоить. Округленно получаем 1300bytes на каждые 100м.

  • При получении PAUSE порт получатель должен ее обработать и подать команду на остановку трафика. Протокол PFC предписывает это сделать не более чем за 60 квантов времени (кванты обсуждались в предыдущем посте), что эквивалентно передаче 512bits * 60 квантов = 3840bytes.


  • После того, как послана команда на остановку трафика, необходимо все-таки дождаться, пока пакет, который уже начался передаваться, полностью уйдет. Соответственно, опять будет задержка, достаточная для передачи данных объемом MTU-1bit (самый плохой случай). причем здесь должно приниматься во внимание MTU только CoS FCoE.



Суммарно, мы получаем постоянную задержку, эквивалентную 9216bytes (максимальное MTU Ethernet) + 3840bytes + 2240bytes (максимальное MTU FCoE) = 15296bytes, а также задержку, 1300bytes на каждые 100м. кабеля. На максимально допустимой в данный момент длине кабеля 300м. мы получим задержку эквивалентную 15296bytes + 3 * 1300bytes = 19196bytes.

Есть еще один момент, о котором не стоит забывать. Он заключается в том, что буферная память организована не как единое непрерывное хранилище данных, а виде отдельных ячеек или блоков. Размеры этих ячеек зависят от конкретной модели устройств. Так, Cisco в своих коммутаторах Nexus 5000 и экстендерах Nexus 2000 они составляют 160bytes и 80bytes соответственно.

Ethernet фрейм минимального размера 64bytes в буферах Nexus 5000 будет занимать всего 40% объема ячейки. А так как неиспользованная память в ячейках применяться для хранения других данных уже не может, оставшиеся 96bytes просто пропадают.


Итак, в самом худшем случае фреймов 64bytes мы имеем 60% накладные расходы на использованный объем буферной памяти. Наши 19196bytes поместятся в 300 пакетов размером 64bytes. Это, в свою очередь, приведет к использованию 300 * 160bytes = 48000bytes буферной памяти (около 1/10 от общего объема памяти в Nexus 5000).

Итак, в рассмотренном конкретном примере, пороговое значение, при котором высылается PAUSE на передачу FCoE, равно 300 буферных ячеек. Использование функциональности lossless Ethernet с другими сетевыми протоколами, например iSCSI, за счет снижения количества ретрансмитов данных дает дополнительные преимущества производительности. Однако, стоит учитывать, что в этом случае пороговое значение паузы будет еще выше. В случае Cisco Nexus 5000 оно будет равно 409 буферных ячеек.

В данный момент Cisco NX-OS поддерживает PFC только до 3 CoS:
  • 1x FCoE (mini Jumbo MTU 2240bytes)
  • 1x сетевой трафик с jumbo MTU 9216bytes
  • 1x сетевой трафик со стандартным MTU 1500bytes
Часть 3 здесь...

    16 мая 2011 г.

    Контроль передачи данных в конвергентных сетях. часть 1

    Использовалась статья Cisco

    Традиционный протокол Ethernet изначально разрабатывался для передачи данных по ненадежным носителям. Он совсем не гарантирует того, что все посланные пакеты данных будут обязательно получены соответствующими устройствами.

    Одной из причин ненадежности Ethernet заключается в отсутствии обратной связи между получателем данных и их отправителем. Проблема особенно критична в сетях с большим количеством хопов (hops). Часто бывает так, что отправитель передает данные с большей скоростью, чем получатель их обрабатывает. Это приводит к тому, что входные буферы получателя быстро заполняются (buffer overflow), а новые пакеты, которые хранить уже негде, просто отбрасываются (drop). Причем, никакого уведомления об этом отправитель не получает.

    В сетях передачи данных такая ситуация не является критичной. Обнаружив, что каких-то Ethernet фреймов не хватает (drop detection), протоколы сетевого (3) уровня просят переслать их заново. Получив недостающие пакеты, эти протоколы их упорядочивают (in-order) и передают выше по стеку.

    Ситуация значительно хуже в сетях хранения данных. Протокол Fibre Channel не осуществляет ретрансмиссию только отдельных фреймов (так же, как и не допускают доставку пакетов в неправильной последовательности - out of order delivery). В случае обнаружения потери части фреймов, устройствам приходится передавать заново всю последовательность (sequence). Естественно, это приводит к катастрофическому падению производительности.

    Для того, чтобы избежать возможность потери фреймов в связи с переполнением входных буферов принимающих устройств, реализован специальный механизм контроля передачи данных (flow control). В “чистом” Fibre Channel этот механизм работает на уровне FC2. Он построен на первоначальном обмене информацией о количестве имеющихся в наличии входных буферов, дальнейшем уменьшении значений счетчиков буферных кредитов (BB credits) при отправке данных и их инкрементации при получении от порта-соседа коротких сообщений R_RDY об освобождении буферов. Подробнее в 3 части.

    В конвергентных сетях на базе 10Gbps Ethernet при передаче FCoE трафика мы также обязаны использовать контроль передачи данных. Однако там для этого используется совсем другой подход. Порт-получатель данных постоянно следит за количеством своих свободных буферов. Как только он видит, что их количество достигает некого минимального уровня, порту-отправителю посылается специальный (MAC control frame) фрейм PAUSE, уведомляющий о необходимости на какое-то время приостановить передачу всех данных. Однако, такой подход не является оптимальным, так как в конвергентных сетях остановка FCoE трафика не должна приводить к задержке передачи данных других сетевых протоколов.
    Поэтому механизм контроля передачи данных на базе PAUSE расширен функциональностью PFC (Priority Flow Control). Различным протоколам назначаются соответствующие классы сервиса (Classes of Services, CoS). Значение CoS передается в одном из полей VLAN-тега пакетов (VLAN tag). Контроль передачи осуществляется независимо для каждого из 8x возможных CoS. Структура пакетов не использующих и использующих PFC показана на рисунке.



    Продолжительность паузы для каждого CoS определена в соответствующем 2byte поле количеством квантов времени. Один квант представляет собой время, необходимое для передачи 512bits данных на текущем Transfer Rate (в данном случае 10Gbps). Значение ноль принудительно снимает передачу данных с паузы.
    Насколько я понял, в данный момент коммутаторы Cisco не пытаются интеллектуально подходить к определению необходимой продолжительности паузы. Вместо этого выставляется очень большое значение PAUSE, а затем явным образом снимается контрольным фреймом со значением 0. Как это работает у других, я не знаю.

    Для того, чтобы установить паузу на передачу данных, порт получатель должен сгенерить управляющий фрейм, передать его по кабелям в виде оптического или электрического сигнала (ох, как я всем надоел своими сетованиями на то, что скорость распространения электромагнитной волны в нашей Вселенной такая маленькая ;) ), после чего этот фрейм должен быть обработан отправителем. Все это происходит отнюдь не мгновенно. Поэтому получатель должен постоянно следить за своими буферами и заранее (!) отправлять PAUSE, предполагая скорое переполнение своих буферов. Чем длиннее кабель, тем раньше должна быть передана пауза.

    Часть 2 здесь...

    6 мая 2011 г.

    Заполнители в FC

    Мой старый приятель и бывший коллега Юра Яворский описал интересный случай из практики траблшутинга SAN. С согласия Юры (большое спасибо!) делюсь с вами.

    "Столкнулся недавно с интересной особенностью при настройке оборудования у клиента. Система хранения IBM (LSI) ни в какую не виделась коммутатором Brocade, а инициаторы работали нестабильно, т.е. порты коммутатора то "видели" их, то нет. Ошибка явно была связана с потерей синхронизации в линке. Причем ручные настройки портов ни к чему не приводили. Оказалось, что в новых версиях прошивки FOS значения примитивов заполнителей на каждом порту по умолчанию стоят в ARB. Помогает в этой ситуации смена значения на IDLE при помощи команды portCfgFillWord. Смена значения по умолчанию производителем тоже была не случайна. Дело в том, что по стандарту FC-FS-3 действительно должен использоваться примитив ARBff. Вот выдержка из указанного стандарта:

    10.3.5 Emission Lowering Protocol
    An FC-0 standard (e.g., FC-PI-3) may specify the use of Emission Lowering Protocol when using the 8B/10B transmission code.
    When Emission Lowering Protocol is used, the Fill Word shall be the ARBff Ordered Set.
    When Emission Lowering Protocol is not used, the Fill Word shall be the Idle Ordered Set.

    Причина кроется в интерференции волн при использовании слов заполнителей IDLE. Таким образом на частотах 8,5GHz использование ARBff строго рекомендовано. Источники ниже:


    Почему же порты некоторых оконечных устройств продолжают работать в несовместимом формате? Ответ думаю прост – несоблюдение стандартов. Хотя вопрос может быть тонким и рекомендация все равно остается рекомендацией. Поэтому именно для возможности гибкой настройки примитивов в FOS и была добавлена команда portCfgFillWord."

    Я честно говоря не предполагал, что использование ARB дает заметные преимущества еще и с точки зрения уменьшения EMI (в документах по ссылкам даны графики). Интересно.

    На всякий случай напомню, что изначально примитивы ARB() применялись только для арбитража доступа устройств в топологии FC_AL. Однако Brocade нашла еще одно применение для них. Они используются для идентификации Virtual Channels (VC). Коммутатор следит за адресом AL_PA заполнителя ARB(). Фрейм, идущий за ARB() с неким AL_PA, считается принадлежащим соответствующему VC. Соответствие AL_PA и номера виртуального канала показано в таблице.

    Тип порта
    Кол-во
    VC
    VC
    Приоритет
    AL_PA
    Описание
    F
    1
    VC7
    2 или 3 (по умолчанию 3)
    0xda
    Подключение к N-порту
    FL
    1
    VC7
    2 или 3 (по умолчанию 3)
    0xda
    Подключение к NL-порту
    E
    FC_SW2
    1
    VC0
    0
    0xef
    Подключение к E-порту в режиме совместимости (InterOp)
    E
    8
    VC0
    0
    0xef
    Служебный трафик (класса F)
    VC1
    1
    0xe8
    Служебный трафик (F_BSY и F_RJT, опционально контроль линка трафика класса 2)
    VC2
    2 или 3 (по умолчанию 2)
    0xe4
    Данные оконечных устройств (класса 2 или 3)
    VC3
    2 или 3 (по умолчанию 2)
    0xe2
    Данные оконечных устройств (класса 2 или 3)
    VC4
    2 или 3 (по умолчанию 2)
    0xe1
    Данные оконечных устройств (класса 2 или 3)
    VC5
    2 или 3 (по умолчанию 2)
    0xe0
    Данные оконечных устройств (класса 2 или 3)
    VC6
    2 или 3 (по умолчанию 3)
    0xdc
    Multicast трафик (класса 3)
    VC7
    2 или 3 (по умолчанию 3)
    0xda
    Multicast и broadcast трафик (класса 3)
    C
    17



    Используется только при прямом соединении ASIC Condor друг с другом.