18 февраля 2010 г.

Точная наука

Многие считают, что математика точная наука. Я тоже был в этом уверен, пока мне в 6 классе не подарили калькулятор MK-61 (уж не знаю, что заставило родителей так разориться на штуку, которую нельзя было надеть или съесть :) ). В первый же день экспериментов с этим чудесным устройством, я обнаружил, что 2 в кубе по каким-то причинам равно 7,99что-то_там...  Из умных книжек я уже тогда знал, что такое куб. Поэтому был уверен, что 2 в кубе вычисляется как 2*2*2  и это точно равно 8, а вовсе не той загадочной комбинации цифр, которую высвечивал зеленый экранчик. Я жутко расстроился, а мама сказала, что нужно отнести этот бракованный агрегат обратно в магазин и поменять. Делать это юный лентяй, конечно, не стал, а нашел более приемлимое для себя решение - считать фичей (благо как округлять до целого я был в курсе).

Немного повзрослев я поступил на физфак и познакомился с методами приближенных вычислений и неопределенностью Гейзенберга. Это окончательно убедило в том, что на руке у меня приблизительно 10 пальцев, а человек, который знает что-то точно - глупец.

К чему эти воспоминания? Нахлынуло, когда прочитал пост в блоге Анила Гупта о том, как как он посчитал факториал 30. Вот здесь

17 февраля 2010 г.

Несколько забавных фактов о Clariion

Название CLARiiON имеет интересную историю. Ни для кого не секрет, что этот продукт был приобретен в 1999г. вместе с компанией Data General. До этого DG активно продавала 16-битный миникомпьютер NOVA. После разработки нового продукта, инженеры собирались назвать его NOVAII. Но маркетинг был против повторного использования бренда и потребовал изменить название. Инженеры схитрили и предложили анаграмму AViiON, а  для пущей неузнаваемости вставили две буквы “i” посередине. Название CLARiiON продолжило традицию таких именований. Кстати, буквально слово Clarion переводится как “рожок, горн”.

Операционная среда FLARE получило свое название как аббревиатура от Fibre Logic Array Runtime Environment. Буквально это слово переводится как “взрыв, вспышка”.

Ну и напоследок, история происхождения загадочного “messner” (надо объяснять, что это такое? ;)  ). Некоторые члены группы разработчиков, работающей над управлением Clariion, увлекались скалолазанием. Поэтому это слово они выбрали в честь альпиниста-легенды Рейнхольда Месснера, который в 1980г. совершил бескислородное соло-восхождение на Эверест и был первым покорителем всех 14 вершин восмитысячников. По слухам, до этого использовалось сочетание “pink floyd”, но маркетингу это не нравилось и его заставили сменить.

10 февраля 2010 г.

Заметки на полях (HBA) -2

Какие моменты стоит учитывать для того, чтобы достичь высокого уровня нагрузки с одного сервера? Они очевидны:
  • Во-первых, реальные данные не могут просто взяться из /dev/null. Их надо сначала создать посредством каких-либо вычислений либо скопировать из другого хранилища. Поэтому для генерации такого плотного потока информации понадобится действительно мощный сервер и высокопроизводительный источник данных.
  • Во-вторых, для обеспечения таких предельно высоких значений Bandwidth и Throughput драйверам HBA потребуются значительные ресурсы сервера. Это приведет к дополнительной достаточно высокой нагрузке на центральные процессоры и шины ввода-вывода.
  • В-третьих, получатель данных, т. е. наш дисковый массив, должен быть готов их принять, обеспечив требуемую производительность (эффект обратной связи мы уже обсуждали ранее).
Ну и напоследок еще один банальный совет. Начинать анализ производительности HBA, конечно, следует с просмотра логов серверов на предмет наличия сообщений об ошибках. Ведь даже краткая ревизия сообщений драйвера HBA может дать вам очень много информации о процессах, происходящих в системе и наличии очевидных проблем. Причем, надо анализировать логи не только серверов, генерирующих самую большую нагрузку, а всех систем, подключенных к дисковому массиву. Ведь, например, сообщение QFULL не обязательно должен получить сервер, который перегрузил входящие буферы портов дискового массива. Эта ошибка запросто может появиться в логах любого сервера, через SAN подключенных к этим портам.

Еще короткие заметки о HBA... 

5 февраля 2010 г.

Заметки на полях (HBA)

  • У карт  HBA с драйверами под различные операционные системы существуют множество параметров, настройка которых может повлиять на производительность I/O. В качестве примера приведу параметры Maximum Scatter/Gather List и Maximum Sectors. Их настройка всегда очень индивидуальна и обязательно требует предварительных экспериментов с замерами производительности.
  • Если вы обнаружили, что серверу доступно меньшее количество томов, чем было настроено на дисковом массиве, возможно, необходимо увеличить значение параметра LUNs Per Target.
  • Пользователям дисковых массивов EMC настоятельно рекомендую перед подключению сервера к дисковому массиву почитать соответствующий документ Connectivity Guide (как всегда, свежие версии доступны на Powerlink). В зависимости от типа HBA и операционной системы там могут даваться более детальные рекомендации по настройке параметров HBA.  
Еще короткие заметки о HBA...

    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...