Глава 6. Профессиональное оборудование

Обычный сервер может содержать только определённое число дисковых устройств. По мере роста вашего хранилища вы, в конечном итоге, столкнётесь в необходимости более производительного оборудования по сравнению с тем, которое вы находите в своей обычной домашней машине. Данная глава предоставит достаточную основу для гарантии того, что вы будете знать что пытается продать вам ваш поставщик систем хранения и как применять эту дополнительную функциональность.

 Службы полок SCSI

Самым распространённый способ добавления объёма хранения состоит в подключении коробок специально разработанных для хранения дисков. Наиболее распространённым вариантом является SCSI полка (enclosure, иногда называемая backplane, объединительной платой) {Прим. пер.: в качестве примеров внешних полок см. MDL RE460e, HGST 4U60 G1, на этой же странице вы можете найти примеры базовых модулей с backplane}. Подключение полки SCSI к хосту осуществляется платой дискового контроллера.

Полка SCSI содержит в себе разнообразные виды оборудования и принадлежностей. Часто вы можете увидеть размножители порта SAS или SCSI, позволяющие вам подключать более четырёх устройств к каждому порту на вашем дисковом контроллере. Вероятно вы увидите дисковые отсеки или корзинки, скорее всего с горячей заменой. Полка имеет вентиляторы, температурные датчики, блоки питания и многое другое. Полка даже может иметь свой собственный ЦПУ, работающий под управлением встроенной операционной системы, намеренно разработанной для овладения всеми этими функциями. Отказавшие вентиляторы и источники питания могут разрушить ваше хранилище.

Полка SCSI имеет протоколы для взаимодействия с операционными системами сервера. Служба полки SCSI (SES, SCSI Enclosure Services) является современным протоколом для мониторинга и управления подсистемой хранения вашего сервера {Прим. пер.: см. вариант применения Работа с протоколом SES на примере полки Fastor JS300 G3, ETegro}. Она выступает в роли преемника протокола SAF-TE (SCSI Accessed Fault-Tolerant Enclosure), применявшегося в более раннем оборудовании.

Обычно SES интегрирован в объединительную плату (backplane) отсеков горячего резервирования дисков или в расширитель (Expander) SAS. SES предоставляет стандартный способ наблюдения и локализации ваших дисковых устройств, а также может применяться для мониторинга вентиляторов, световых индикаторов и прочих устройств.

FreeBSD поддерживает SES посредством драйвера ses(4). FreeBSD 10.3 внедрила sesutil(8), позволяющий вам опрашивать и управлять устройствами ses(4) в вашей системе.

  Опрос ваших полок

Sesutil(8) имеет в наличии множество функций. Начните с sesutil map, которая отобразит все ваши устройства во всех ваших полках.


# sesutil map
ses0:
 Enclosure Name: LSI SAS2X36 0e12
 Enclosure ID: 500304801786b87f
 	   

Первым элементом для полки (enclosure) является имя устройства полки (ses0). Если у вас имеется множество контроллеров, перезагрузка может изменять узел устройства, поэтому не полагайтесь на идентификацию определённой полки. Имя полки основывается на модели оборудования, однако идентификатор полки является уникальным для этого определённой части аппаратных средств.

Каждая наблюдаемая и управляемая часть оборудования в полке является элементом. Каждому элементу назначается некий номер. Номера элементов не изменяются при перезагрузке. Вот первый элемент одного из массивов Джуда:


Element 0, Type: Array Device Slot
 Status: Unsupported (0x00 0x00 0x00 0x00)
 Description: Drive Slots
 	   

Element 0 имеет тип Array Device Slot и описание Drive Slots. Это родительский элемент для всех последующих индивидуальных разъёмов индивидуальных устройств.


Element 1, Type: Array Device Slot
 Status: OK (0x01 0x00 0x00 0x00)
 Description: Slot 01
 Device Names: da0,pass4
Element 2, Type: Array Device Slot
 Status: OK (0x01 0x00 0x00 0x00)
 Description: Slot 02
 Device Names: da1,pass5
 	   

Это пара реальных дисковых устройств. Вы видите имена устройств FreeBSD и физическое местоположение этих устройств. Предполагается, что ваша полка имеет номера разъёмов нанесённые на них нестираемо - что является предпочтительным, а не на удаляемых картриджах дисков. Когда FreeBSD скулит, что диск da1 погиб, вы можете сообщить своему техническому персоналу на площадке, что нужно обращаться напрямую к Slot 02.

После дисковых отсеков следует остальное оборудование.


Element 26, Type: Temperature Sensors
 Status: OK (0x01 0x00 0x39 0x00)
 Description: Temperature
 Extra status:
 - Temperature: 37 C
 	   

Это большое количество слов для отражения, что первый термометр сообщает что температура полки является температурой тела согласно учебника.


Element 28, Type: Cooling
 Status: OK (0x01 0x01 0xfe 0x21)
 Description: Fan1
 Extra status:
 - Speed: 5100 rpm
 	   

Охлаждающим элементом, по всей видимсоти, является вентилятор, хотя возможно, кто-то делает сейчас SCSI полки с суперохлаждением. Скорость вентилятора позволяет судить о том, что вентилятор пока работает. Однако, вы можете захотеть убедитьтся в этом вручную, посмотрев в руководстве где точно располагается Fan1.


Element 34, Type: Voltage Sensor
 Status: OK (0x01 0x00 0x01 0xf6)
 Description: 5V
 Extra status:
 - Voltage: 5.02 V
 	   

Датчики напряжения перечисляют ожидаемое напряжение каждого датчика в качестве Description, а затем предоставляют актуальное напряжение в качестве дополнительного состояния.

Расширители SAS вносят некоторую дополнительную сложность. Вы увидите записи для расширителей SAS, а затем все свои компоненты в пределах этого расширителя. Существует очень маленькая вероятность, что с расширителем может что-то произойти, однако некоторые компоненты на самом деле сообщают о своём состоянии.


Element 41, Type: SAS Expander
 Status: Unsupported (0x00 0x00 0x00 0x00)
 Description: SAS Expanders
