Продолжаю вещать на тему прояснения основных представлений об FC SAN. В комментариях к первому посту меня попрекнули тем, что копнул недостаточно глубоко. В частности — мало сказал о непосредственно FC и ничего о BB credits, IP и multipathing. Multipathing и IP — темы для отдельных публикаций, а про FC, пожалуй, продолжу. Или начну, как посмотреть.
Для начала, небольшое терминологическое отступление (навеянное опять же комментарием к предыдущему посту).
Fibre or Fiber?: Изначально технология Fibre Channel предполагала поддержку только волоконно-оптических линий (fiber optic). Однако, когда добавилась поддержка меди, было принято решение название в принципе сохранить, но для отсылки на стандарт использовать британское слово Fibre. Американское Fiber сохраняется преимущественно для отсылки на оптоволокно.
ОригиналFibre Channel was originally designed to support fiber optic cabling only. When copper support was added, the committee decided to keep the name in principle, but to use the UK English spelling (Fibre) when referring to the standard. The US English spelling (Fiber) is retained when referring generically to fiber optics and cabling.
IBM Redbook «Introduction to SAN and System Networking»
Начало
По аналогии с сетевой моделью OSI, Fibre Channel состоит из пяти уровней. Каждый уровень обеспечивает определённый набор функций.
FC-0 — уровень физических интерфейсов и носителей. Описывает физическую среду: кабели, коннекторы, HBA, трансиверы, электрические и оптические параметры.
FC-1 — уровень передачи и кодирования. Здесь описывается как данные будут кодироваться перед передачей и декодироваться после. На этом уровне определяются три основные функции:
FC-2 — уровень кадрирования и сигналов. Определяет структуру и организацию передаваемой информации, а также контроль и управление её передачей. Функции, осуществляемые на этом уровне:
- Кадрирование (определение структуры кадра / фрейма).
- Управление последовательностями (Sequence management)
- Управление обменом (Exchange management)
- Класс обслуживания (Class of Service)
- Управление потоком (Flow control)
FC-3 — уровень базовых служб. Уровень заложен, для новых функций, которые могут быть внедерены в Fibre Channel в будущем. На этом уровне обеспечивается шифрование и сжатие данных перед отправкой, а также такие вещи как расщепление потока данных (striping) по нескольким путям. Но я не сталкивался с реализациями таких штук пока.
FC-4 — уровень отображения протоколов. Описывает протоколы, которые могут использовать FC в качестве транспорта и, собственно, порядок использования (маппинг этих протоколов на нижние уровни FC0-3). Применительно к SAN это могут быть:
- Fibre Channel Protocol for SCSI-3 (SCSI-FCP) — проброс SCSI
- Fibre Channel Link Encapsulation (FC-LE) — проброс TCP/IP
А теперь подробнее об этих и других непонятных словосочетаниях. В данной статье рассмотрим только нижние три уровня, как наиболее значимые при создании и управлении инфраструктурой FC SAN.
FC-0
Я, пожалуй не буду приводить сложных таблиц разновидностей кабелей, передатчиков и их характеристик. Во-первых, потому что неудобно тут вставлять таблицы, во-вторых, потому что эти таблицы есть везде, где хоть что-то написано про FC (русская википедия, нерусская википедия), в-третьих (и ключевое), — на мой взгляд, главное понять суть, а справочные данные найти не проблема.
А суть в том, что есть два типа волокна: многомодовое и одномодовое.
Многомодовое (Multimode Fiber, MMF) — относительно широкое в сечении (50-62,5 микрон), предназначенное для коротковолновых лазерных лучей. «Многомодовое» значит, что свет по каналу может проходить разными путями — множественно отражаясь от стенок волокна. Это делает кабель менее чувствительным к перегибу, но снижает силу и качество сигнала, что ограничивает данный тип только небольшими дистанциями — до 500 м.
Одномодовое (Singlemode Fiber, SMF) — волокно малого диаметра (8-10 микрон), сигнал по которому передаётся длинноволновым лазером, свет которого не виден человеческому глазу. Тут свет может перемещаться единственным путём — по прямой, соответственно сигнал передаётся быстрее и точнее, но оборудование для обеспечения такого рода сигналов стоит значительно дороже, так что используется, в основном, для связи на больших расстояниях (до 50 км). К перегибам и вообще любым искривлениям одномодовое волокно куда чувствительнее.
Тут рядом есть более подробная статья про типы волокна.
Стоит иметь ввиду, что для соединения двух устройств используется два кабеля. Один используется для передачи, другой для приёма. Потому важно подключить их корректно (Tx одной стороны к Rx другой).
Отдельно хочу упомянуть про такой термин как тёмная оптика (dark fiber). Сей термин не значит, что она как-то специальным образом тонирована. Это просто выделенные оптические линии связи, как правило, для связи на больших расстояниях (между городами или далеко отстоящими зданиями), которые берутся в аренду, и для использования которых не требуется дополнительное оборудования усиления сигнала (его обеспечивает владелец). Однако, так как это просто оптический кабель, отданный в ваше полновластное распоряжение, до тех пор пока вы не пустите по нему свой световой сигнал, он остаётся «тёмным».
Плавный переход от FC-0 к FC-1 и обратно обеспечивает ASIC — элемент таких устройств как HBA, дисковых массивов и коммутаторов.
Из Википедии:
ASIC (аббревиатура от англ. application-specific integrated circuit, «интегральная схема специального назначения») — интегральная схема, специализированная для решения конкретной задачи. В отличие от интегральных схем общего назначения, специализированные интегральные схемы применяются в конкретном устройстве и выполняют строго ограниченные функции, характерные только для данного устройства; вследствие этого выполнение функций происходит быстрее и, в конечном счёте, дешевле. Примером ASIC может являться микросхема, разработанная исключительно для управления мобильным телефоном, микросхемы аппаратного кодирования/декодирования аудио- и видео-сигналов (сигнальные процессоры).
В оборудовании Fibre Channel ASIC состоит из следующих функциональных элементов:
- Encoder / Decoder — обеспечивает кодирование каждых 8 бит передаваемых данных в 10-битное представление. И декодирование обратно принимаемых данных.
- SERDES (Serializer / Deserializer) — преобразует параллельный поток 10-битных порций данных в последовательный поток 10-битных порций данных.
- Transceiver — преобразует электрические импульсы в световые сигналы.
ASIC
Transceivers, трансиверы или SFP — в случае FC-коммутаторов это отдельные модули, необходимые для подключения кабеля к порту. Различаются на коротковолновые (Short Wave, SW, SX) и длинноволновые (Long Wave, LW, LX). LW-трансиверы совместимы с многомодовым и одномодовым волокном. SW-трансиверы — только с многомодовым. И к тем и к другим кабель подключается разъёмом LC.
Есть ещё SFP xWDM (Wavelenght Division Multiplexing), предназначенные для передачи данных из нескольких источников на дальние расстояния единым световым пучком. Для подключения кабеля к ним используется разъём SC.
FC-1
8/10 и 64/66
Первое, что происходит на этом уровне — кодирование / декодирование информации. Это довольно мудрёный процесс, в ходе которого каждые 8 бит поступающей информации преобразуются в 10-битное представление. Делается это с целью повышения контроля целостности данных, отделения данных от служебных сигналов и возможности восстановления тактового сигнала из потока данных (сохранение баланса нулей и единиц).
Это ведёт к заметному снижению полезной пропускной способности, ибо как можно подсчитать, 20% потока данных является избыточной служебной информацией. А ведь кроме всего прочего, немалую часть этого потока может занимать служебный трафик.
Однако хорошая новость в том, что кодирование 8/10 используется в оборудовании 1G, 2G, 4G и 8G. В части реализаций 10G и начиная с 16G кодирование осуществляется по принципу 64/66, что существенно увеличивает полезную нагрузку (до 97% против 80% в случае 8/10).
Ordered sets
В русской википедии этот термин переведён как "упорядоченные наборы". В то время как на мой взгляд, слово order тут стоит понимать не в значении «порядок», а в значении «приказ, команда».
Для начала стоит упомянуть ещё один термин, используемый в контексте FC — transmission word — минимальная порция данных для передачи, равная 4 байтам. Если передаваемая информация меньше по объёму, то transmission word дополняется специальными заполняющими байтами (fill bytes), которые вырезаются на приёмнике.
Так вот, ordered sets — это специальные служебные transmission words. Делятся на три категории:
- Разделители фреймов (Start-of-Frame, SOF и End-of-Frame, EOF).
- Два базовых сигнала — IDLE (порт готов принимать или передавать данные) и R_RDY (receiver ready — порт освободил буфер для приёма очередной порции данных)
- Базовые последовательности (primitive sequences):
- NOS (Not Operational) — порт обнаружил разрыв / отсутствие соединения
- OLS (Offline State) — порт инициирует установление соединения, или порт получил NOS, или порт переходит в состояние off-line
- LR (Link Reset) — инициализация сброса соединения. Отправляется в случае получения OLS или каких-то ошибок приёма-передачи (как правило, на уровне Flow Control). Отправивший порт очищает свои буферы и их счётчики
- LRR (Link Reset Response) — ответ на LR. Отправивший порт очищает свои буферы и их счётчики
Инициализация соединения (Link initialization)
При установлении физического соединения между портами A и B, между ними происходит следующий «обмен веществ»:
FC-2
Фреймы (Кадры, Frames)
Все данные, передаваемые в среде Fiber Channel разбиваются на фреймы (кадры). Структура фрейма следующая:
- SoF — 4 байта (1 tw) — идентификатор начала фрейма.
- Header — 24 байта (6 tw) — заголовок. Содержит такую информацию как адрес источника и приёмника, тип фрейма (FT-0 — управляющий или FT-1 — данные), номер последовательности и порядковый номер фрейма в ней и прочая служебно-контрольная информация.
- Data — 0-2112 байт (0-528 tw) — непосредственно данные (например, SCSI-команды).
- CRC — 4 байта (1 tw) — контрольная сумма.
- EoF — 4 байта (1 tw) — идентификатор конца фрейма.
Промежутки между фреймами заполняются специальными «заполняющими словами» — fill word. Как правило, это IDLE, хотя начиная с FC 8G было стандартизовано использование ARB(FF) вместо IDLE, в целях снижения электрических помех в медном оборудовании (но по-умолчанию коммутаторами используется IDLE).
Последовательности (Sequences)
Чаще всего источник стремится передать приёмнику гораздо больше информации, чем 2112 байт (максимальный объём данных одного фрейма). В этом случае информация разбивается на несколько фреймов, а набор этих фреймов называется последовательностью (sequence). Чтобы в логическую последовательность фреймов не вклинилось что-то лишнее при параллельной передаче, заголовок каждого фрейма имеет поля SEQ_ID (идентификатор последовательности) и SEQ_CNT (номер фрейма в последовательности).
Обмен (Exchange)
Одна или несколько последовательностей, отвечающих за какую-то одиночную операцию, называется обменом. Источник и приёмник могут иметь несколько параллельных обменов, но каждый обмен в единицу времени может содержать только одну последовательность. Пример обмена: инициатор запрашивает данные (последовательность 1), таргет возвращает данные инициатору (последовательность 2) и затем сообщает статус (последовательность 3). В этот набор последовательностей не может вклиниться какой-то посторонний набор фреймов.
Для контроля этого процесса заголовок каждого фрейма включает поля OX_ID (Originator Exchange ID — заполняется инициатором обмена) и RX_ID (Responder Exchange ID — заполняется получателем в ответных фреймах, путём копирования значения OX_ID).
Классы обслуживания (Classes of Services)
Различные приложения предъявляют разные требования к уровню сервиса, гарантии доставки, продолжительности соединения и пропускной способности. Некоторым приложениям требуется гарантированная пропускная способность в течение их работы (бэкап). Другие имеют переменную активность и не требуют постоянной гарантированной пропускной способности канала, но им нужно подтверждение в получении каждого отправленного пакета. Для удовлетворения таких потребностей и обеспечения гибкости, FC определяет следующие 6 классов обслуживания.
Class 1
Для этого класса устанавливается выделенное соединение, которое резервирует максимальную полосу пропускания между двумя устройствами. Требует подтверждения о получении. Требует чтобы фреймы попадали на приёмник в том же порядке, что вышли из источника. Ввиду того, что не даёт другим устройствам использовать среду передачи, используется крайне редко.
Class 2
Без постоянного соединения, но с подтверждением доставки. Не требует соответствия порядка отправленных и доставленных фреймов, так что они могут проходить через фабрику разными путями. Менее требователен к ресурсам, чем класс 1, но подтверждение доставки приводит к повышенной утилизации пропускной способности.
Class 3
Без постоянного соединения и без подтверждения доставки. Самый оптимальный с точки зрения использования ресурсов фабрики, но предполагает, что протоколы верхних уровней смогут собрать фреймы в нужном порядке и перезапросить передачу пропавших фреймов. Наиболее часто используемый.
Class 4
Требует постоянного соединения, подтверждение и порядок фреймов как и класс 1. Главное отличие — он резервирует не всю полосу пропускания, а только её часть. Это гарантирует определённое QoS. Подходит для мультимедиа и Enterprise-приложений, требующих гарантированного качества соединения.
Class 5
Ещё до конца не описан и не включен в стандарт. Предварительно, класс, не требующий соединения, но требующий немедленной доставки данных по мере их появления, без буферизации на устройствах.
Class 6
Вариант класса 1, но мультикастовый. То есть от одного порта к нескольким источникам.
Class F
Класс F определён в стандарте FC-SW для использования в межкоммутаторных соединениях (Interswitch Link, ISL). Это сервис без постоянного соединения с уведомлениями о сбое доставки, использующийся для контроля, управления и конфигурирования фабрики. Принцип похож на класс 2, но тот используется для взаимодейтсвия между N-портами (порты нод), а класс F — для общения E-портов (межкоммутаторных).
Flow Control
В целях предотвращения ситуации, когда отправитель перегрузит получателя избыточным количеством фреймов так, что они начнут отбрасываться получателем, FC использует механизмы управления потоком передаваемых данных (Flow Control). Их два — Buffer-to-Buffer flow control и End-to-End flow control. Их использование регламентируется классом обслуживания. Например, класс 1 использует только механизм End-to-End, класс 3 — Buffer-to-Buffer, а класс 2 — оба эти механизма.
Buffer-to-Buffer flow control
Принцип технологии — кредит в каждый дом отправка любого фрейма должна быть обеспечена наличием кредита на отправку.
Все поступающие на вход порта фреймы помещаются в специальную очередь — буферы. Количество этих буферов определяется физическими характеристиками порта. Один буфер (место в очереди) соответствует одному кредиту. Каждый порт имеет два счётчика кредитов:
TX BB_Credit — счётчик кредитов передачи. После отправки каждого фрейма, уменьшается на 1. Если значение счётчика стало равным нулю — передача невозможна. Как только от порта-приёмника получено R_RDY, счётчик увеличивается на 1.
RX BB_Credit — счётчик кредитов приёма. Как только фрейм принят и помещён в буфер, уменьшается на 1. Когда фрейм обрабатывается или пересылается дальше, счётчик увеличивается на 1, а отправителю отправляется R_RDY. Если значение счётчика падает до 0, то в принципе, приём новых фреймов должен быть прекращён. На практике, из-за ошибок синхронизации кредитов может возникнуть ситуация, что источник прислал ещё один-несколько фреймов уже после того как RX BB_credit стал равен нулю. Данная ситуация называется buffer overflow. В большинстве реализаций порт обрабатывает такие ситуации «по-доброму» — за счёт резервных буферов. Хотя некоторое оборудование в таких случаях может сынициировать Link Reset.
Отсюда исходит сильное влияние расстояния между портами на производительность. Чем выше расстояние и больше пропускная способность, тем больше фреймов будет отправлено (читай кредитов передачи потрачено) ещё до того как получатель получит хотя бы первый. Ситуацию облегчает особенность архитектуры FC-коммутаторов. Дело в том, что количество буферов не закреплено жёстко за каждым портом (кроме восьми обязательных), а является общим для всех. И в случае определения «дальних линков» (автоматически или вручную) количество выделяемых коммутатором буферов для этого порта увеличивается. Другой плюс общей памяти — не требуется гонять буферы от одного порта к другому внутри коммутатора.
End-to-End flow control
Реализуется счётчиком EE_Credit, который определяет максимум фреймов, которые источник может отправить приёмнику без получения подтверждения (Acknowledge, ACK). В отличие от BB_Credit распространяется только на фреймы с данными, а обмен/учёт происходит между конечными нодами.
Конец
Изначально мне казалось, что статья будет раза в два меньше, но в ходе написания всплыло много деталей, без которых счастье казалось не полным. Ещё кучу вещей, которые хотелось бы осветить, пришлось пока отбросить — процесс написания грозил стать бесконечным. Если у кого-то возникнут замечания, предложения и пожелания к тому, про что ещё стоит написать, буду признателен. И спасибо всем, кто дочитал до этого места.
Были использованы материалы из следующих источников:
IBM Redbook «Introduction to SAN and System Networking»
EMC «Network Storage Concepts and Protocols»
Brocade «SAN Fabric Administration Best Practices Guide»
Автор: kabal375