Глава 6. Профессиональное оборудование
Содержание
Обычный сервер может содержать только определённое число дисковых устройств. По мере роста вашего хранилища вы, в конечном итоге, столкнётесь в необходимости более производительного оборудования по сравнению с тем, которое вы находите в своей обычной домашней машине. Данная глава предоставит достаточную основу для гарантии того, что вы будете знать что пытается продать вам ваш поставщик систем хранения и как применять эту дополнительную функциональность.
Самым распространённый способ добавления объёма хранения состоит в подключении коробок специально разработанных для хранения дисков. Наиболее распространённым вариантом является 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.
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)
или
другими командами.
Если вы применяет более ранние версии 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
---------------------------------
Это не совсем всё о вашей полке - здесь нет информации о том, какой диск отвечает за этот запах горелого - но это предоставляет указания.
Чтобы включить или выключить 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 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 (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
.
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 воспользуйтесь 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 пока не позволяет вам, однако, переформатировать такое устройство с различными размерами сектора.
Утилита 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 имеет пространство имён, в игру вступает драйвер
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.
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.