Element 42, Type: SAS Expander
 Status: OK (0x01 0x00 0x00 0x00)
 Description: Primary Expander
Element 44, Type: SAS Connector
 Status: OK (0x01 0x11 0xff 0x00)
 Description: Upstream Connector (Primary)
Element 45, Type: SAS Connector
 Status: OK (0x01 0x11 0xff 0x00)
 Description: Downstream Connector 1 (Primary)
Element 46, Type: SAS Connector
 Status: OK (0x01 0x11 0xff 0x00)
 Description: Downstream Connector 2 (Primary)
 	   

Отображаются даже индивидуальные соединители


Element 47, Type: SAS Connector
 Status: OK (0x01 0x20 0x00 0x00)
 Description: Drive Connector 00
 	   

Это гораздо больше подробностей, чем требуется большинству из нас. Однако проверка состояния ваших расширителей SAS и контроллеров перед запуском заменённых жёстких дисков при её выполнении может уберечь вас от множества мучений.

  Путь полки

Вы можете определять метоположение дисков в полке по тому как они подключены. Чтобы достичь определённого диска, операционная система должна дойти до заданной полки, а затем до определённого отсека в этой полке. FreeBSD автоматически создаёт каталоги узла устройства на основе данного пути. Это делает возможным системному администратору идентифицировать лежащие в основе определённые части оборудования. Такие пути устройств являются последовательностью пар ключ- значение, разделяемых символом @. Например, полка 500304801786b87d отображается для нас как enc@500304801786b87d. Каждый путь имеет четыре компоненты: заданную полку, тип устройства, конкретный разъём и описание конкретного элемента, создавая путь аналогичный приводимому ниже:


/dev/enc@n500304801786b87d/type@0/slot@a/elmdesc@Slot_10/
 	   

Данный узел устройства представляет полку 500304801786b87d. Ведущая N перед идентификатором полки отображает факт, что это идентификатор Network Addressing Authority (NAA), который, впрочем, является рудиментарным, поскольку всё здесь является идентификатором NAA. Шестнадцатеричное число является адресом SAS вашего Addressed Logical Unit. Как это число определяется, зависит от производителя.

type является числовым типом устройства. Диски являются единственными устройствами, которые в настоящее время поддерживает это драйвер, однако последующие версии FreeBSD огут добавить поддержку для других устройств.

slot (разъём) является отсеком данного диска. Разъёмы нумеруются шестнадцатерично: slot a равен 10, b 11, и так далее. slot 10 на самом деле является 16.

Последним компонентом является element description (описание элемента), которое появляется когда вы выполняете sesutil map.

Этот каталог содержит символьные ссылки на все узлы устройств связанные с данным разъёмом. Он даже имеет помеченные подкаталоги. (Вы управляете помеченными дисками, не так ли?)


#ls -l /dev/enc@n500304801786b87d/type@0/slot@a/elmdesc@Slot_10/
total 1
lrwxr-xr-x  1 root  wheel   15 Oct  5 23:27 da9@ -> ../../../../da9
dr-xr-xr-x  2 root  wheel  512 Oct  5 23:27 gpt/
lrwxr-xr-x  1 root  wheel   18 Oct  5 23:27 pass13@ -> ../../../../pass13
 	   

Если разъём 15 в вашей полке издаёт необычный жужжащий звук, вы можете перейти к узлу устройства на основе полки и идентифицировать, какой поставщик там размещается (все системные администраторы точно оценивают знание того, какой уровень тревоги соответствует каждому данному событию).

  Поддержание сигнальной индикации

Работающему на вашем оборудовании персоналу необходима вся помощь которую они только могут получить. Подобные новера разёмов, скорее всего, печатаются в виде шести пунктов и видны только когда вы вынимаете устройство из отсека. А замена аварийного привода всегда происходит когда сотруник на площадке едва понимает происходящее.

Отсеки полки имеют определённую световую сигнализацию местоположения для обеспечения вашим удалённым рукам дополнительных ключей. Активируйте световую индикацию отсека при помощи sesutil locate. В приводимом примере мы активируем световую индикацию в отсеке, размещающем устройство da2.


# sesutil locate da2 on
 	   

Световой индткатор, в зависимости от производителя, либо загорится, либо начнёт моргать. Если световой индикатор загорится, команда sesutil map отобразит это.


# sesutil map
…
Element 3, Type: Array Device Slot
 Status: OK (0x01 0x00 0x02 0x00)
 Description: Slot 03
 Device Names: da2,pass6
 Extra status:
 - LED=locate
 	   

Вам может понадобиться активация световой индикации в отсеке и без диска - скажем, показать персоналу куда установить новый жёсткий диск. Воспользуйтесь узлом устройства SES и номером необходимого элемента вместо узла устройства. Часто, но не всегда, номер разёма тот же что и номер элемента. Будьте аккуратны.

Вот мы активируем световую индикацию местоположения 3 элемента в полке /dev/ses0.


# sesutil locate -u /dev/ses0 3 on
 	   

Чтобы выключить световую индикацию, выполните ту же команду, но при этом замените on на ... подождите минутку, на что? ..., а off.

 Управление HBA

FreeBSD содержит некоторый инструментарий для управления не RAID контроллерами жёстких дисков, обычно называемых host bus adapters, или HBA. Для более ранних контроллеров, а, скорее всего, вы больше ничем и не сможете воспользоваться, вы найдёте mfiutil(8) и mptutil(8). FreeBSD 10.3 добавил программы mprutil(8) и mpsutil(8). Причём, mprutil(8) применяетс для HBA LSI Fusion-MPS 3, а mpsutil(8) для HBA LSI Fusion-MPS 2. (Поскольку Avago купил LSI, вы также можете увидеть эти платы с торговой маркой Avago.)

Обе прогаммы ведут себя идентично, поэтому мы проведём демонстрацию с mpsutil(8).

  Подробности адаптера

Для начала определим подключённые в вашей системе адаптеры.


