29 января 2010 г.

Queue Depth

О внутренних соединениях HBA здесь...

Одной из причин очень сильного снижения производительности HBA может стать некорректная настройка глубины очереди (Queue Depth, QD). Queue Depth контролирует максимальное количество I/O команд, которые могут одновременно находиться в исходящих очередях портов HBA. Слишком маленькое значение глубины очереди не позволяет раскрыть весь потенциал адаптера.
Слишком большая QD перегружает входящие буферы портов дискового массива. В этом случае он посылает драйверу HBA сообщение контроля передачи SCSI QFULL. Если адаптер проигнорирует данное сообщение и продолжит посылать данные, они могут быть просто отброшены. Это может повлиять на целостность хранимой информации. Поэтому получив QFULL, драйвер должен срочно предпринять какие-либо меры по снижению нагрузки. Эти меры различны для разных драйверов, операционных систем и конкретных настроек. Но независимо от того, каким образом система среагирует на получение QFULL, сама эта ситуация обязательно приведет к заметному падению производительности, а в некоторых случаях даже к потере работоспособности. Использование ПО multipathing (например, PowerPath), являющимся посредником между драйверами HBA и уровнем SCSI, может в некоторой степени сгладить катастрофичность ситуации, но не приведет к полному решению проблемы.

Возникает резонный вопрос, в каких случаях нам стоит ожидать перегрузки входящих буферов? Front-end порты дисковых массивов EMC Clariion имеют следующие ограничения:
  • Общая глубина входящей очереди каждого порта (Target Port Queue Depth Limit).
  • Глубина очереди на каждый LUN, доступный через порт (LUN Queue Depth Limit).



Для того, чтобы избежать перегрузки буферов портов дискового массива, драйвер HBA имеют возможность ограничивать количество направляемых I/O команд. На уровне каждого порта массива это ограничение реализуется драйвером адаптера при помощи параметра QueueDepthTarget, а для всех LUNs, доступных серверу через любой из портов Clariion, при помощи QueueDepthLUN. Соответственно, при настройке HBA необходимо придерживаться некоторых правил. Вот правила для дисковых массивов Clariion::
  • Сумма QueueDepthTarget всех HBA серверов, использующих некий порт дискового массива, не должна превышать Target Queue Depth Limit. Например, порт SPA-2 используется 8 серверами с приблизительно одинаковой нагрузкой. В этом случае необходимо проследить, чтобы QueueDepthTarget <= 200 (1600/8). Если через HBA сервера используются сразу несколько портов дискового массива, QueueDepthTarget должен выставляться в минимальное из значений, рассчитанных для каждого порта.
  • Сумма QueueDepthLUN всех HBA, использующих некий LUNs на порту дискового массива, не должна превышать LUN Queue Depth Limit. Например, если 3 сервера одновременно используют LUN5 (RAID5 7+1) на порту SPB-1, на каждом из них должна быть установлена QueueDepthLUN <= 43 ( ((14*7)+31)/3 ). Если сервер использует несколько LUNs, имеющих различный LUN Queue Depth Limit, в качестве параметра HBA должно выбираться минимальное из возможных значений.
Отмечу, что высокое значение QD в большей степени важно для Throughput-oriented, а не для Bandwidth-oriented приложений. При настройке параметров всегда необходимо удостовериться, в одинаковости значений на всех HBAs сервера.

Вроде, все просто. Но, к сожалению, есть несколько моментов, которые при настройке параметров QD потребуют от вас дополнительных усилий:
  • Во-первых, требования к нагрузке с нескольких серверов, использующих один порт, может быть различной. В таких случаях, при расчете QueueDepthTarget обязательно придется учесть пропорцию нагрузок.
  • Во-вторых, названия параметров QD в драйверах HBA различных производителей и операционных систем могут быть разными. Настоятельно рекомендую проштудировать соответствующую документацию. Искать следует по словам “queue” и “throttle”.
  • В-третьих, опять же в зависимости от типа HBA и ОС, могут поддерживаться либо оба параметра настройки глубины очереди, либо только один из них.
