Инструкция по измерению производительности дисковой подсистемы для unix-OS с помощью утилиты FIO #70

Измерения проводятся с помощью утилиты fio (GitHub проекта https://github.com/axboe/fio/)

Инструкция сделана на примере Ubuntu 14.04 LTS. Для других дистрибутивов внесите необходимые правки в конфигурационные файлы и вызовы команд.

Для получение реальных показателей производительности, во время теста ВМ не должны иметь нагрузку по вводу\выводу на диски ВМ. То есть «рабочая» нагрузка по вводу\выводу должна быть отключена!
 
Стандарт производительности дисков Облакотеки
 
Для измерения производительности жестких дисков мы оперируем тремя параметрами - максимальное количество IOPS (операций ввода-вывода), гарантированное количество IOPS и время отклика.
Для всех клиентов Облакотеки эти параметры в зависимости от формата диска имеют следующую величину:
 

 

Установка

apt install fio
 
Перед началом тестирования
 
Внимание! Обязательно убедитесь, что в параметрах теста указываете корректные данные тестируемого диска и на диске есть достаточно места для размещения тестовых данных. Ошибка может привести к краху системы и потере данных.
  1. Просмотреть список доступных дисков можно командой fdisk –l. В нашем примере будет приведен тест трех дисков, соответственно для каждого из них будут следующие данные: /dev/sda, /dev/sdb, и /dev/sdc
        2. Убедитесь, что на тестируемом разделе есть минимум 4Гб свободного места. Сделать это можно командой df -H

Настройка теста

Параметры тестирования задаются через конфигурационный файл. Создайте конфигурационный файл test.ini, например, в домашнем каталоге пользователя. Для примера файл будет размещен в каталоге /home со следующим содержимым:
 
[test IOPS]
blocksize=8k
filename=/tmp/testfile
filesize=4G
direct=1
buffered=0
ioengine=libaio
iodepth=64
rw=randrw
rwmixwrite=30
runtime=10
clat_percentiles=0
unlink=1
 
В параметре filename нужно указывать путь куда, смонтирован тестируемый диск. В нашем примере, мы будет размещать файл в папку /tmp
 
Внимание! Обязательно убедитесь, что в параметре filename указаны корректные данные диска. Ошибка может привести к краху системы и потере данных.

Запуск теста

Тест запускается с правами суперпользователя. Для нашего примера строка запуска тестирования выглядит следующим образом:
 
sudo fio /home/test.ini

Результаты

Тип тестирования, это выполнение последовательных операций чтение/записи в случайном порядке. Результат получаем отдельно для чтения и отдельно для записи. Ключевые данные отмечены на скриншоте ниже желтым цветом:
Нас интересуют показатели iops и lat:
 - IOPS количество операций чтения и записи в секунду. В данном тесте, чтобы получить общий результат, необходимо вывести среднее значение iops из результатов для чтения и записи;
 - lat – задержка диска, необходимо ориентироваться на среднее (avg) значение. Для получения общего результата, нужно вывести среднее значение из двух результатов для чтения и записи.
 
Внимание! Значение lat может быть указано в usec (микросекунды) или в msec (миллисекунды). Так как эталонное значение задержки приводится в миллисекундах, тогда значение usec надо разделить на 1000 чтобы получить искомый результат.
 
Вывод команды может быть перенаправлен в файл с помощью ключа –output=файл отчета
Например,
 
fio test.ini –output=/home/iopstest.log
 
выведет отчет утилиты в файл /home/iopstest.log
 
Примеры тестов
 
Результат тестирования Архив диска:
test IOPS sas: (g=0): rw=randrw, bs=8K-8K/8K-8K/8K-8K, ioengine=libaio, iodepth=64
fio-2.1.3
Starting 1 process
test IOPS sas: (groupid=0, jobs=1): err= 0: pid=1566: Fri Nov 25 15:55:43 2016
  read : io=162368KB, bw=16143KB/s, iops=2017, runt= 10058msec
    slat (usec): min=2, max=823, avg= 6.25, stdev=12.77
    clat (usec): min=56, max=142119, avg=17968.11, stdev=14617.01
     lat (usec): min=65, max=142130, avg=17975.38, stdev=14616.60
    bw (KB  /s): min= 8415, max=19864, per=100.00%, avg=16156.58, stdev=2241.18
  write: io=69856KB, bw=6945.4KB/s, iops=868, runt= 10058msec
    slat (usec): min=2, max=306, avg= 6.37, stdev= 7.63
    clat (usec): min=269, max=431185, avg=31910.24, stdev=38785.25
     lat (usec): min=273, max=431189, avg=31917.70, stdev=38785.38
    bw (KB  /s): min= 4966, max= 8159, per=100.00%, avg=6947.84, stdev=861.88
    lat (usec) : 100=0.01%, 250=7.46%, 500=5.31%, 750=2.50%, 1000=1.47%
    lat (msec) : 2=1.67%, 4=1.61%, 10=4.66%, 20=32.08%, 50=38.05%
    lat (msec) : 100=3.75%, 250=1.17%, 500=0.26%
  cpu          : usr=1.24%, sys=2.83%, ctx=10087, majf=0, minf=26
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=99.8%
     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=20296/w=8732/d=0, short=r=0/w=0/d=0
Run status group 0 (all jobs):
   READ: io=162368KB, aggrb=16143KB/s, minb=16143KB/s, maxb=16143KB/s, mint=10058msec, maxt=10058msec
  WRITE: io=69856KB, aggrb=6945KB/s, minb=6945KB/s, maxb=6945KB/s, mint=10058msec, maxt=10058msec
Disk stats (read/write):
  sda: ios=19990/8615, merge=0/5, ticks=352676/276084, in_queue=629820, util=99.12%
В итоге получаем:
IOPS = 2017 + 868 = 1442
Задержка = (17,97 + 31,92) / 2 = 24,95
Результаты соответствуют заявленным!
 
Результат тестирования Супер диска:
test IOPS ssd: (g=0): rw=randrw, bs=8K-8K/8K-8K/8K-8K, ioengine=libaio, iodepth=64
fio-2.1.3
Starting 1 process
test IOPS ssd: (groupid=0, jobs=1): err= 0: pid=1552: Fri Nov 25 15:54:37 2016
  read : io=564536KB, bw=56420KB/s, iops=7052, runt= 10006msec
    slat (usec): min=2, max=1938, avg= 5.63, stdev=11.89
    clat (usec): min=209, max=38701, avg=6430.08, stdev=10463.03
     lat (usec): min=213, max=38707, avg=6436.86, stdev=10462.89
    bw (KB  /s): min=53700, max=64924, per=99.96%, avg=56397.65, stdev=2285.46
  write: io=242256KB, bw=24211KB/s, iops=3026, runt= 10006msec
    slat (usec): min=2, max=846, avg= 6.00, stdev= 9.58
    clat (usec): min=300, max=33056, avg=6128.39, stdev=10422.34
     lat (usec): min=304, max=33060, avg=6135.54, stdev=10422.26
    bw (KB  /s): min=23104, max=27298, per=99.94%, avg=24197.65, stdev=882.40
    lat (usec) : 250=0.02%, 500=3.50%, 750=17.17%, 1000=26.93%
    lat (msec) : 2=26.26%, 4=4.42%, 10=1.37%, 20=0.81%, 50=19.53%
  cpu          : usr=3.74%, sys=8.75%, ctx=10905, majf=0, minf=25
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=99.9%
     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=70567/w=30282/d=0, short=r=0/w=0/d=0
Run status group 0 (all jobs):
   READ: io=564536KB, aggrb=56419KB/s, minb=56419KB/s, maxb=56419KB/s, mint=10006msec, maxt=10006msec
  WRITE: io=242256KB, aggrb=24211KB/s, minb=24211KB/s, maxb=24211KB/s, mint=10006msec, maxt=10006msec
Disk stats (read/write):
  sdb: ios=70615/30260, merge=0/0, ticks=443236/181276, in_queue=624768, util=99.41%
 
В итоге получаем:
IOPS = 7052 + 3026 = 5039
Задержка = (6,4 + 6,1) / 2 = 6,25
Результаты соответствуют заявленным!
 
Результат тестирования Стандарт диска:
test IOPS sata: (g=0): rw=randrw, bs=8K-8K/8K-8K/8K-8K, ioengine=libaio, iodepth=64
fio-2.1.3
Starting 1 process
test IOPS sata: (groupid=0, jobs=1): err= 0: pid=1595: Fri Nov 25 15:58:50 2016
  read : io=73408KB, bw=6849.7KB/s, iops=856, runt= 10717msec
    slat (usec): min=2, max=379, avg= 7.52, stdev= 8.59
    clat (usec): min=210, max=1031.5K, avg=55892.85, stdev=96467.69
     lat (usec): min=215, max=1031.5K, avg=55901.45, stdev=96467.78
    bw (KB  /s): min=   43, max=10080, per=100.00%, avg=7226.90, stdev=2734.89
  write: io=31456KB, bw=2935.2KB/s, iops=366, runt= 10717msec
    slat (usec): min=2, max=793, avg= 8.01, stdev=14.24
    clat (usec): min=207, max=816962, avg=43848.98, stdev=36152.34
     lat (usec): min=211, max=816973, avg=43858.14, stdev=36152.35
    bw (KB  /s): min=   58, max= 4192, per=100.00%, avg=3115.50, stdev=1178.20
    lat (usec) : 250=0.10%, 500=0.98%, 750=0.24%, 1000=0.24%
    lat (msec) : 2=0.17%, 4=0.10%, 10=0.50%, 20=1.25%, 50=63.33%
    lat (msec) : 100=30.94%, 250=0.16%, 500=0.97%, 750=0.08%, 1000=0.93%
    lat (msec) : 2000=0.01%
  cpu          : usr=0.64%, sys=1.46%, ctx=5120, majf=0, minf=25
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.2%, >=64=99.5%
     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=9176/w=3932/d=0, short=r=0/w=0/d=0
Run status group 0 (all jobs):
   READ: io=73408KB, aggrb=6849KB/s, minb=6849KB/s, maxb=6849KB/s, mint=10717msec, maxt=10717msec
  WRITE: io=31456KB, aggrb=2935KB/s, minb=2935KB/s, maxb=2935KB/s, mint=10717msec, maxt=10717msec
Disk stats (read/write):
  sdc: ios=9250/3931, merge=0/0, ticks=489368/171652, in_queue=661712, util=99.27%
 
В итоге получаем:
IOPS = 856 + 366 = 611
Задержка = (55,9 + 43,86) / 2 = 49,88
Результаты соответствуют заявленным!