# mpsutil show adapters
Device Name  Chip Name   Board Name  Firmware
/dev/mps0    LSISAS2308              13000000
/dev/mps1    LSISAS2308              13000000
 	   

Теперь просмотрим все ваши подключённые устройства. По умолчанию оба инструмента осуществляют доступ к первому узлу устройства, либо к /dev/mps0, либо к /dev/mpr0. Доступ к прочим устройствам HBA осуществляется посредством флага -u и номера устройства.


# mpsutil show devices
B___T        SAS Address Handle Parent Device      Speed Enc  Slot Wdt
        500304801786b87f 0009   0001   SMP Target  6.0   0002 00   4
00  08  5000cca2325ddda9 000a   0009   SAS Target  6.0   0002 00   1
00  09  5000cca23257419d 000b   0009   SAS Target  6.0   0002 01   1
00  10  5000cca2325db3bd 000c   0009   SAS Target  6.0   0002 02   1
00  11  5000cca2325e028d 000d   0009   SAS Target  6.0   0002 03   1
…
 	   

Здесь каждая строка является неким устройством, которое отвечает на команды SCSI. Большая их часть является жёсткими дисками. Всё что находится на шине SCSI является таргетом, включая жёсткий диск. Реальное погружение в это требует понимания SAS и SCSI, но мы можем тщательно подобрать информацию и без глубоких знаний.

Первые две колонки отображают адреса устройств в стиле SCSI. Третья предоставляет адрес SAS устройства. Во многом по аналогии с адаптерами Ethernet, каждое устройство SAS имеет уникальный физический адрес.

Колонка Handle (дескриптор) отображает имя данного устройства, в то время как колонка Parent (родитель) показывает устройство, к которому данное устройство подключено. Взглянем на нашу первую строку. Она имеет дескриптор 0009. Вторая строка имеет дескриптор 000a, однако его родителем является 0009. Устройство из второй строки подключено к устройству из первой строки.

Колонка Device показывает какой тип у устройства. "SAS Target" является причудливым способом сказать "жёсткий диск SAS". Таргет SMP (Serial Attached Management Protocol) является коммутатором SCSI или расширителем.

Колонка Speed отображает скорость соединения в гигабитах в секунду.

Колонка Enc отображает полку (enclosure), в то время как Slot показывает разъём или отсет утройства. Наконец, Wdt отображает максимальное число соединений портов для этого устройства.

  Отображение полок

Примените команду show enclosures для просмотра подключённых к HBA полок. В нашем случае мы перечисляем полки, подключённые к /dev/mps1.


# mpsutil -u 1 show enclosures
Slots Logical ID     SEPHandle  EncHandle Type
  08  500605b009d018c0          0001      Direct Attached SGPIO
  25  500304801786b87f  0022    0002      External SES-2
  13  5003048001f7ab3f  0030    0003      External SES-2
 	   

Вы увидите общее число разъёмов в полке, дескрипторы устройств (если они есть) и тип полки.

Logical ID является адресом SAS. Вы можете приводить его в соответствие с адресами SAS отображаемыми sesutil(8) или другими командами.

 sas2ircu

Если вы применяет более ранние версии FreeBSD, которые не имеют в наличии mpsutil или вам требуется функциональность, которая не предоставляется, LSI/Avago предоставляет свой собственный, проприетарный, инструмент, sas2ircu(8). Большая часть недостающих функций mpsutil(8) содержит встроенные в контроллер программно определяемый RAID (Вы не пытаетесь применять програмно определяемый RAID в основе ZFS, не так ли? Не валите с ног старину Джуда этим!). Также sas2ircu(8) делает возможным предоставление вам такой информации как версия встроенного ПО HBA. Он доступен как портированная версия FreeBSD, sysutils/sas2ircu.

Программа sas2ircu(8) ожидает на входе по крайней мере двух аргументов: номер контроллера (узел устройства) и команду. Даже если у вас только один контроллер, вы должны опредеять номер этого контроллера.

  Просмотр аппаратных средств

Для просмотра подключенного к HBA оборудования воспользуйтесь командой отображения. В нашем случае мы ищем устройства подключённые к контроллеру 0, к /dev/mps0 или к /dev/mpr0.


# sas2ircu 0 display
 	   

Вы получите ворох информации об авторских правах, а также полезные замечания навроде такого:


Read configuration has been initiated for controller 0
 	   

Или, "I’m going to do as you asked now."


----------------------------------
Controller information
----------------------------------
  Controller type      : SAS2308_2
  BIOS version         : 7.37.00.00
  Firmware version     : 19.00.00.00
  Channel description  : 1 Serial Attached SCSI
…
 	   

Информация о версиях BIOS и встроенного ПО являются полезными если у вас возникли проблемы или вам необходимо воспользоваться технической поддержкой производителя. После того, как всё это уйдёт в прошлое, мы получаем информацию о рально подключенном оборудовании. Каждый жёсткий диск получает запись подобную следующей:


Physical device information
--------------------------------------------------
Initiator at ID #0

Device is a Hard disk
  Enclosure #                : 1
  Slot #                     : 0
  SAS Address                : 4433221-1-0300-0000
  State                      : Ready (RDY)
  Size (in MB)/(in sectors)  : 4769307/9767541167
  Manufacturer               : ATA
  Model Number               : TOSHIBA MD04ACA5
  Firmware Revision          : FP2A
  Serial No                  : 55FGK5SUFS9A
  GUID                       : N/A
  Protocol                   : SATA
  Drive Type                 : SATA_HDD
  …
 	   

Вы видите серийные номера, тип подключённых устройств, готово устройство к применению или нет, размер и тому подобное.

Когда вы обойдёте все ваши жёсткие диски, он выплеснет подробности о самой полке.


---------------------------------
Enclosure information
---------------------------------
  Enclosure#  : 1
  Logical ID  : 500605b0:09cfc820
  Numslots    : 8
  StartSlot   : 0
---------------------------------
 	   

Это не совсем всё о вашей полке - здесь нет информации о том, какой диск отвечает за этот запах горелого - но это предоставляет указания.

  Подсветка местоположения с помощью sas2ircu

