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 здесь и здесь...

1 комментарий:

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