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 друг с другом.

2 комментария:

  1. FOS 6.3.1+ и 6.4.0+ поддерживают универсальный режим - сначала пробуют ARB/ARB, потом IDLE/ARB. Для этого нужно установить portCfgFillword в значение 3.

    простенький скрипт:

    DCX:

    for ((i=0;i<48;i++)); do (echo 1/$i;portcfgfillword 1/$i 3); done
    for ((i=0;i<48;i++)); do (echo 2/$i;portcfgfillword 2/$i 3); done
    for ((i=0;i<48;i++)); do (echo 3/$i;portcfgfillword 3/$i 3); done
    for ((i=0;i<48;i++)); do (echo 4/$i;portcfgfillword 4/$i 3); done
    for ((i=0;i<48;i++)); do (echo 9/$i;portcfgfillword 9/$i 3); done
    for ((i=0;i<48;i++)); do (echo 10/$i;portcfgfillword 10/$i 3); done
    for ((i=0;i<48;i++)); do (echo 11/$i;portcfgfillword 11/$i 3); done
    for ((i=0;i<48;i++)); do (echo 12/$i;portcfgfillword 12/$i 3); done

    DCX-4S:

    for ((i=0;i<48;i++)); do (echo 1/$i;portcfgfillword 1/$i 3); done
    for ((i=0;i<48;i++)); do (echo 2/$i;portcfgfillword 2/$i 3); done
    for ((i=0;i<48;i++)); do (echo 7/$i;portcfgfillword 7/$i 3); done
    for ((i=0;i<48;i++)); do (echo 8/$i;portcfgfillword 8/$i 3); done

    5300:

    for ((i=0;i<80;i++)); do (echo $i;portcfgfillword $i 3); done

    5100:

    for ((i=0;i<40;i++)); do (echo $i;portcfgfillword $i 3); done

    ОтветитьУдалить
  2. Я про универсальный режим не знал. Григорий, спасибо.

    ОтветитьУдалить

Примечание. Отправлять комментарии могут только участники этого блога.