Чтобы включить или выключить LED на определённом отсеке диска, вам потребуются номер контроллера, номер полки, а также номер самого разъёма. Давайт получим всё это через команду отображения.


# sas2ircu <controller #> locate <enclosure#:slot#> on
 	   

Допустим, что мы хотим активировать LED на устройстве 8 в полке, рассмотренной в предыдущем разделе. Мы применяли контроллер 0, или /dev/mps0. Команда отображения показывает все номера устройств полки и номер разъёма. Устройство 8 в разъёме 7 - помните, нумерация разъёмов часто начинается с нуля. Таким образом, чтобы заморгал LED для устройства 8 (см. выше) на /dev/mps0, вам нужно выполнить.


# sas2ircu 0 locate 1:7 on
 	   

Когда закончите, выключите его снова.

 Множество путей SAS

Системам с требованиями высокой доступности и большим числом дисков может требоваться множественность путей SAS (SAS Multipath). Цель множественности путей состоит в предоставлении более одного пути от ЦПУ к каждому диску. Доолнительные пути могут применяться для балансировки нагрузки или отказоустойчивости. Обычно множественность путей подразумевает присоединение двух или более контроллеров к объединяющей плате (backplane) или полке хранения содержащим диски.

  Зачем нужна множественность путей?

Когда каждый диск может быть достигнут через любой из контроллеров, отказ одного контроллера или кабеля не прервёт обслуживание. Кроме того, это может сделать доступным для вас применение объединённой пропускной способности всех имеющихся контроллеров.

Данная концепция может даже быть расширена для предоставления полной высокой доступности (High Availability). Если у вас в наличии заполненная дисками полка JBOD, присоедините один из двух имеющихся SAS портов к своему первому серверу, а другой ко второму серверу. Теперь обе машины имеют доступ ко всем дискам. Воспользуйтесь чем- то навроде CARP, одного из большого числа демонов тактовых импульсов (heartbeat) или какой- либо службой высокой доступности на основе кворума чтобы сделать возможным совметное применение этими двумя серверами IP адреса.

Имея две машины подключённые ко всем данным, вы можете достичь великолепной отказоустойчивости служб на этих машинах. Это позволит вам выполнять откладываемое вами обновление не выключая файловый сервер.

Примените дополнительные меры предосторожности для обеспечения того, что обе системы не попытаются одновременно монтировать те же диски. Это именно то, почему команда zpool import проверяет идентификатор хоста и отказывает в импорте пулов, которые выглядят так, будто они используются другой системой.

  Режимы множественности путей

Множественность путей предлагаеи интересную задачу. Если каждый из дисков имеет два или более путей назад к ЦПУ, операционная система опрашивает каждый индивидуальный диск множество раз, по разу через каждый контроллер. Теперь моя система с 36 дисками внезапно превращается в имеющую 72 диска.

Модуль множества путей GEOM, gmultipath(8), обрабатывает эти множественные пути и предоставляет единое логическое устройство хранения вашей операционной системе. Gmultipath(8) автоматически выбирает лучший путь для достижения диска и, таким образом, верхние уровни хранения не должны заботиться об этом.

Множественность путей GEOM в настоящее время поддерживает три режима работы: активно/пассивный, активно/активный и активно/читающий.

Active/passive (активно/пассивный) в определённый момент времени использует только один путь. Если путь отказывает, система повторяет эту команду по следующему пути. Определяйте активно/пассивный метод при помощи -P.

Active/active (активно/активный) режим применяет все пути одновременно для увеличения доступной пропускной способности. Применение всех имеющихся путей иногда может в действительности наносить урон производительности. Активно/активный режим не имеет возможности определить что произойдёт в файловой системе или на прикладном уровне; он просто распыляет инструкции по различным контроллерам. Команды, которые зависят друг от друга могут быть вынуждены ожидать ответа от другого контроллера, прежде чем они могут быть выполнены. Определяйте активно/активный режим при помощи -A.

Active/read (активно/читающий) режим использует все пути для чтения, однако выполняет все записи только через первичный путь. Такой гибридный подход разрещает некоторые проблемы записи которые могут возникнуть при применении активно/активного режима. Данный режим может быть полезен для насыщения SSD предоставляя болшую пропускную способность контроллера. Для обычного шпиндельного диска производительность при произвольных операциях ввода/ выода в действительности может ухудшиться в сравнении с активно/пассивным. Определяйте активно/читающий при помощи -R.

Четвёртый метод, logical block (логических блоков) исследуется, но пока ещё не доступен. Режим логических блоков разбивает диск на части определённого размера и всегда применяет один и тот же путь для доступа к одной области. Это позволяет избегать дублирования кэша в контроллерах, так как одна и та же область диска никогда не будет доступна обоим контроллерам. Это также разрешит проблему порядка записи и, как ожидается, предоставит лучшую производительность чем активно/активный рехим.

  Идентификация дисков

Раздражающей частью настройки множественности путей является определение того, какие узлы устройств (/dev/daX) представляют различные представления одного и того же оборудования. Вы должны решить эту проблему перед тем как вы добавите какие- либо метки к своим дискам. Один из способов решения этого состоит в применении camcontrol(8) на устройствах SAS для получения их серийных номеров.


# camcontrol inquiry da7 -S
1EHNLWRC
# camcontrol inquiry da43 -S
1EHNLWRC
 	   

Соберите перечень устройств и их серийных номеров и определите соответствия.

В качестве альтернативы, вы можете применить sesutil(8) для пометки номеров разъёмов. Для примера мы воспользуемся системой Джуда с множественными путями. Она имеет две полки: у передней 24 разъёма, а у задней 12. У сервера имеются два дисковых контроллера.

Первый порт первого контроллера подключен к передней полке и имеет имя /dev/ses0. Второй порт подключён к задней полке и становится /dev/ses1.

Первый порт второго контроллера подключён к передней полке и имеет назначение /dev/ses2. Второй порт второго контроллера подключён ко второму порту задней полки и становится /dev/ses3.

