====== IOPS. Как измерить? ======
Несколько способов измерения производительности диска или дискового массива.
==== Измерение случайных IOPS с помощью FIO ====
**FIO** - популярный инструмент для измерения **IOPS** на сервере **Linux**.\\
Достаточно гибкий и простой инструмент в пользовании.
В статье будет рассмотрено несколько вариантов проверки, а именно случайное чтение, случайная запись и их комбинация блоками по 4Кб с многопоточностью.
== Установка в CentOS/RHEL ==
|
yum install epel-release -y && yum install fio -y
|
== Установка в Debian/Ubuntu ==
|
apt-get install fio
|
=== Тест случайных операций на чтение/запись ===
Данный тест создаст файл размером **4Гб** и выполнит чтение и запись **4Кб** с использованием разделения **75%/25%** в файле, причем одновременно будет выполняться **64 операции**. На каждые 3 операции чтения - одна операция на запись.
fio –randrepeat=1 –ioengine=libaio –direct=1 –gtod_reduce=1 –name=fiotest –filename=fiotest –bs=4k –iodepth=64 –size=4G –readwrite=randrw –rwmixread=75
Результат выполнения команды будет приблизительно следующим:
fiotest: (g=0): rw=randrw, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.2.8
Starting 1 process
fiotest: Laying out IO file(s) (1 file(s) / 4096MB)
Jobs: 1 (f=1): [m(1)] [100.0% done] [122.6MB/41948KB/0KB /s] [31.3K/10.5K/0 iops] [eta 00m:00s]
fiotest: (groupid=0, jobs=1): err= 0: pid=11948: Mon Mar 12 20:43:15 2018
read : io=3071.7MB, bw=128462KB/s, iops=32115, runt= 24485msec
write: io=1024.4MB, bw=42839KB/s, iops=10709, runt= 24485msec
cpu : usr=7.07%, sys=32.69%, ctx=48944, majf=0, minf=27
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%,>=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%,>=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%,>=64=0.0%
issued : total=r=786347/w=262229/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
READ: io=3071.7MB, aggrb=128461KB/s, minb=128461KB/s, maxb=128461KB/s, mint=24485msec, maxt=24485msec
WRITE: io=1024.4MB, aggrb=42839KB/s, minb=42839KB/s, maxb=42839KB/s, mint=24485msec, maxt=24485msec
Disk stats (read/write):
dm-0: ios=782987/261131, merge=0/0, ticks=1154639/286253, in_queue=1441157, util=99.65%, aggrios=786347/262229, aggrmerge=0/0, aggrticks=1163953/287616, aggrin_queue=1451392, aggrutil=99.59%
sda: ios=786347/262229, merge=0/0, ticks=1163953/287616, in_queue=1451392, util=99.59%
Исходя из полученной информации делаем вывод, что наш диск в среднем выполняет **32115** операций на чтение и **10709** на запись. (//Соотношение 3/1//)
read : io=3071.7MB, bw=128462KB/s, iops=32115, runt= 24485msec
write: io=1024.4MB, bw=42839KB/s, iops=10709, runt= 24485msec
=== Тест случайных операций на чтение ===
Для измерения количества случайных операций на чтение выполняем следующую команду:
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=fiotest --bs=4k --iodepth=64 --size=4G --readwrite=randread
Результат выполнения команды будет приблизительно следующим:
test: (g=0): rw=randread, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.2.8
Starting 1 process
test: Laying out IO file(s) (1 file(s) / 4096MB)
Jobs: 1 (f=1): [r(1)] [100.0% done] [218.4MB/0KB/0KB /s] [55.9K/0/0 iops] [eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=12140: Mon Mar 12 20:50:22 2018
read : io=4096.0MB, bw=223054KB/s, iops=55763, runt= 18804msec
cpu : usr=9.33%, sys=38.98%, ctx=56455, majf=0, minf=94
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%,>=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%,>=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%,>=64=0.0%
issued : total=r=1048576/w=0/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
READ: io=4096.0MB, aggrb=223053KB/s, minb=223053KB/s, maxb=223053KB/s, mint=18804msec, maxt=18804msec
Disk stats (read/write):
dm-0: ios=1042660/4, merge=0/0, ticks=1074010/4, in_queue=1074126, util=99.53%, aggrios=1048576/3, aggrmerge=0/1, aggrticks=1088231/3, aggrin_queue=1088042, aggrutil=99.47%
sda: ios=1048576/3, merge=0/1, ticks=1088231/3, in_queue=1088042, util=99.47%
Результаты теста показывают **55763** операций чтения в секунду, что очень хорошо для локального **SSD**.
|
read : io=4096.0MB, bw=223054KB/s, iops=55763, runt= 18804msec
|
=== Тест случайных операций на запись ===
Для измерения количества случайных операций на запись выполняем следующую команду:
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=fiotest --bs=4k --iodepth=64 --size=4G --readwrite=randwrite
Результат выполнения команды будет приблизительно следующим:
test: (g=0): rw=randwrite, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=64
fio-2.2.8
Starting 1 process
Jobs: 1 (f=1): [w(1)] [100.0% done] [0KB/122.1MB/0KB /s] [0/31.5K/0 iops] [eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=12169: Mon Mar 12 20:55:50 2018
write: io=4096.0MB, bw=114642KB/s, iops=28660, runt= 36586msec
cpu : usr=4.72%, sys=21.78%, ctx=31043, majf=0, minf=28
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%,>=64=100.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%,>=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%,>=64=0.0%
issued : total=r=0/w=1048576/d=0, short=r=0/w=0/d=0, drop=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=64
Run status group 0 (all jobs):
WRITE: io=4096.0MB, aggrb=114642KB/s, minb=114642KB/s, maxb=114642KB/s, mint=36586msec, maxt=36586msec
Disk stats (read/write):
dm-0: ios=0/1040722, merge=0/0, ticks=0/2181650, in_queue=2181906, util=99.79%, aggrios=0/1048579, aggrmerge=0/0, aggrticks=0/2190553, aggrin_queue=2190371, aggrutil=99.73%
sda: ios=0/1048579, merge=0/0, ticks=0/2190553, in_queue=2190371, util=99.73%
Результаты теста показывают **28660** операций на запись в секунду.
|
write: io=4096.0MB, bw=114642KB/s, iops=28660, runt= 36586msec
|
Последним аспектом оценки производительности диска является измерение задержки по отдельным запросам. Один из способов выяснить это - воспользоваться утилитой **ioping**.
# ioping -c 10 .
4 KiB <<<. (xfs /dev/dm-0): request=1 time=106.1 us (warmup)
4 KiB <<<. (xfs /dev/dm-0): request=2 time=128.9 us
4 KiB <<<. (xfs /dev/dm-0): request=3 time=163.7 us
4 KiB <<<. (xfs /dev/dm-0): request=4 time=136.6 us
4 KiB <<<. (xfs /dev/dm-0): request=5 time=152.3 us
4 KiB <<<. (xfs /dev/dm-0): request=6 time=141.6 us
4 KiB <<<. (xfs /dev/dm-0): request=7 time=139.1 us
4 KiB <<<. (xfs /dev/dm-0): request=8 time=129.6 us (fast)
4 KiB <<<. (xfs /dev/dm-0): request=9 time=130.7 us
4 KiB <<<. (xfs /dev/dm-0): request=10 time=126.8 us (fast)
--- . (xfs /dev/dm-0) ioping statistics ---
9 requests completed in 1.25 ms, 36 KiB read, 7.20 k iops, 28.1 MiB/s
generated 10 requests in 9.00 s, 40 KiB, 1 iops, 4.44 KiB/s
min/avg/max/mdev = 126.8 us / 138.8 us / 163.7 us / 11.6 us
Среднее значение задержки **138.8 us** (//микросекунд//), что в целом очень хорошо! Если данный параметр будет превышать несколько миллисекунд, то с диском или дисковым массивом наблюдаются проблемы. Необходимо провести диагностику и найти “узкое место”, либо источник проблемы.
==== Измерение IOPS с помощью CrystalDiskMark в Windows ====
**CrystalDiskMark** - небольшая бесплатная программа, предназначенная для сравнительного тестирования быстродействия жестких дисков. Позволяет измерить скорость чтения и записи данных.
Загружаем и запускаем утилиту:
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/001.png?nolink&}}
В программе представлено несколько тестов:
* Sequential Tests (//последовательная запись и чтение//)
* 4K Q8T8 (//случайное чтение/запись блоков по 4Kб с глубиной 8 в 8 поток//)
* 4K Q1T1 (//случайное чтение/запись блоков по 4Kб с глубиной 1 в 1 поток//)
* 4K QD32T1 (//случайное чтение/запись блоков по 4Kб с глубиной 32 в 1 поток//)
Запустим выполнение всех тестов и посмотрим на результат.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/002.png?nolink&}}
Посмотрим среднее количество **IOPS** на примере теста **4K Q8T8**, для этого наведите курсор на значение и во всплывающей подсказке будет отображено количество **IOPS**.
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/003.png?nolink&}}
59592 операций в секунду на чтение
{{https://fatalex.cifro.net/lib/plugins/ckgedit/fckeditor/userfiles/image/hardware/004.png?nolink&}}
28225 операций в секунду на запись