Если драйвер поддерживает работу с QueueDepthTarget и QueueDepthLUN задача проста. Необходимо просто выставить их в соответствии с рассчитанными Target Port Queue Depth Limit и LUN Queue Depth Limit.
Если мы можем настроить только QueueDepthLUN, то обязательно нужно проследить за тем, чтобы произведение этого параметра на количество LUNs, доступных на порту, не превышало Target Port Queue Depth Limit.
Если нам доступен только QueueDepthTarget, следует убедиться, что произведение, рассчитанного для данной конфигурации, LUN Queue Depth Limit на количество LUNs, доступных на порту, не превышало значения настраиваемого параметра. В противном случае его требуется уменьшить.
Рассмотрим небольшой пример. Два сервера подключены к одному порту дискового массива. Общая нагрузка между Server1 и Server2 распределяется как 30/70. На дисковом массиве сформированы две RAID Groups. На RAID 5 созданы и распределены между серверами 11x LUNs, а на RAID 10 - 48x LUNs. Предположим, что в используемой версии драйвера HBA обоих серверов можно настраивать только QueueDepthLUN.




Посчитаем ограничения порта дискового массива:
  • TargetQueueDepthLimit = 1600,. Для того, чтобы удовлетворить этому ограничению? с учетом различий нагрузки Server1 должен использовать не более 784 входных буферов порта дискового массива (1600*0,3). Оставшиеся 1120 буферов достанутся Server2 (1600*0,7).
  • LUNQueueDepthLimitRAID5 = 87 (14*4+31), LUNQueueDepthLimitRAID10 = 59 (14*2+31). Так как мы не можем настроить QueueDepthLUN отдельно на каждую из RAID Groups, для дальнейших расчетов необходимо использовать минимальное из этих двух значений, т. е. 59.
Можно ли использовать рассчитанное ограничение LUN Queue Depth Limit в качестве значения QueueDepthLUN? Давайте посчитаем. Даже если Server1 будет нагружать все 11 доступных LUNs (8+3), суммарное количество требуемых буферов не будет превышать Target Port Queue Depth Limit (11*59=649 < 784). Соответственно, значение QueueDepthLUN(Server1)=59 будет корректным.

А вот если взять QueueDepthLUN=59 в случае Server2, то мы не сможем удовлетворить требованию Target Port Queue Depth Limit ( (15+40)*59=3245 > 1120 ). Поэтому здесь расчет необходимо проводить от обратного: QueueDepthLUN=1120/(15+40)=20. Отметим, что полученное значение удовлетворяет требованиям LUN Port Queue Depth Limit (20<59).

Заметки на полях о HBA здесь и здесь...

24 января 2010 г.

Внутренние соединения HBA

Об уровнях драйверов и HBA рассуждаю здесь.

Современные HBA для подключения к серверу используют соединения PCI-X и PCI-express. Напомню, что PCI-X как любая шина имеет следующие ограничения: во-первых, общая пропускная способность разделяется между всеми подключенными устройствами, а во-вторых, устройство, работающее на минимальной частоте, будет определять рабочую частоту для всех устройств на шине.
В отличие от PCI-X, соединение PCI-express (PCIe) является не  шиной, а коммутируемым соединением. Поэтому совершенно не нужно задумываться в какие их существующих в сервере слотов следует подключать устройства. Единственным ограничением является “ширина” соединения, определяемая количеством полнодуплексных полос (lanes). Адаптер имеющий некое количество lanes можно подключать только в слот с идентичным или большим количеством полос. Например, HBA PCIe 2.0 x4 можно подключать только в слоты PCIe 2.0 или 1.0 x4, x8, x16 и x32. Подключение устройства в к более широкому слоту не дает никаких преимуществ по производительности передачи данных.

Интерфейс
Ширина
Частота
Bandwidth
PCI-X 1.0
64 bit
66 MHz
533 MB/s
PCI-X 1.0
64 bit
100 MHz
800 MB/s
PCI-X 1.0
64 bit
133 MHz
1066 MB/s
PCI-X 2.0
64 bit
266 MHz
2,15 GB/s
PCI-X 2.0
64 bit
533 MHz
4,3 GB/s
PCIe 1.0
x1
2,5 GHz
0,5 GB/s
PCIe 1.0
x2
2,5 GHz
1 GB/s
PCIe 1.0
x4
2,5 GHz
2 GB/s
PCIe 1.0
x8
2,5 GHz
4 GB/s
PCIe 1.0
x16
2,5 GHz
8 GB/s
PCIe 1.0
x32
2,5 GHz
16 GB/s
PCIe 2.0
x1
5,0 GHz
1 GB/s
PCIe 2.0
x2
5,0 GHz
2 GB/s
PCIe 2.0
x4
5,0 GHz
4 GB/s
PCIe 2.0
x8
5,0 GHz
8 GB/s
PCIe 2.0
x16
5,0 GHz
16 GB/s
PCIe 2.0
x32
5,0 GHz
32 GB/s