У вас имеются две полки. Устройства FreeBSD /dev/ses0 и /dev/ses2 вдвоём направляют к передней полке, а /dev/ses1 и /dev/ses3 оба направляют к задней. Ниже я просматриваю элемент 8 переднего массива с обеих перспектив.


# sesutil map -u /dev/ses0
…
Element 8, Type: Array Device Slot
  Status: OK (0x01 0x00 0x00 0x00)
  Description: Slot 08
  Device Names: da7,pass11
# sesutil map -u /dev/ses2
…
Element 8, Type: Array Device Slot
  Status: OK (0x01 0x00 0x00 0x00)
  Description: Slot 08
  Device Names: da43,pass49
 	   

Это один и тот же диск. Он имеет множество узлов устройств. Диски da7 и da43 являются одним и тем же оборудованием.

Всякий раз при настройке множественности путей делайте пометки и рисуйте диаграммы. В будущем Вы скажете спасибо за хорошие пометки. (Если ваши пометки будут скудными или вовсе будут отсутствовать, то в Будущем Вы будете проклинать себя, день, когда вы появились на свет и всех своих домашних животных. У вас недостаточно людей уже вас ненавидящих?)

  Настройка множественности путей

Для работы gmultipath(8) необходим модуль ядра. Сделайте доступной загрузку с точкой входа /boot/loader.conf.


geom_multipath_load="YES"
 	   

Модули множественности путей GEOM имеют два режима настройки: ручной и автоматический. Настоятельно рекомендуется применение атоматичекого. Он прописывает метку в самый последний сектор каждого диска, затем читает эту метку через каждый путь для определения какие узлы устройств являются просто дополнительными путями к тому же самому диску. Применяйте gmultipath label для автоматической настройки множественности путей.

Мы рекомендуем применять sesutil(8) для получения списка узлов дисковых устройств подключённых к одной из ваших полок. Затем воспользуйтесь camcontrol(8) для получения серийных номеров каждого из этих устройств. Совместите имя полки (f, front, для передней) и номер разъёма с серийным номером диска для создания метки этого диска.


# gmultipath label f01-1EHNM9MC /dev/da0
 	   

Вы выполните это по разу для каждого устройства в вашей полке применяя соотвествующий номер разъёма и серийный номер для создания уникальных меток на каждом диске.


# gmultipath label f08-1EHNLWRC /dev/da7
 	   

Если метка существует, gmultipath(8) найдёт эту метку когда он будет пробовать другие диски. Когда он обнаружит диск с меткой gmultipath f01-1EHNM9MC, он скажет: "Ага! это всё тот же диск /dev/da0" и приступит к работе.

  Узлы устройств множества путей

Теперь, когда вы пометили /dev/da0 и /dev/da37 одим и тем же устройством, не применяйте эти узлы устройств. Эти узлы устройств представляют доступ к данному диску через один из путей. Вместо этого используйте узел устройства с множеством путей. Модуль ядра gmultipath(8) в действительности пердотвращает ваш доступ к этим устройствам по раздельности.

В /dev/multipath появились узлы устройств с множеством путей. Каждый диск поименован после того как вы назначили его метку. Постройте свой собственный массив ZFS поверх этих меток и вы получите доступ к данным дискам даже когда вы отключите один кабель.

Если вы реально, на самом деле, очень- очень хотите осуществлять доступ к узлам множественных устройств дисков с множеством путей, установитье значение sysctl kern.geom.multipath.exclusive в 0. Но мы вам говорим не делать это. (Мы советуем вам не делать это не для вашего собственного блага, и не просто чтобы мы потом могли сказать "мы предупреждали вас".)

  Ручная настройка множественности путей

Может быть вам нравится делать вещи не самым простым способом. Если в вашем распоряжении есть под рукой карта того, какие узлы устройств представляют одни и те же физические устройства, вы можете воспользоваться этой картой для создания узлов с множеством путей вручную. Сопоставьте одну метку двум дисковым устройствам. Здесь мы создадим устройство с множеством путей, multi1 при помощи узлов устройств /dev/da0 и /dev/da37.


# gmultipath create multi1 /dev/da7 /dev/da43
 	   

Чтобы уничтожить созданное вручную устройство с множеством путей воспользуйтесь gmultipath destroy и соответствующим именем метки.


# gmultipath destroy multi1
 	   

Однако мы действительно рекомендуем автоматическую настройку. А также последующую маркировку дисков их местоположением и серийным номером.

  Просмотр множественности путей

После перезагрузки стек GEOM FreeBSD опробует все диски, распознает метки и сгруппирует нужные диски вместе. Просмотрите как они выявились при помощи gmultipath status.


# gmultipath status
                  Name   Status  Components
multipath/f00-1EHNM9MC  OPTIMAL  da0 (ACTIVE)
                                 da36 (PASSIVE)
multipath/f01-1EHJZMBC  OPTIMAL  da1 (ACTIVE)
                                 da37 (PASSIVE)
…
multipath/f07-1EHNLWRC  OPTIMAL  da7 (ACTIVE)
                                 da43 (PASSIVE)
 	   

После каждого пути вы увидите замечание, отображающее является ли каждый узел устройства активным или пассивным.

  Изменение режима множественности путей

Мы обсуждали различные режимы с множеством путей и их влияние на производительность ранее. Когда вы помечаете диски, значение gmultipath по умолчанию установлено в активный/ пассивный (-P). Вы можете добавить -A для переключения в активный/ активный, или -R для включения активный/ чтение.

Вы также можете применять эти флаги для изменения режима существующего устройства с множеством путей. Воспользуйтесь gmultipath configure, флагом нужного вам режима и меткой изменяемого устройства gmultipath. Вот, например, мы включаем диск помеченный f07-1EHNLWRC в режим активный/ чтение.


# gmultipath configure -R f07-1EHNLWRC
 	   

Это работает?


# gmultipath status
…
multipath/f07-1EHNLWRC OPTIMAL da7 (ACTIVE)
                               da43 (READ)
 	   

