IOPS. Как измерить?

Несколько способов измерения производительности диска или дискового массива.

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=1ioengine=libaio –direct=1gtod_reduce=1name=fiotest –filename=fiotest –bs=4k –iodepth=64size=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 (микросекунд), что в целом очень хорошо! Если данный параметр будет превышать несколько миллисекунд, то с диском или дисковым массивом наблюдаются проблемы. Необходимо провести диагностику и найти “узкое место”, либо источник проблемы.

CrystalDiskMark - небольшая бесплатная программа, предназначенная для сравнительного тестирования быстродействия жестких дисков. Позволяет измерить скорость чтения и записи данных.

Загружаем и запускаем утилиту:

В программе представлено несколько тестов:

  • Sequential Tests (последовательная запись и чтение)
  • 4K Q8T8 (случайное чтение/запись блоков по 4Kб с глубиной 8 в 8 поток)
  • 4K Q1T1 (случайное чтение/запись блоков по 4Kб с глубиной 1 в 1 поток)
  • 4K QD32T1 (случайное чтение/запись блоков по 4Kб с глубиной 32 в 1 поток)

Запустим выполнение всех тестов и посмотрим на результат.

Посмотрим среднее количество IOPS на примере теста 4K Q8T8, для этого наведите курсор на значение и во всплывающей подсказке будет отображено количество IOPS.

59592 операций в секунду на чтение

28225 операций в секунду на запись