Базовыми метриками, позволяющими оценить производительность существующей или проектируемой системы хранения данных являются скорость передачи данных (throughput, определяет какой объем данных можно прочитать/записать в единицу времени) и IOPS (Input/Output Operations Per Second). Говоря простым языком, IOPS отражает сколько операций чтения и записи накопитель способен выполнять за секунду. Скорость передачи важна при работе с большими файлами, а IOPS в сценариях с большим количеством мелких файлов и случайным доступом (базы данных, виртуальные машины). Дополнительно следует обращать внимание на время задержки (latency), нужное диско для выполнения запроса, так как это напрямую влияют на отзывчивость системы.
В этой статье мы рассмотрим несколько способов тестирования скорости и IOPS системы хранения данных с помощью встроенных средств Windows (будь то локальный жесткий, SSD диск, сетевая папка SMB, CSV том или LUN на СХД в сети SAN/iSCSI).
Счетчики производительности дисковой подсистемы Windows
Для быстрой оценки производительности диска в реальном времени можно использовать диспетчер задач. Нажмите сочетание клавиш
Ctrl + Shift + Esc
, перейдите во вкладку Производительность и выберите диск.

Здесь отображается текущая скорость записи и чтения к диску, а также задержка (Average response time).
Чтобы узнать текущую длину очереди к диску, откройте Resource Monitor (
resmon
). На вкладке Disk в разделе Storage отображается текущее значение Disk Queue Length.

Вы можете оценить текущий уровень нагрузки на дисковую подсистему с помощью встроенных счетчиков производительности Windows из Performance Monitor. Чтобы собрать данные по этим счетчикам:
- Запустите
Perfmon - Создайте новый набор сборщиков данных (Data Collector Set). Выберите Create manually.

- Выберите опцию Create data logs -> Performance counter;

- Теперь в свойствах нового набора для сбора данных добавьте следующие счетчики производительности для объекта Physical Disk (можете выбрать счётчики для конкретного диска или для всех доступных локальных дисков):
- Avg. Disk Sec./Transfer (задержка)
- Avg. Disk Queue Length (длина очереди)
- Avg Disk Bytes/Transfer
- Disk Bytes/sec (скорость/пропускная способность диска)
- Disk Transfers/sec (значение IOPS)
- Split IO/sec
- Можете изменить другие параметра сбора данных. По умолчанию значения счетчиков собираются каждые 15 секунд.Чтобы отображать данные о производительности дисков в реальном времени нужно добавить указанные счётчик в Perfmon в разделе Monitoring Tools -> Performance Monitor.

- Осталось запустить сбор данных счетчиков производительности (Start) и дождаться сбора достаточного количества информации для анализа. После этого щелкните ПКМ по набору у выберите Stop.

- Чтобы просмотреть собранные данные по диску, перейдите в раздел Perfmon -> Reports -> User Defined -> Data_Disk_IO — > ваш набор. По умолчанию данные по диску отображаются в виде графиков.
- С помощью
Ctrl+Gпереключитесь в режим Report.
Как интерпретировать результаты производительности дисков в Perfmon? Для быстрого анализа производительности дисковой подсистемы необходимо посмотреть на значения как минимум следующих 5 счетчиков.
- Disk sec/Transfer – время, необходимое для выполнения одной операции записи/чтения на устройство хранения/диск — disk latency. Если задержка более 25 мс (0.25) или выше, значит дисковый массив не успевает выполнять операции. Для высоконагруженных систем значение не должно превышать 10 мс (0.1).
- Disk Transfers/sec – количество операций чтения/записи в секунду (IOPS). Это основной показатель интенсивности обращений к дискам (примерные значения в IOPS для разных типов дисков представлены в конце статьи).
- Disk Bytes/Sec – средняя скорость обмена с диском (чтения/записи) за 1 секунду. Максимальные значения зависит от типа диска (150-250 Мб/секунду — для обычного диска и 500-10000 для SSD).
- Split IO/sec – показатель фрагментации диска, когда операционной системе приходится разделять одну операцию ввода/вывода на несколько операций. Может также говорить о том, приложение запрашивает слишком большие блоки данных, которые не могут быть переданы за одну операцию.
- Avg. Disk Queue Length– длина очереди к диску (количество транзакций ожидающий обработку). Для одиночного диска длина очереди не должна превышать 2. Для RAID массива из 4 дисков длина очереди до 8 будет считаться допустимым значением.
Тестирование скорости диска с помощью встроенной утилиты WinSat
Для оценки производительности жесткого диска или SSD в Windows можно использовать встроенную консольную утилиту winsat (Windows System Assessment Tool). Ранее она использовалась для получения оценки индекса производительности Windows (Windows Experience Index, WEI score).
Для быстрой оценки производительности диска
C:\
, откройте командную строку и выполните команду:
winsat disk -drive C
Этак команда выполняет несколько тестов последовательной и случайной чтения записи и возвращает на экран скорость записи и чтения (в МБ/с), среднюю и максимальную задержку. И для каждого значения указывается его сводная оценка по 10 бальной шкале (как в старых версиях Windows при оценке индекса производительности).