В настройках активный/ пассивный и активный/ чтение вы можете также применять команду rotate чтобы переключать то, какое из устройств является активным.


# gmultipath rotate f07-1EHNLWRC
# gmultipath status
…
multipath/f07-1EHNLWRC OPTIMAL da7 (READ)
                               da43 (ACTIVE)
 	   

Теперь даже ваши SSD могут меняться местами. Пользуйтесь!

Поговорим об SSD...

 SSD

Твердотельные диски, или SSD (Solid state disks), существенно отличаются от обычных шпиндельных устройств и требуют совсем другой настройки по сравнению с традиционными дисками. Впрочем, это даже не диски.

Чтобы шпиндельный жёсткий диск прочитал два сектора, которые расположены в различных местах на этом диске, читающие головки должны позиционироваться в правильном местоположении, затем дождаться пока вращающаяся пластина повернётся в правильное положение, прочитает сектор, затем изменит позиционирование на второй сектор, вновь дождётся пока пластина займёт верное смещение и затем прочитает второй сектор. Такое ожидание называется временем позиционирования (seek time).

SSD не имеет перемещающихся частей. Когда вы читаете данные из двух различных частей этого устройства, оно имеет нулевое время позиционирования. Большинство SSD получают относительно высокие скорости чтения и записи благодаря тому, что они читают и пишут во множество ячеек одновременно. Чтобы сохранять занятыми множество ячеек памяти, операционная система должна поддерживать устройство очередью выполняемых работ.

Для обычного шпиндельного диска наличие "глубокой" очереди это плохо. Это означает, что возрастает промежуток времени между тем когда данные запрошены и когда они записаны или возвращены, так как они должны ожидать завершения ожидающей в очереди работы. При наличии меньшей глубины очереди, наиболее важные элементы работ могут прийти в начало очереди первыми, отсекая в начале очереди менее важные работы, которые будут упорно дожидаться в линии. (Почти также ловко, как Лукас рассекает очередь в киоск с мороженным). Для получения наивысшей производительности SSD, однако, глубина очереди должна быть достаточно высокой, чтобы гарантировать что все ячейки будут загружены работой. Вы не сможете получить достойных хвастовства значений производительности в коробке без прекрасной заполненой очереди.

Для получения наиболее высоких значений IOPS для устройств, подобных SSD, глубина настраиваемой очереди VDEV ZFS требует увеличения. Это поможет сохранить достаточно работы в такой очереди для предотвращения простоев в подобном устройстве. За подробностями отсылаем вас к разделу Очереди ввода/вывода Главы 8.

В отличие от шпиндельного диска, который имеет сектора которые расположены в фиксированных местах на пластине диска, SSD являются массивом неподвижных элементов флеш- памяти. SSD использует FTL (Flash Translation Layer, печально, не быстрее чем легче -Faster Than Light- движок) для соответствия эмуляции местоположений на диске определённым ячейкам, содержащим хранимые данные. Хотя для SSD не требуется наличие адресации логических блоков (Logical Block Addresses) применяемой шпиндельными дисками, FTL предоставляет эти LBA. {Прим. пер.: см. Understanding the FTL Specification, Intel, Dec. 1998} LBA в SSD порождает даже ещё меньше связи с реальностью, чем у них есть её для шпиндельных дисков.

Поскольку элементы флеш-памяти подвержены износу {Прим. пер.: имеют ограниченный ресурс перезаписей}, почти все SSD содержат больше памяти чем они предъявляют на коробке. Устройства распределяют данные по элементам чтобы изнашивать их более равномерно. Когда занято всё пространство, работает сборщик мусора. Сборщик мусора находит ячейки, на которые больше нет ссылок или для которых ОС применил команду TRIM (SATA) или UNMAP (SCSI) для пометки неиспользуемыми, и очищает их для дальнейшего применения.

Когда вы добавляете SSD или другие устройства, которые поддерживают TRIM в пул ZFS, FreeBSD TRIM весь раздел или всё устройство по умолчанию с тем, чтобы оно стартовало в известном состоянии. Это может вызвать задержки в десятки минут или даже часов перед тем, как устройство станет доступным. Если у вас новое устройство, или вы не хотите выполнять на нём TRIM когда вы добавляете его в свой пул, перед добавлением такого устройства в свой пул установите значение sysctl vfs.zfs.vdev.trim_on_init в 0.

 NVMe

Non-Volatile Memory Express, или NVMe является новой технологией, разработанной для дальнейшего увеличения скорости твердотельных хранилищ. Она применяется как для флеш- дисков, так и для энергонезависимой памяти, например, 3D Xpoint Intel {Прим. пер.: и Micron}. NVMe сама по себе является спецификацией физического интерфейса, альтернативного SATA или SCSI/SAS. Вы можете увидеть кабели и адаптеры NVMe, которые подключаются через шину PCI-e.

Самой медленной, наиболее сложной и наиболее расположенной к ошибкам частью SSD является FTL. Притворяться быть настолько глупым, чтобы соответствовать эре шпнидельных дисков 1980х это очень тяжёлая работа. NVMe улучшают производительность тех же самых аппаратных средств, отбрасывая эти неуклюжие притворства, принимая вместо этого более соответствующие флеш- памяти протоколы.

Одним из самых больших отличий между устройствами NVMe и SSD состоит в том, что устройства NVMe имеют множество очередей, причём обычно одну очередь для чтения и одну очередь для записи из расчёта на имеющиеся ЦПУ. Вместо того, чтобы пытаться сохранять одну очередь заполненной достаточной работой для занятия множества элементов флеш- памяти, NVMe имеет множество очередей. Очереди NVMe могут сораняться относительно неглубокими, позволяя более приоритетным задачам оттеснять прочую работу. Распределение нагрузки между ЦПУ помогает гарантировать даже болшую производительность.

В то время как большинство HDD и SSD взаимодействуют с AHCI, который имеет единственную очередь команд, причём до 64 команд на устройство, интерфейс NVMe допускает 65 636 очередей, причём по 65 536 команд в каждой. Интерфейс NVMe таким образом, требует меньше блокировок при том, что предлагает гораздо больший параллелизм и, тем самым, производительность.