Может ли полоса пропускания внутренних соединений ограничивать производительность адаптеров HBA? На диаграмме представлено сравнение параметров производительности внешних и внутренних интерфейсов FC HBAs. Как мы видим, для HBA с различным количеством FC портов все же существуют минимальные требования по Bandwidth внутренних соединений.


Я не поленился и проверил, соответствуют ли этим минимальным требованиям основные модели трех ведущих производителей HBA. Все оказалось замечательно. На данный момент мы можем быть уверены в том, что Bandwidth внутренних соединений никак не будет сказываться на производительности карт HBA.

Transfer Rate
Кол-во портов
Производитель
Модель
Интерфейс
подключения
Частота
Ширина
8Gbps
Quad
Qlogic
QLE2564
PCIe 2.0
5.0GHz / 2.5GHz
x8 / x8
Dual
Brocade
825
PCIe 2.0
5.0GHz / 2.5GHz
x8 / x8
Emulex
LPe12002
PCIe 2.0
5.0GHz / 2.5GHz
x4 / ?
Qlogic
QLE2562
PCIe 2.0
5.0GHz / 2.5GHz
x4 / x8
Single
Brocade
815
PCIe 2.0
5.0GHz / 2.5GHz
x8 / x8
Emulex
LPe12000
PCIe 2.0
5.0GHz / 2.5GHz
x4 / ?
Emulex
LPe1250
PCIe 2.0
5.0GHz / 2.5GHz
x4 / ?
Qlogic
QLE2560
PCIe 2.0
5.0GHz / 2.5GHz
x4 / x8
4Gbps
Quad
Qlogic
QLE2464
PCIe 2.0
2.5GHz
x8
Dual
Qlogic
QLA2462
PCI-X 2.0
266MHz
64bit
Brocade
425
PCIe 2.0
5.0GHz / 2.5GHz
x8 / x8
Qlogic
QLE2462
PCIe 2.0
2.5GHz
x4
Emulex
LPe11002
PCIe 1.0 a
2.5GHz
x4
Single
Emulex
LP1150
PCI-X 2.0
266MHz
64bit
Qlogic
QLA2460
PCI-X 2.0
266MHz
64bit
Brocade
415
PCIe 2.0
5.0GHz / 2.5GHz
x8 / x8
Qlogic
QLE2460
PCIe 2.0
2.5GHz
x4
Emulex
LPe11000
PCIe 1.0 a
2.5GHz
x4
Emulex
LPe1150
PCIe 1.0 a
2.5GHz
x4
Emulex
LPe111
PCIe 1.0 a
2.5GHz
x4
2Gbps
Quad
Qlogic
QLA2344
PCI-X
133MHz
64bit
Dual
Emulex
LP11002
PCI-X 2.0
266MHz
64bit
Emulex
LP10000DC
PCI-X 1.0
133MHz
64bit
Emulex
LP1050DC
PCI-X 1.0
133MHz
64bit
Qlogic
QLA2342
PCI-X
133MHz
64bit
Qlogic
QLA2342L
PCI-X
133MHz
64bit
Emulex
LP10000ExDC
PCIe 1.0 a
2.5GHz
x4
Single
Emulex
LP11000
PCI-X 2.0
266MHz
64bit
Emulex
LP10000
PCI-X 1.0
133MHz
64bit
Emulex
LP1050
PCI-X 1.0
133MHz
64bit
Emulex
LP101
PCI-X 1.0
133MHz
64bit
Qlogic
QLA2340
PCI-X
133MHz
64bit
Qlogic
QLA2340L
PCI-X
133MHz
64bit
Qlogic
QLA2310F
PCI-X
66MHz
64bit
Qlogic
QLA2310FL
PCI-X
66MHz
64bit
Emulex
LP1050Ex
PCIe 1.0 a
2.5GHz
x4

О Queue Depth...