mod: Измерение скорости накопителя данных (3)
This commit is contained in:
parent
32b50a347e
commit
3ee178b1e6
@ -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` — **минимальное**, **среднее**, **максимальное** задержка выполнения запросов и **стандартное отклонение**, показатель того, насколько задержки разнятся между запросами.
|
|
||||||
|
Loading…
Reference in New Issue
Block a user