Драйвер FreeBSD nvme(4) впервые появился в FreeBSD 9.2. Во многом по аналогии с узлом устройства жёсткого диска, вы можете ожидать, что ваше первое устройство nvme(4) будет /dev/nvme0, /dev/nvme1 и так далее.

Устройства NVMe естественным образом поддерживают пространства имён (namespaces), позволяя им подразделяться на логичекие устройства, похоже, но по- другому в сравнении с разделами. nvme(4) применяет символы ns для идентификации пространств имён в своём узле устройства. В отличие от почти всего имеющегося в вычислительной технике, спецификация NVM Express начинает нумерацию пространств имён с 1 вместо 0. Таким образом, вы получаете узлы устройств наподобие /dev/nvme0ns1, /dev/nvme0ns2 и так далее.

Только некоторые новые устройства NVMe уровня предприятия (Enterprise) поддерживают управление своими пространствами имён. Большинство имеющихся в настоящее время устройств имеют единое пространство имён, охватывающее всё устройство.

  Просмотр устройств NVMe

Для управления устройствами NVMe воспользуйтесь nvmecontrol(8). Начните с идентификации всего подключенного к вашей системе оборудования NVMe при помощи nvmecontrol devlist.


# nvmecontrol devlist
 nvme0: INTEL SSDPEDMD800G4
  nvme0ns1 (763097MB)
 	   

У данного хоста в наличии одно NVMe с единым пространством имён.

Для изучения специфичной информации об устройстве воспользуйтесь командой nvmecontrol identify.


# nvmecontrol identify nvme0
Controller Capabilities/Features
================================
Vendor ID:                8086
Subsystem Vendor ID:      8086
Serial Number:            CVFT4030004A800CGN
Model Number:             INTEL SSDPEDMD800G4
Firmware Version:         8DV10151
…
 	   

Это продолжается совсем недолго, определяя всю функциональность данной поддержки NVMe (или не совсем).

Команда identify также работает с пространствами имён.


# nvmecontrol identify nvme0ns1
Size (in LBAs):            1562824368 (1490M)
Capacity (in LBAs):        1562824368 (1490M)
Utilization (in LBAs):     1562824368 (1490M)
Thin Provisioning:         Not Supported
Number of LBA Formats:     7
Current LBA Format:        LBA Format #00
LBA Format #00: Data Size:   512 Metadata Size:   0
LBA Format #01: Data Size:   512 Metadata Size:   8
LBA Format #02: Data Size:   512 Metadata Size:  16
LBA Format #03: Data Size:  4096 Metadata Size:   0
LBA Format #04: Data Size:  4096 Metadata Size:   8
LBA Format #05: Data Size:  4096 Metadata Size:  64
LBA Format #06: Data Size:  4096 Metadata Size: 128
 	   

Формат LBA позволяет вам определить размер сектора, включая необязательное дополнительное пространство для кодирования или метаданные. FreeBSD пока не позволяет вам, однако, переформатировать такое устройство с различными размерами сектора.

  Производительность NVMe

Утилита nvmecontrol(8) также содержит инструментарий тестирования производительности, а именно nvmecontrol perftest. Хотя вы можете захотеть протестировать производительность диска, она способна продемонстрировать преимущества множества рабочих очередей.

Здесь мы применяем тест производительности для измерения скорости чтения с увеличивающимся числом потоков, причём по каждые 30 секунд. Каджый тест применяет увеличивающиеся размеры болшого блока. Последняя колонка показывает реальную пропускную способность для каждого значения числа потоков, в мегабайтах в секунду.

Начнём тестирование с 512- байтных блоков.


# for threads in 1 2 4 8 16 32 64; do nvmecontrol perftest \
        -n $threads -o read -s 512 -t 30 nvme0ns1;done
Threads:   1 Size:  512  READ Time:  30 IO/s:  215377 MB/s: 105
Threads:   2 Size:  512  READ Time:  30 IO/s:  309203 MB/s: 150
Threads:   4 Size:  512  READ Time:  30 IO/s:  509559 MB/s: 248
Threads:   8 Size:  512  READ Time:  30 IO/s:  534976 MB/s: 261
Threads:  16 Size:  512  READ Time:  30 IO/s:  535131 MB/s: 261
Threads:  32 Size:  512  READ Time:  30 IO/s:  534682 MB/s: 261
Threads:  64 Size:  512  READ Time:  30 IO/s:  533701 MB/s: 260
 	   

При одном потоке мы можем читать 105МБ/с. При восьми и более мы выходим на 260МБ/с. Возможно, это максимум пропускной способности с данным размером блока для этого устройства.

Вот подобный тест с применением 4096-байтового (4кБ) чтения.


# for threads in 1 2 4 8 16 32 64; do nvmecontrol perftest \
       -n $threads -o read -s 4096 -t 30 nvme0ns1;done
Threads:  1 Size:   4096  READ Time:  30 IO/s:  171261 MB/s:  668
Threads:  2 Size:   4096  READ Time:  30 IO/s:  308112 MB/s: 1203
Threads:  4 Size:   4096  READ Time:  30 IO/s:  424894 MB/s: 1659
Threads:  8 Size:   4096  READ Time:  30 IO/s:  521704 MB/s: 2037
Threads: 16 Size:   4096  READ Time:  30 IO/s:  543984 MB/s: 2124
Threads: 32 Size:   4096  READ Time:  30 IO/s:  543376 MB/s: 2122
Threads: 64 Size:   4096  READ Time:  30 IO/s:  542464 MB/s: 2119
 	   

Даже с одним потоком мы рассеиваем возможности производительности с 512-байтовыми блоками. Восемь потоков могут выполнять почти 2 000МБ/с, при 16 и более потоках мы получаем почти 2 120МБ/c. При слегка большем тестировании вы можете вывести, что где-то в районе 9 или 10 потоков с данным размером блока достигается максимум производительности.

Теперь забудем об этих начальных смертельных размерах блока и перепрыгнем сразу к 128кБ блокам.


