From 3ee178b1e66e5e6b76f44a34086dd24a32f8721d Mon Sep 17 00:00:00 2001 From: erjemin Date: Sat, 30 Nov 2024 12:33:32 +0300 Subject: [PATCH] =?UTF-8?q?mod:=20=D0=98=D0=B7=D0=BC=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BA=D0=BE=D1=80=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=D0=BA=D0=BE=D0=BF=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20(3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../measuring-performance-storage-devices.md | 240 ++++++++++++------ 1 file changed, 165 insertions(+), 75 deletions(-) diff --git a/raspberry-and-orange-pi/measuring-performance-storage-devices.md b/raspberry-and-orange-pi/measuring-performance-storage-devices.md index 4ff76f8..5cbbea5 100644 --- a/raspberry-and-orange-pi/measuring-performance-storage-devices.md +++ b/raspberry-and-orange-pi/measuring-performance-storage-devices.md @@ -3,7 +3,163 @@ Способов измерения скорости накопителей под 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) на дисках и файловых системах. Он гибко настраивается, поддерживает разные режимы ввода-вывода, размеры блоков, @@ -212,82 +368,16 @@ Disk stats (read/write): * Число операций: 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%) свидетельствует о том, что диск эффективно обрабатывает запросы в рамках установленной глубины очереди. +### Чистка + +Не забудьте удалить файлы `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` — **минимальное**, **среднее**, **максимальное** задержка выполнения запросов и **стандартное отклонение**, показатель того, насколько задержки разнятся между запросами.