====== 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 операций в секунду на запись