Threads:  1 Size: 131072  READ Time:  30 IO/s:  21770 MB/s: 2721
Threads:  2 Size: 131072  READ Time:  30 IO/s:  25780 MB/s: 3222
Threads:  4 Size: 131072  READ Time:  30 IO/s:  25780 MB/s: 3222
Threads:  8 Size: 131072  READ Time:  30 IO/s:  25758 MB/s: 3219
Threads: 16 Size: 131072  READ Time:  30 IO/s:  25706 MB/s: 3213
Threads: 32 Size: 131072  READ Time:  30 IO/s:  25718 MB/s: 3214
Threads: 64 Size: 131072  READ Time:  30 IO/s:  25710 MB/s: 3213
 	   

Уже два потока достигают максимальной пропускной способности с такими большими блоками.

Всего лишь 3200МБ/с может не послышаться быстрым - это 3.2ГБ/с. Однако SATA измеряет производительность в битах, не в байтах. Даже если вы освободитесь от накладных расходов, 6Gbps SATA3 в максимуме выдают примерно 550МБ/с.

  Поставщики NVMe GEOM и загрузка

Так как устройство NVMe имеет пространство имён, в игру вступает драйвер nvmecontrol(8). Это устройство, которое в действительности является поставщиком (provider) GEOM и может применяться для хранения данных в ZFS. Вы можете наблюдать узлы устройств типа /dev/nvd0, /dev/nvd1 и так далее.

Если вы планируете использовать устрйоство NVMe в качестве загрузочного диска вы должны создать раздел загрузочного устройства /dev/nvd, возможно при помощи GPT. Если вы не загружаетесь с этого устройства, вы можете пропустить таблицу разделов и записывать свою файловую систему напрямую на узел устройства.

Обычные модули BIOS и CSM (модули совместимости BIOS, Compatibility Support Module) понимают только традиционные диски и вещи, которые лгут, чтобы выглядеть как диски. Вся суть устройств NVMe состоит в том, что они отказываются врать и не эмулируют традиционные жёстки е диски.

Загрузка с устройства NVMe требует загрузки через UEFI. FreeBSD получил возможность загружать root-onZFS через EFI в FreeBSD 10.3.

 zfsd

FreeBSD 11.0, ожидаемая к выпуску в июле 2016, включит в себя первую версию zfsd(8). Этот демон, специфичный для FreeBSD, предоставит некоторую функциональность, обеспечиваемую средствами управления служб Solaris (SMF, Service Management Facility). Zfsd(8) получает извещения об отказах, которые ядро само по себе не может обработать и разрешает их.

Этот демон прослушивает события devctl(4), таке как ошибки ввода/ вывода или подключения диска и события удаления, затем отвечает на них активирую и деактивируя горячие резервы или включая или выключая индивидуальные устройства в своём пуле.

Для zfsd(8) не нужна никакая настройка. Он принимает свои решения на основании настроек вашего пула. В первой версии zfsd будет иметь какой-то эффект только свойство autoreplace.

Если поступает уведомление об удалении диска, который является участником VDEV, zfsd немедленно активирует горячий резерв в данном пуле и запускает восстановление (resilvering).

При появлении нового устройства GEOM, zfsd вначале проверяет на наличие метки ZFS. Если диск имеет метку, которая индицирует, что оно было первоначально участником пула, оно повторно подключается. По завершению восстановления, все горячие резервы, которые временно применялись для замещения этого устройства, деактивируются и возвращаются в список доступной замены.

Если вновь появившееся устройство не имеет метки ZFS, но его физический путь соответствует утраченному участнику VDEV, а пул имеет установленное свойство пула autoreplace, тогда новое устрйство применяется для замены утраченного. В новых версиях FreeBSD физический путь может быть пустым (blank) или может быть путём SES, например, dev/enc@n500304801786b87d/type@0/slot@1/elmdesc@Slot_01/gpt/f01-1EHJZMBC.

Когда восстановление (resilvering) завершится, zfsd деактивирует все горячие резервы, которые временно замещали такое устройство. Деактивированные устройства возвращаются в списко доступного резерва.

Если VDEV деградирует или отказывает, zfsd попытается разрешить эту проблему активируя горячий резерв.

Если конкретное устройство генерирует более 50 ошибок ввода/ вывода или контрольных сумм на протяжении периода в 60 секунд, zfsd помечает это устройство деградировавшим и активирует горячий резерв. ZFS продолжает применять деградировавшее устройство до тех пор, пока не восстановится (resilver) данный пул. Когда пул завершит восстановление, zfsd удалит отказавшее устройство из пула.

Если в пул добавляется новый горячий резерв, или осуществляется возврат, zfsd активирует запас, если он нужен, для замены другого устройства.

Когда операция восстановления (resilver) выполнена, zfsd пытается деактивировать все горячие резервы, в которых больше нет необходимости, следовательно они доступны для замены при последующих отказах в случае их возникновения.

Zfsd(8) также прослушивает "изменение физического пути", чтобы быть в курсе при установке пути к вновь появившемуся диску. Это может случиться слегка позже, чем произошло само событие вставк таого диска. Когда физический путь обновлён, а свойство пула autoreplace при этом установлено, zfsd попытается выполнить замену любого отказавшего диска с тем же самым физическим путём.

Когда вы переставите отказавший диск, а подсистема CAN заметит, что новый диск находится в том же самом разъёме, причём с тем же самым путём, zfsd автоматически инициирует операцию replace и восстановит пул назад в рабочеспособное (health) сосояние.

Перемещение диска из одного разъёма в другой работает в точности как удаление диска и подключение его обратно. Ядро помечает отсутствующий диск как удалённый. Когда вы вставляете диск назад, ядро позиционирует метку ZFS на этом диске, определяет к какому пулу он относится и автоматически реактивирует его при помощи zpool online. Метаданные пула поучают обновления сэтим физическим путём.

Теперь мы немного поговорим о том, как применять профессиональное оборудование, давайте расмотрим преимущества применения различных кэшей ZFS.