====== IOPS. Что такое и как его посчитать? ======
**IOPS** используется для определения производительности диска или дискового массива.
**IOPS** означает ''Input/Output (operations) Per Second'', количество //“операций ввода/вывода в секунду”//. Величина измеряет объем работы за определенный промежуток времени. По сути, **IOPS** это количество блоков, которое успевает считаться или записаться на носитель. Чем больше размер блока, тем меньше кусков, из которых состоит файл, и тем меньше будет **IOPS**, так как на чтение куска большего размера будет затрачиваться больше времени.
//“Операция ввода/вывода”// - это просто некая часть работы дисковой подсистемы, которая совершается в ответ на запрос хост-сервера и/или некоторых внутренних процессов. Обычно это чтение или запись с различными подкатегориями, например //“чтение”// (**read**), //“повторное чтение”// (**re-read**), //“запись”// (**write**), “перезапись” (**re-write**), //“произвольный тип доступа”// (**random**), //“последовательный тип доступа”// (**sequential**) и размер оперируемого блока данных.
Основными измеряемыми величинами являются операции линейного (последовательного) и произвольного (случайного) доступа.
Под линейными операциям чтения/записи, при которых части файлов считываются последовательно, одна за другой, подразумевается передача больших файлов (более 128 К). При произвольных операциях данные читаются случайно из разных областей носителя, обычно они ассоциируются с размером блока 4 Кбайт.
В зависимости от вида операции, этот размер может варьироваться от байт до килобайт и даже нескольких мегабайт. Существует множество типов ввода/вывода и многозадачная и многохостовая система почти никогда не использует какой-то один. Виртуализация только добавляет разнообразия к паттернам ввода/вывода.
**Никакая система хранения не может показывать максимальные значения **IOPS** безотносительно к характеру операций ввода/вывода, значений **latency** и размеру блоков.**
**Latency** это мера того, сколько времени занимает выполнение одного запроса ввода/вывода, с точки зрения приложения.
Значительные объемы **I/O wait** это признак того, что источник проблем - хранилище (существуют и другие источники задержек, **CPU** и сеть - это обычные примеры). Даже в случае хороших показателей **latency**, если вы видите большое количество **I/O waits** - это значит, что приложение хотело бы больше скорости от системы хранения.
Определение производительности дисковой системы - это часто игнорируемый аспект проектирования систем. Поскольку дисковая система является самой медленной средой на компьютере, она должна быть одной из ПЕРВЫХ компонентов, спецификация которых правильно определена.
Приложения которые интенсивно используют операции на запись являются хорошими кандидатами для **RAID** 10, тогда как приложения которые интенсивно используют операции на чтение могут быть размещены на **RAID** 5.
**IOPS** используются для определения производительности диска или дискового массива. Для примера можно считать, что максимальный **IOPS** для диска:
|
10K RPM Fibre Channel Disk: 130 IOPS
15K RPM Fibre Channel Disk: 180 IOPS
|
ПРИМЕЧАНИЕ. Для расчета фактического IOPS для диска требуется следующая информация: ''Average latency'', ''Average seek time''. Эту информацию можно получить от производителя
==== Вычислим максимальный IOPS для диска ====
Для примера возьмем диск: **Seagate ST500DM002-1BC142**
|Average latency (avgLatency): 4.16ms или 0.00416s
Average seek time (avgSeek): 8.5ms или 0.0085s
|
Чтобы вычислить **IOPS** используем уравнение:
|IOPS = 1/(avgLatency + avgSeek)
IOPS = 1/(0.00416 + 0.0085) = 78,9889415
|
Итого, максимальный **IOPS** - 79.
==== Вычисляем максимальное значение IOPS для дискового массива ====
В примечании к разработке системы хранения, вычисление производительности дисковой системы имеет решающее значение для работы данной системы. Большинство систем используют **RAID** для обеспечения избыточности хранилища. В этом разделе описывается, как вычисляются **IOPS** для **RAID**-массивов.
==== Максимальное значение IOPS для чтения ====
Вычисление максимального значения **IOPS** чтения (**maxReadIops**) для **RAID**-массива:
''maxReadIops = numDisks * diskMaxIops''
Соответственно для массива из 4 дисков максимальное значение **IOPS** чтения будет следующим:
|maxReadIops = 4 * 79
maxReadIops = 316
|
==== Максимальное значение IOPS для записи ====
Вычисление максимального значения **IOPS** записи (//maxWriteIops//) - это совсем другое в отношении **RAID**-массивов. **RAID**-массивы имеют штраф на запись, а тип **RAID**-массива определяет серьёзность штрафа. Этот штраф является результатом избыточности, которую предоставляет **RAID**, поскольку массив обязательно должен записывать данные на несколько дисков/локаций для обеспечения целостности данных.
==== Штраф на запись RAID-массива ====
Наиболее распространенные типы **RAID** и их штрафы на запись определяются в следующей таблице:
^RAID Type^Write Penalty|
|RAID 1|2|
|RAID 5|4|
|RAID 6|6|
|RAID 10|2|
Чтобы вычислить максимальное значение **IOPS** записи (//maxWriteIops//) для заданного **RAID**-массива, разделим максимальное значение **IOPS** чтения (//maxReadIops//) на штраф за запись **RAID**-массива (//raidWritePenalty//): ''maxWriteIops = maxReadIops / raidWritePenalty''
Используя наш пример с 4-мя дисками и конфигурацией **RAID** 10, получаем следующие значения:
|maxWriteIops = 316 / 2
maxWriteIops = 158
|
Итого, для нашего примера, максимальное значение **IOPS** на запись для массива **RAID** 10 - 158.
==== Проектирование для производительности ====
Простое вычисление максимального количества **IOPS** для чтения и записи для существующего или будущего **RAID**-массива недостаточно. Для обеспечения последовательной и устойчивой производительности необходимо определить требования к производительности для системы, чтобы определить лучшее решение для диска. Минимальный требуемый **IOPS** должен быть определен таким образом, чтобы можно было приобрести необходимое количество дисков с требуемой скоростью.
Для начала необходимо знать требования к производительности (например, чтение и запись **IOPS**) для данной системы или приложения. Эта информация может быть получена из документации поставщика или программного обеспечения.
==== Вычисление минимально необходимого IOPS ====
Предположим, что у нас есть приложение, которое требует ''600 Read IOPS'' и
''300 Write IOPS''. Дисковый массив собран в **RAID** 5.
Чтобы вычислить минимальное количество **IOPS** (//minReqdIops//), добавьте количество требуемых **IOPS** чтения (//reqdReadIops//) к сумме количества требуемых **IOPS** записи (//reqdWriteIops//) и штрафа **RAID** (//raidWritePenalty//): ''minReqdIops = reqdReadIops + (reqdWriteIops * raidWritePenalty)''
В нашем примере:
|minReqdIops = 600 + (300 * 4)
minReqdIops = 1800
|
Минимальное количество **IOPS**, необходимое для обеспечения уровня производительности для нашего примера - 1800.
ПРИМЕЧАНИЕ. Этот расчет определяет минимальное количество **IOPS**, необходимое для соответствия спецификации производительности. Это означает, что дисковый массив НЕ должен работать ниже этого уровня производительности.
==== Вычисляем минимальное количество дисков для RAID-массива ====
Как только минимальное количество требуемых **IOPS** определено, очень легко определить минимальное количество и скорость дисков, необходимых для создания **RAID**-массива для удовлетворения требований к производительности.
=== Минимальное количество дисков по скорости диска ===
Минимальное количество дисков, необходимых для выполнения нашего требования к производительности (//minNumDiskMinPerf//), рассчитывается следующим образом: ''minNumDisksMinPerf = minReqdIops / maxIopsByDiskSpeed''
Используя информацию из расчета минимально необходимых **IOPS** выше и предполагая, что мы хотим создать массив из **10 000 RPM**-дисков (//~125-150 IOPS//), вычисление минимального количества дисков, которое будет соответствовать нашим минимальным требованиям к производительности (//minNumDisksMinPerf//) 1800 **IOPS** (//minReqdIops//) выглядит следующим образом:
|minNumDisksMinPerf = 1800 / 130
minNumDisksMinPerf = 14
|
Минимальное количество дисков **10 000 RPM**, необходимых для удовлетворения наших требований к производительности, - 14.
=== Минимальное количество дисков по типу RAID ===
Тип **RAID** определяет минимальное количество дисков для удовлетворения требований типа **RAID**. Например, для **RAID** 5 всегда требуется как минимум 3 диска. Для **RAID** 10 всегда требуется как минимум 4 диска.
Для любых массивов, требующих большого количества дисков, используйте множитель в приведенной ниже таблице, чтобы определить правильное количество дисков для соответствия требованиям типа **RAID**:
^Тип RAID^Количество дисков^RAID множитель|
|RAID5|3|N/A|
|RAID10|4|4|
После вычисления количества дисков по скорости, определяем минимальное количество дисков, требуемых по типу **RAID**.
В примере, когда 10K RPM-диски были выбраны для построения массива, расчет показывает, что требуется не менее 14 дисков. Если тип **RAID** будет 5, 14 дисков будет достаточным. Однако, если тип **RAID** будет равен 10, минимальное количество дисков, требуемых этим типом **RAID**, будет 8, поскольку множитель для **RAID** 10 равен 4.
==== Программы для измерения IOPS ====
[[http://www.iometer.org/|IOmeter]] — тест **IOPS** \\
[[http://www.iozone.org/|IOzone]] — тест **IOPS** \\
[[http://freecode.com/projects/fio|FIO]] — тест **IOPS** \\
[[https://crystalmark.info/software/CrystalDiskMark/index-e.html|CrystalDiskMark]] — тест **IOPS** \\
[[https://www.microsoft.com/en-us/download/details.aspx?id=20163|SQLIO]] — набор тестов для расчета производительности (**IOPS**, **MB**, **Latency**) под сервера БД\\
[[http://omnitech.net/iops/|wmarow]] — калькулятор **RAID** по производительности **IOPS**