mod: Измерение скорости накопителя данных (3)

This commit is contained in:
Sergei Erjemin 2024-11-30 12:33:32 +03:00
parent 32b50a347e
commit 3ee178b1e6

View File

@ -3,7 +3,163 @@
Способов измерения скорости накопителей под Linux много, и можно подобрать такие, что более точно покажут Способов измерения скорости накопителей под Linux много, и можно подобрать такие, что более точно покажут
производительность именно на ваших задачах. производительность именно на ваших задачах.
## Тесты накопителей с помощью fio
## Самые простые измерения с помощью `dd`
Официально в Unix/Linux не существует строгого определения, что такое `dd`. Утилита берёт свое название
из команды "Data Definition" в языке описания данных IBM JCL (Job Control Language) для мейнфреймов.
Название намекает на ее основное предназначение — копирование и преобразование данных.
Использование `dd` для измерения скорости чтения и записи диска — не очень точные, т.к. это, по сути,
обычное копирование данных. Не учитываются такие факторы, такие как кэширование операционной системы,
фрагментация диска и т.д.
Тем не менее, `dd` подходит для быстрого теста. Вот, например, как это сделать:
#### Запись (Write)
```shell
dd if=/dev/zero of=/path/to/testfile bs=1G count=1 oflag=direct
```
Где:
* `if=/dev/zero` -- указывает, что источник данных -- это непрерывный поток нулей;
* `of=/path/to/testfile` -- задает файл, в который записываются данные. Убедитесь, что путь указывает на тестируемый диск;
* `bs=1G` -- размер блока (здесь 1 гигабайт за раз);
* `count=1` -- количество блоков для записи;
* `oflag=direct` -- обходит кэш операционной системы, что обеспечивает более точное измерение.
Результат для моего SSD NVMe Kingston SNV2S/2000G в Orange Pi 5 Plus:
```text
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 1.01244 s, 1.1 GB/s
```
Здесь 1.1 GB/s -- это скорость записи. Результат для eMCC памяти Orange Pi 5 Plus:
```text
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 4.76196 s, 225 MB/s
```
Как видим, скорость записи NVMe SSD более чем в 4 раза быстрее, чем у eMMC.
### Чтение (Read)
Теперь у нас есть тестовый файл, который мы можем использовать для измерения скорости чтения:
```shell
dd if=/path/to/testfile of=/dev/null bs=1G iflag=direct
```
Где:
* `if=/path/to/testfile` -- файл, созданный в предыдущем тесте.
* `of=/dev/null` -- данные не сохраняются, что позволяет измерять только скорость чтения.
* `bs=1G` -- размер блока.
* `iflag=direct` -- обходит кэш операционной системы.
Результат для SSD NVMe Kingston SNV2S/2000G в Orange Pi 5 Plus:
```text
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.74686 s, 1.4 GB/s
```
Для eMMC Orange Pi 5 Plus:
```text
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.8901 s, 276 MB/s
```
Как видим, скорость чтения NVMe SSD более чем в 5 раз выше, чем у eMMC.
### Советы по тестированию с помощью `dd`
* Используйте достаточно большой файл чтобы результаты были более репрезентативными. В идеале размер файла должен превышать объем оперативной памяти (правда это не всегда возможно).
* Очистите кэш перед тестом чтения: `sync; echo 3 > /proc/sys/vm/drop_caches`. Это предотвратит влияние системного кэша на тест.
* Помните: `dd` не моделирует реальное рабочее окружение. Результаты могут отличаться от повседневной нагрузки на диск.
* Не забудьте удалить тестовый файл после теста: `rm /path/to/testfile`
-----
## Измерение скорости операций ввода/вывода c помощью `ioping`
Исходя тз названия, казалось бы, утилита `ioping` проверяет задержки накопителей данных. И это справедливо для NAS. Она похож на ping, но для дисков. Но в реальности `ioping` — это более универсальный инструмент, который может использоваться для измерения скорости операций ввода/вывода (IOPS) и пропускной способности дисков.
Установим ioping:
```shell
sudo apt install ioping
```
Замер:
```shell
ioping -c 10 -s 1m -W .
```
Где:
* `-c 10` — количество замеров;
* `-s 10m` — размер блока данных для тестирования. `10m` — 10 мегабайт. В целом `ioping` — это тест производительности дисковой подсистемы, через измерения задержек при доступе к небольшим блокам данных (обычно 4 KiB). Но отлично работает и на больших блоках, оказывая производительность диска в целом.
* `-W`С записью вместо чтения. Это более безопасно для временного файла в целевом каталоге, и, кроме того, запись ввода-вывода даёт более надежные результаты для систем, где некэшированные чтения не поддерживаются
или происходит искажающее замеры кэширование на каком-то уровне.
* `.` — каталог, в котором будут производиться замеры. `.` — текущий каталог.
Другие ключи и опции можно посмотреть в справке `man ioping` или `ioping --help`.
Результаты теста будут примерно такими:
```text
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=1 time=21.1 ms (warmup)
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=2 time=29.7 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=3 time=23.5 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=4 time=22.3 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=5 time=21.7 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=6 time=23.1 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=7 time=21.7 ms (fast)
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=8 time=31.1 ms (slow)
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=9 time=23.0 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=10 time=22.7 ms
--- . (ext4 /dev/nvme0n1p2 1.79 TiB) ioping statistics ---
9 requests completed in 218.8 ms, 90 MiB written, 41 iops, 411.3 MiB/s
generated 10 requests in 9.04 s, 100 MiB, 1 iops, 11.1 MiB/s
min/avg/max/mdev = 21.7 ms / 24.3 ms / 31.1 ms / 3.32 ms
```
Сверху выводятся данные по индивидуальным запросам:
```text
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=1 time=21.1 ms (warmup)
```
Где:
* `10 MiB` — размер блока данных, к которому идет доступ;
* `<<< .` — текущая директория, на которой проводится тест;
* `(ext4 /dev/nvme0n1p2 1.79 TiB)` — файловая система (ext4) и устройство (/dev/nvme0n1p2) с емкостью 1.79 ТБ, где выполняется тест;
* `request=1` — номер запроса;
* `time=21.1 ms` — время выполнения запроса (в миллисекундах — `ms`, в микросекунды — `us`);
* `(warmup)` — первый запрос может использоваться для "прогрева", его результаты могут быть исключены из финальной статистики, `(fast)` — запрос выполнен быстрее, чем среднее время выполнения, `(slow)` — запрос выполнен медленнее, чем среднее время выполнения.
Снизу выводятся статистические данные по всем запросам:
```text
9 requests completed in 218.8 ms, 90 MiB written, 41 iops, 411.3 MiB/s
generated 10 requests in 9.04 s, 100 MiB, 1 iops, 11.1 MiB/s
min/avg/max/mdev = 21.7 ms / 24.3 ms / 31.1 ms / 3.32 ms
```
Где:
* `9 requests completed in 218.8 ms` — количество запросов, завершенных за время теста и общее время выполнения;
* `90 MiB written` — общий объем данных, записанных на диск;
* `41 iops` — количество операций ввода/вывода в секунду (IOPS);
* `411.3 MiB/s` — скорость записи данных на диск;
* `generated 10 requests in 9.04 s` — количество запросов, сгенерированных за время теста и общее время выполнения;
* `100 MiB` — общий объем данных, сгенерированных тестом;
* `1 iops` — количество операций ввода/вывода в секунду (IOPS) при генерации данных;
* `11.1 MiB/s` — скорость генерации данных;
* `min/avg/max/mdev = 21.7 ms / 24.3 ms / 31.1 ms / 3.32 ms`**минимальное**, **среднее**, **максимальное** задержка выполнения запросов и **стандартное отклонение**, показатель того, насколько задержки разнятся между запросами.
-----
## Тесты накопителей с помощью `fio`
`fio` (Flexible I/O Tester) — мощный инструмент для тестирования производительности систем ввода-вывода (I/O) на `fio` (Flexible I/O Tester) — мощный инструмент для тестирования производительности систем ввода-вывода (I/O) на
дисках и файловых системах. Он гибко настраивается, поддерживает разные режимы ввода-вывода, размеры блоков, дисках и файловых системах. Он гибко настраивается, поддерживает разные режимы ввода-вывода, размеры блоков,
@ -212,82 +368,16 @@ Disk stats (read/write):
* Число операций: 594831 операций чтения и 255707 операций записи. Диск был загружен на 100% времени, что ожидаемо для высокой глубины очереди (iodepth=32). * Число операций: 594831 операций чтения и 255707 операций записи. Диск был загружен на 100% времени, что ожидаемо для высокой глубины очереди (iodepth=32).
#### Общие выводы #### Общие выводы по M.2 SSD Kingston SNV2S/2000G установленном в мой Orange Pi 5 Plus
Для случайных операций на маленьких блоках (4 КБ) Kingston SNV2S/2000G демонстрирует хорошую производительность (средние 40.7 MB/s чтения и 17.5 MB/s записи). IOPS соответствуют значениям для высокопроизводительных NVMe SSD. Средние задержки в районе 200-300 микросекунд — это нормально для NVMe. Процентиль 99% показывает стабильность: отклонения есть, но они незначительны. Полная загрузка диска (util=100%) свидетельствует о том, что диск эффективно обрабатывает запросы в рамках установленной глубины очереди. Для случайных операций на маленьких блоках (4 КБ) Kingston SNV2S/2000G демонстрирует хорошую производительность (средние 40.7 MB/s чтения и 17.5 MB/s записи). IOPS соответствуют значениям для высокопроизводительных NVMe SSD. Средние задержки в районе 200-300 микросекунд — это нормально для NVMe. Процентиль 99% показывает стабильность: отклонения есть, но они незначительны. Полная загрузка диска (util=100%) свидетельствует о том, что диск эффективно обрабатывает запросы в рамках установленной глубины очереди.
### Чистка
Не забудьте удалить файлы `seq_nvme.*` после завершения теста, чтобы освободить место на диске.
```shell
rm seq_nvme.*
```
----- -----
## Измерение задержек (latency) операций ввода/вывода
Утилита ioping проверяет задержки накопителей данных (похож на ping, но для дисков).
Установим ioping:
```shell
sudo apt install ioping
```
Замер:
```shell
ioping -c 10 -s 1m -W .
```
Где:
* `-c 10` — количество замеров;
* `-s 10m` — размер блока данных для тестирования. `10m` — 10 мегабайт. В целом `ioping` — это тест производительности дисковой подсистемы, через измерения задержек при доступе к небольшим блокам данных (обычно 4 KiB). Но отлично работает и на больших блоках, оказывая производительность диска в целом.
* `-W`С записью вместо чтения. Это более безопасно для временного файла в целевом каталоге, и, кроме того, запись ввода-вывода даёт более надежные результаты для систем, где некэшированные чтения не поддерживаются
или происходит искажающее замеры кэширование на каком-то уровне.
* `.` — каталог, в котором будут производиться замеры. `.` — текущий каталог.
Другие ключи и опции можно посмотреть в справке `man ioping` или `ioping --help`.
Результаты теста будут примерно такими:
```text
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=1 time=21.1 ms (warmup)
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=2 time=29.7 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=3 time=23.5 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=4 time=22.3 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=5 time=21.7 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=6 time=23.1 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=7 time=21.7 ms (fast)
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=8 time=31.1 ms (slow)
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=9 time=23.0 ms
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=10 time=22.7 ms
--- . (ext4 /dev/nvme0n1p2 1.79 TiB) ioping statistics ---
9 requests completed in 218.8 ms, 90 MiB written, 41 iops, 411.3 MiB/s
generated 10 requests in 9.04 s, 100 MiB, 1 iops, 11.1 MiB/s
min/avg/max/mdev = 21.7 ms / 24.3 ms / 31.1 ms / 3.32 ms
```
Сверху выводятся данные по индивидуальным запросам:
```text
10 MiB >>> . (ext4 /dev/nvme0n1p2 1.79 TiB): request=1 time=21.1 ms (warmup)
```
Где:
* `10 MiB` — размер блока данных, к которому идет доступ;
* `<<< .` — текущая директория, на которой проводится тест;
* `(ext4 /dev/nvme0n1p2 1.79 TiB)` — файловая система (ext4) и устройство (/dev/nvme0n1p2) с емкостью 1.79 ТБ, где выполняется тест;
* `request=1` — номер запроса;
* `time=21.1 ms` — время выполнения запроса (в миллисекундах — `ms`, в микросекунды — `us`);
* `(warmup)` — первый запрос может использоваться для "прогрева", его результаты могут быть исключены из финальной статистики, `(fast)` — запрос выполнен быстрее, чем среднее время выполнения, `(slow)` — запрос выполнен медленнее, чем среднее время выполнения.
Снизу выводятся статистические данные по всем запросам:
```text
9 requests completed in 218.8 ms, 90 MiB written, 41 iops, 411.3 MiB/s
generated 10 requests in 9.04 s, 100 MiB, 1 iops, 11.1 MiB/s
min/avg/max/mdev = 21.7 ms / 24.3 ms / 31.1 ms / 3.32 ms
```
Где:
* `9 requests completed in 218.8 ms` — количество запросов, завершенных за время теста и общее время выполнения;
* `90 MiB written` — общий объем данных, записанных на диск;
* `41 iops` — количество операций ввода/вывода в секунду (IOPS);
* `411.3 MiB/s` — скорость записи данных на диск;
* `generated 10 requests in 9.04 s` — количество запросов, сгенерированных за время теста и общее время выполнения;
* `100 MiB` — общий объем данных, сгенерированных тестом;
* `1 iops` — количество операций ввода/вывода в секунду (IOPS) при генерации данных;
* `11.1 MiB/s` — скорость генерации данных;
* `min/avg/max/mdev = 21.7 ms / 24.3 ms / 31.1 ms / 3.32 ms`**минимальное**, **среднее**, **максимальное** задержка выполнения запросов и **стандартное отклонение**, показатель того, насколько задержки разнятся между запросами.