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 - небольшая бесплатная программа, предназначенная для сравнительного тестирования быстродействия жестких дисков. Позволяет измерить скорость чтения и записи данных.
Загружаем и запускаем утилиту:
В программе представлено несколько тестов:
- Sequential Tests (последовательная запись и чтение)
- 4K Q8T8 (случайное чтение/запись блоков по 4Kб с глубиной 8 в 8 поток)
- 4K Q1T1 (случайное чтение/запись блоков по 4Kб с глубиной 1 в 1 поток)
- 4K QD32T1 (случайное чтение/запись блоков по 4Kб с глубиной 32 в 1 поток)
Запустим выполнение всех тестов и посмотрим на результат.
Посмотрим среднее количество IOPS на примере теста 4K Q8T8, для этого наведите курсор на значение и во всплывающей подсказке будет отображено количество IOPS.
59592 операций в секунду на чтение
28225 операций в секунду на запись