> Disk Random 16.0 Read 193.66 MB/s 7.7 > Disk Sequential 64.0 Read 1015.15 MB/s 8.4 > Disk Sequential 64.0 Write 1317.33 MB/s 8.7 > Average Read Time with Sequential Writes 0.374 ms 8.3 > Latency: 95th Percentile 0.605 ms 8.6 > Latency: Maximum 10.143 ms 7.9 > Average Read Time with Random Writes 0.390 ms 8.7 > Total Run Time 00:00:04.75
Можно запускать тесты диска только для определенных операций:
- Оценка производительности последовательного чтения:
winsat disk -seq -read -drive F - последовательной записи:
winsat disk -seq -write -drive F - случайного чтения:
winsat disk -ran -read -drive F - случайнойзаписи:
winsat disk -ran -write -drive F
Тестирование IOPS в Windows с помощью DiskSpd
Для генерации нагрузки на дисковую подсистему и измерения ее производительности Microsoft рекомендует использовать утилиту DiskSpd (https://aka.ms/diskspd). Эта консольная утилита, которая в несколько потоков может осуществлять операции I/O с указанным таргетом. Я довольно часто использую эту утилиту чтобы нагрузить СХД и замерить ее реальную производительность в IOPS и получить максимальную скорость чтения/записи c данного сервера (можно конечно измерить производительность и со стороны СХД, в этом случае diskspd будет использоваться для генерации нагрузки).
Утилита не требует установки, просто скачайте и распакуйте архив на локальный диск. Для x64 битных систем используйте версию diskspd.exe из каталога amd64fre.
Я использую такую команду для тестирования диска:
diskspd.exe –c50G -d300 -r -w40 -t8 -o32 -b64K -Sh -L E:\diskpsdtmp.dat > DiskSpeedResults.txt
diskspd.exe
генерируется довольно большая нагрузка на диски и CPU тестируемой системы. Поэтому, чтобы не вызвать падение производительности для пользователей, не рекомендуем запускать ее на продуктивных системах в часы пиковой нагрузки.
-
-c50G– размер файла 50 Гб (лучше использовать большой размер файла, чтобы он не поместился в кэш контроллера СХД) -
-d300 – продолжительность тестирования в секундах -
-r– произвольное чтение/запись (если нужно тестировать последовательный доступ, используйте –s) -
-t8– количество потоков -
-w40– соотношение операций записи к операциям чтения 40% / 60% -
-o32— длина очереди -
-b64K— размер блока -
-Sh— не использовать кэширование -
-L— измерять задержки (latency) -
E:\diskpsdtmp.dat– путь к тестовому файл
После окончания стресс-теста из полученных таблиц можно получить средние значения производительности. Например, в моем тесте получены следующие общие данные про производительности для HDD СХД (Total IO):
- MiB/s — 241 (около 252 Мб/сек, неплохо)
- IOPS — 3866.49 (отлично!)
- Средняя задержка — 66.206 мс (высоковато!)

Можно получить отдельные значения только по операциям чтения (секция Read IO ) или записи (секция Write IO ).
Протестировав с помощью diskspd несколько дисков или LUN на СХД, вы сможете сравнить их или выбрать массив с нужной производительностью под свои задачи.
Как получить IOPS и производительность дисковой подсистемы с помощью PowerShell?
Недавно мне на глаза попался PowerShell скрипт (автор Microsoft MVP, Mikael Nystrom), являющийся по сути надстройкой над утилитой SQLIO.exe (набора тестов для расчета производительности файлового хранилища).
Итак, скачайте архив содержащий 2 файла: SQLIO.exe и DiskPerformance.ps1 (disk-perf-iops.ZIP — 73Кб) и распакуйте архив в произвольный каталог.
Пример запуска PowerShell скрипта для определения IOPS:
.\DiskPerformance.ps1 -TestFileName test.dat –TestFileSizeInGB 1 -TestFilepath C:\temp -TestMode Get-LargeIO -FastMode True -RemoveTestFile True -OutputFormat Out-GridView
Я использовал в скрипте следующие аргументы:
- -TestFileName test.dat — имя файла, создаваемого утилитой FSUTIL
- –TestFileSizeInGB 1 — размер файла для тестов. Допустимые варианты 1,5,10,50,100,500,1000 Гб. Размер файла должен быть больше, чем размер кэша системы. Иначе будет измеряться IOPS для данных в кэше, а не на диске.
- -TestFilepath C:\Temp — указывается диск, для которого будет выполняться расчет производительности и каталог на диске, в котором будет создаваться тестовый файл. Допустимо указать UNC путь к сетевой папке.
- —TestMode Get-LargeIO — есть два варианта измерения нагрузки, Get-SmallIO – измеряются IOPS, Get-LargeIO – измеряется скорость передачи данных. Разница между аргументами SmallIO и LargeIO, в размерах блоков при замере скорости 8 Кбайт и 512 Кбайт, и типе доступа Random или Sequential соответственно.
- -FastMode True — в режиме Fastmode каждый тест выполняется 10 секунд, иначе 60 сек.
- -RemoveTestFile True — удалить тестовый файл по окончании теста.
- -OutputFormat Out-GridView — возможен вывод результатов измерения в консоль PowerShell (Format-Table) или в отдельное окно графической таблицы (Out-Gridview).
В нашем случае дисковый массив (тестировался виртуальный vmdk диск на VMFS хранилище, расположенном на дисковой полке HP MSA 2040 с доступом через SAN) показал среднее значение IOPS около 15000 и скорости передачи данных (пропускная способность) около 5 ГБайт/сек.
В следующей таблице указаны примерные значения IOPS для различных типов дисков:
| Тип | IOPS |
| SSD(SLC) | 6000 |
| SSD(MLC) | 1000 |
| 15K RPM | 175-200 |
| 10K RPM | 125-150 |
| 7.2K RPM | 50-75 |
| RAID5 из 6 дисков с 10000 RPM | 900 |
Ниже приведены ряд рекомендаций по производительности дисков в IOPS для распространенных сервисов:
- Microsoft Exchange– с 5000 пользователей, каждый из которых получает 75 и отправляет 30 писем в день, потребует как минимум 3750 IOPS
- Microsoft SQL Server – с 3500 SQL транзакциями в секунду (TPS) — 28000 IOPS
- Обычный сервер приложений Windows на 10-100 пользователей — 10-40 IOPS
Кроме встроенных утилит в Windows, нужно упомяну одну из самых известных сторонних утилит программ для нагрузочного тестирования накопителей – CrystalDiskMark. Это простая графическая утилита для получения скорости чтения/записи (МБ/с) и IOPS. 





Еще в прошлом году пробовал аналогичный скрипт под diskspd. Под рукой не осталось, но думаю легко гуглиться.
Как-то криво замеры происходят. Как будто вся база в кэш влезает, хотя уже пробовал размер указывать 2х от объема оперативы плюс памяти контроллера. На Adaptec 5405 с 4мя SATA 7.2K дисками в Raid10 показал 800 IOPS при размере 1ГБ (кэш 4гб). При размере тестовой базы 5ГБ — 5000IOPS, а при 10ГБ уже около 20000. Хотя ожидал не больше 300-400.
Хм, интересный эффект.
Какая ОС и сколько памяти установлено на сервере, какие параметры файла подкачки?
Установлен на железо ESXi 6, замер производился в гостевой Windows 2012R2. Виртуальной машине выделено 4ГБ RAM, 2 ядра, адаптер контроллера Paravirtual, своп по выбору системы, текущее значение 1.7ГБ. На дисках write cache включен. Еще служба дедупликации данных работает. Может последняя дает эффект. Будет время, посмотрю на каких дисках активна и попробую директорию в исключения добавить.
Ничего удивительного, IOPS для дисков — это функция от близости расположения запрашиваемых данных на диске, если совсем забыть о кэшах — с ними ещё вероятность «оказалось в кэше» (ESX — точно ничего сам не накэшировал?).
track-to-track seek — 2 мс, «full stroke» — 20мс. Хотим быстро — делаем рейд из разделов поменьше, радуемся быстрому перемещению головок… Хотим читать ещё быстрее — добавляем зеркал или подобные способы (ZFS raidz/raidz2/raidz3 — умеет нагружать с пользой все диски при чтении, а не просто проверять чексумы) Да, железные контроллеры «так» зачастую не могут, их ценность только в наличии батарейки. Хотим быстро писать — журналирование на ФС превращает процесс в линейную запись…
*»данных (пропускная способность) около 5 Гбит/сек.»
там указывается в ГБайт/сек
<>
Ноль после запятой упустили.
Прдскажите, а что делать если ругается на отсутствует api-ms-win-core-libraryloader-l1-2-1 ?