Утилита fio для windows

Overview and history

Fio was originally written to save me the hassle of writing special test case
programs when I wanted to test a specific workload, either for performance
reasons or to find/reproduce a bug. The process of writing such a test app can
be tiresome, especially if you have to do it often. Hence I needed a tool that
would be able to simulate a given I/O workload without resorting to writing a
tailored test case again and again.

A test work load is difficult to define, though. There can be any number of
processes or threads involved, and they can each be using their own way of
generating I/O. You could have someone dirtying large amounts of memory in a
memory mapped file, or maybe several threads issuing reads using asynchronous
I/O. fio needed to be flexible enough to simulate both of these cases, and many
more.

Fio spawns a number of threads or processes doing a particular type of I/O
action as specified by the user. fio takes a number of global parameters, each
inherited by the thread unless otherwise parameters given to them overriding
that setting is given. The typical use of fio is to write a job file matching
the I/O load one wants to simulate.

Source

Fio resides in a git repo, the canonical place is:

https://git.kernel.dk/cgit/fio/

Snapshots are frequently generated and :file:`fio-git-*.tar.gz` include the git
meta data as well. Other tarballs are archives of official fio releases.
Snapshots can download from:

https://brick.kernel.dk/snaps/

There are also two official mirrors. Both of these are automatically synced with
the main repository, when changes are pushed. If the main repo is down for some
reason, either one of these is safe to use as a backup:

https://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git

https://github.com/axboe/fio.git

Mailing list

The fio project mailing list is meant for anything related to fio including
general discussion, bug reporting, questions, and development. For bug reporting,
see REPORTING-BUGS.

An automated mail detailing recent commits is automatically sent to the list at
most daily. The list address is fio@vger.kernel.org, subscribe by sending an
email to fio+subscribe@vger.kernel.org or visit
https://subspace.kernel.org/vger.kernel.org.html.

Archives can be found here:

https://www.spinics.net/lists/fio/

or here:

https://lore.kernel.org/fio/

and archives for the old list can be found here:

http://maillist.kernel.dk/fio-devel/

Author

Fio was written by Jens Axboe <axboe@kernel.dk> to enable flexible testing of
the Linux I/O subsystem and schedulers. He got tired of writing specific test
applications to simulate a given workload, and found that the existing I/O
benchmark/test tools out there weren’t flexible enough to do what he wanted.

Jens Axboe <axboe@kernel.dk> 20060905

Maintainers

Fio is maintained by Jens Axboe <axboe@kernel.dk and
Vincent Fu <vincentfu@gmail.com> — however, for reporting bugs please use
the fio reflector or the GitHub page rather than email any of them
directly. By using the public resources, others will be able to learn from
the responses too. Chances are also good that other members will be able to
help with your inquiry as well.

Binary packages

Debian:
Starting with Debian «Squeeze», fio packages are part of the official
Debian repository. https://packages.debian.org/search?keywords=fio .
Ubuntu:
Starting with Ubuntu 10.04 LTS (aka «Lucid Lynx»), fio packages are part
of the Ubuntu «universe» repository.
https://packages.ubuntu.com/search?keywords=fio .
Red Hat, Fedora, CentOS & Co:
Starting with Fedora 9/Extra Packages for Enterprise Linux 4, fio
packages are part of the Fedora/EPEL repositories.
https://packages.fedoraproject.org/pkgs/fio/ .
Mandriva:
Mandriva has integrated fio into their package repository, so installing
on that distro should be as easy as typing urpmi fio.
Arch Linux:
An Arch Linux package is provided under the Community sub-repository:
https://www.archlinux.org/packages/?sort=&q=fio
Solaris:
Packages for Solaris are available from OpenCSW. Install their pkgutil
tool (http://www.opencsw.org/get-it/pkgutil/) and then install fio via
pkgutil -i fio.
Windows:
Beginning with fio 3.31 Windows installers for tagged releases are
available on GitHub at https://github.com/axboe/fio/releases. The
latest installers for Windows can also be obtained as GitHub Actions
artifacts by selecting a build from
https://github.com/axboe/fio/actions. These require logging in to a
GitHub account.
BSDs:
Packages for BSDs may be available from their binary package repositories.
Look for a package «fio» using their binary package managers.

Building

Just type:

$ ./configure
$ make
$ make install

Note that GNU make is required. On BSDs it’s available from devel/gmake within
ports directory; on Solaris it’s in the SUNWgmake package. On platforms where
GNU make isn’t the default, type gmake instead of make.

Configure will print the enabled options. Note that on Linux based platforms,
the libaio development packages must be installed to use the libaio
engine. Depending on the distro, it is usually called libaio-devel or libaio-dev.

For gfio, gtk 2.18 (or newer), associated glib threads, and cairo are required
to be installed. gfio isn’t built automatically and can be enabled with a
--enable-gfio option to configure.

To build fio with a cross-compiler:

$ make clean
$ make CROSS_COMPILE=/path/to/toolchain/prefix

Configure will attempt to determine the target platform automatically.

It’s possible to build fio for ESX as well, use the --esx switch to
configure.

The HTTP engine is enabled depending on if the curl and openssl shared libraries
are detected on the system. For Ubuntu, these packages are libcurl4-openssl-dev
and libssl-dev.

Windows

The minimum versions of Windows for building/running fio are Windows 7/Windows
Server 2008 R2. On Windows, Cygwin (https://www.cygwin.com/) is required in
order to build fio. To create an MSI installer package install WiX from
https://wixtoolset.org and run :file:`dobuild.cmd` from the :file:`os/windows`
directory.

How to compile fio on 64-bit Windows:

  1. Install Cygwin (https://www.cygwin.com/). Install make and all
    packages starting with mingw64-x86_64. Ensure
    mingw64-x86_64-zlib are installed if you wish
    to enable fio’s log compression functionality.
  2. Open the Cygwin Terminal.
  3. Go to the fio directory (source files).
  4. Run make clean && make -j.

To build fio for 32-bit Windows, ensure the -i686 versions of the previously
mentioned -x86_64 packages are installed and run ./configure
--build-32bit-win
before make.

It’s recommended that once built or installed, fio be run in a Command Prompt or
other ‘native’ console such as console2, since there are known to be display and
signal issues when running it under a Cygwin shell (see
mintty/mintty#56 and
https://github.com/mintty/mintty/wiki/Tips#inputoutput-interaction-with-alien-programs
for details).

Documentation

Fio uses Sphinx to generate documentation from the reStructuredText files.
To build HTML formatted documentation run make -C doc html and direct your
browser to :file:`./doc/output/html/index.html`. To build manual page run
make -C doc man and then man doc/output/man/fio.1. To see what other
output formats are supported run make -C doc help.

Platforms

Fio works on (at least) Linux, Solaris, AIX, HP-UX, OSX, NetBSD, OpenBSD,
Windows, FreeBSD, and DragonFly. Some features and/or options may only be
available on some of the platforms, typically because those features only apply
to that platform (like the solarisaio engine, or the splice engine on Linux).

Some features are not available on FreeBSD/Solaris even if they could be
implemented, I’d be happy to take patches for that. An example of that is disk
utility statistics and (I think) huge page support, support for that does exist
in FreeBSD/Solaris.

Fio uses pthread mutexes for signaling and locking and some platforms do not
support process shared pthread mutexes. As a result, on such platforms only
threads are supported. This could be fixed with sysv ipc locking or other
locking alternatives.

Other *BSD platforms are untested, but fio should work there almost out of the
box. Since I don’t do test runs or even compiles on those platforms, your
mileage may vary. Sending me patches for other platforms is greatly
appreciated. There’s a lot of value in having the same test/benchmark tool
available on all platforms.

Note that POSIX aio is not enabled by default on AIX. Messages like these:

Symbol resolution failed for /usr/lib/libc.a(posix_aio.o) because:
    Symbol _posix_kaio_rdwr (number 2) is not exported from dependent module /unix.

indicate one needs to enable POSIX aio. Run the following commands as root:

# lsdev -C -l posix_aio0
    posix_aio0 Defined  Posix Asynchronous I/O
# cfgmgr -l posix_aio0
# lsdev -C -l posix_aio0
    posix_aio0 Available  Posix Asynchronous I/O

POSIX aio should work now. To make the change permanent:

# chdev -l posix_aio0 -P -a autoconfig='available'
    posix_aio0 changed

Running fio

Running fio is normally the easiest part — you just give it the job file
(or job files) as parameters:

$ fio [options] [jobfile] ...

and it will start doing what the jobfile tells it to do. You can give more
than one job file on the command line, fio will serialize the running of those
files. Internally that is the same as using the :option:`stonewall` parameter
described in the parameter section.

If the job file contains only one job, you may as well just give the parameters
on the command line. The command line parameters are identical to the job
parameters, with a few extra that control global parameters. For example, for
the job file parameter :option:`iodepth=2 <iodepth>`, the mirror command line
option would be :option:`—iodepth 2 <iodepth>` or :option:`—iodepth=2
<iodepth>`
. You can also use the command line for giving more than one job
entry. For each :option:`—name <name>` option that fio sees, it will start a
new job with that name. Command line entries following a
:option:`—name <name>` entry will apply to that job, until there are no more
entries or a new :option:`—name <name>` entry is seen. This is similar to the
job file options, where each option applies to the current job until a new []
job entry is seen.

fio does not need to run as root, except if the files or devices specified in
the job section requires that. Some other options may also be restricted, such
as memory locking, I/O scheduler switching, and decreasing the nice value.

If jobfile is specified as -, the job file will be read from standard
input.

--iodepth=1 this is how deep we’re willing to try to stack commands in the OS’s queue. Since we set this to 1, this is effectively pretty much the same thing as the sync IO engine—we’re only asking for a single operation at a time, and the OS has to acknowledge receipt of every operation we ask for before we can ask for another. (It does not have to satisfy the request itself before we ask it to do more operations, it just has to acknowledge that we actually asked for it.)

--runtime=60 --time_based Run for sixty seconds—and even if we complete sooner, just start over again and keep going until 60 seconds is up.

--end_fsync=1 After all operations have been queued, keep the timer going until the OS reports that the very last one of them has been successfully completed—ie, actually written to disk.

Interpreting fio’s output

This is the entire output from the 4K random I/O run on my Ubuntu workstation:

root@banshee:/tmp# fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --size=4g --numjobs=1 --runtime=60 --time_based --end_fsync=1
random-write: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=posixaio
fio-3.12
Starting 1 process
Jobs: 1 (f=1): [w(1)][100.0%][eta 00m:00s]                          
random-write: (groupid=0, jobs=1): err= 0: pid=16109: Wed Feb  5 15:09:36 2020
  write: IOPS=32.5k, BW=127MiB/s (133MB/s)(8192MiB/64602msec); 0 zone resets
    slat (nsec): min=250, max=555439, avg=1388.31, stdev=833.19
    clat (nsec): min=90, max=20251k, avg=9642.34, stdev=179381.02
     lat (usec): min=3, max=20252, avg=11.03, stdev=179.39
    clat percentiles (usec):
     |  1.00th=[    4],  5.00th=[    4], 10.00th=[    4], 20.00th=[    5],
     | 30.00th=[    6], 40.00th=[    6], 50.00th=[    7], 60.00th=[    8],
     | 70.00th=[    9], 80.00th=[   10], 90.00th=[   11], 95.00th=[   12],
     | 99.00th=[   17], 99.50th=[   20], 99.90th=[   43], 99.95th=[   77],
     | 99.99th=[12387]
   bw (  KiB/s): min=22256, max=613312, per=100.00%, avg=335527.28, stdev=162778.06, samples=50
   iops        : min= 5564, max=153328, avg=83881.88, stdev=40694.66, samples=50
  lat (nsec)   : 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (usec)   : 2=0.01%, 4=13.96%, 10=68.85%, 20=16.68%, 50=0.41%
  lat (usec)   : 100=0.04%, 250=0.01%, 500=0.01%, 750=0.01%, 1000=0.01%
  lat (msec)   : 2=0.01%, 10=0.01%, 20=0.01%, 50=0.01%
  cpu          : usr=6.35%, sys=11.96%, ctx=2348924, majf=0, minf=48
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.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.0%, >=64=0.0%
     issued rwts: total=0,2097153,0,1 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=1

Run status group 0 (all jobs):
  WRITE: bw=127MiB/s (133MB/s), 127MiB/s-127MiB/s (133MB/s-133MB/s), io=8192MiB (8590MB), run=64602-64602msec

Disk stats (read/write):
    md0: ios=71/749877, merge=0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=351/737911, aggrmerge=0/12145, aggrticks=1875/260901, aggrin_queue=30910, aggrutil=83.73%
  sdb: ios=342/737392, merge=0/12663, ticks=1832/241034, in_queue=28672, util=83.35%
  sda: ios=361/738430, merge=0/11628, ticks=1918/280768, in_queue=33148, util=83.73%

This may seem like a lot. It is a lot! But there’s only one piece you’ll likely care about, in most cases—the line directly under «Run status group 0 (all jobs):» is the one with the aggregate throughput. Fio is capable of running as many wildly different jobs in parallel as you’d like to execute complex workload models. But since we’re only running one job group, we’ve only got one line of aggregates to look through.

Run status group 0 (all jobs):
  WRITE: bw=127MiB/s (133MB/s), 127MiB/s-127MiB/s (133MB/s-133MB/s), io=8192MiB (8590MB), run=64602-64602msec

First, we’re seeing output in both MiB/sec and MB/sec. MiB means «mebibytes»—measured in powers of two—where MB means «megabytes,» measured in powers of ten. Mebibytes—1024×1024 bytes—are what operating systems and filesystems actually measure data in, so that’s the reading you care about.

Run status group 0 (all jobs):
  WRITE: bw=127MiB/s (133MB/s), 127MiB/s-127MiB/s (133MB/s-133MB/s), io=8192MiB (8590MB), run=64602-64602msec

In addition to only having a single job group, we only have a single job in this test—we didn’t ask fio to, for example, run sixteen parallel 4K random write processes—so although the second bit shows minimum and maximum range, in this case it’s just a repeat of the overall aggregate. If we’d had multiple processes, we’d see the slowest process to the fastest process represented here.

Category:

  • IT
  • Cancel

Одним из самых перспективных средств тестирования дискового перформанса на сегодняшний день является утилита fio.

Исторически я пользовался много лет для этого популярным IOmeter, и даже писал несколько подробных постов о нем, неизменно приводящих в этот блог читателей с поисковиков.

Однако IOmeter достаточно давно затормозился в развитии, и на сегодняшний день имеет stable в версии аж 2006(!) года, а собираемый community имеет версию 1.1RC1 и обновлялся аж летом 2011 года, что никак нельзя назвать приемлемым. К тому же отдельные версии (Linux x64, например) имеют крайне досадные баги, сводящие на нет его применимость под эти платформы.

Поэтому все больше людей для тестирования производительности ищут более современные инструменты. По этой причине несколько месяцев назад мне попался на глаза очень активно развивающийся проект такой утилиты измерения производительности — fio (flexible input-output tester).

О тестировании дисковой подсистемы с помощью fio можно почитать например вот в этой статье.

К сожалению до недавних пор fio существовал только под Linux, поэтому было очень любопытно обнаружить в блоге нетапповского инженера Neto статью о сборке fio под Windows x64.

Нет смысла перепощивать ее сюда, там коротенько и совершенно понятно как и что делать, даже без перевода, так что просто сошлюсь на нее здесь.

Эта запись в блоге about NetApp, она находится по адресу http://blog.aboutnetapp.ru/archives/1243.
Если вы хотите прокомментировать ее — сделайте это там http://blog.aboutnetapp.ru/archives/1243#comments.

Установка
Синтаксис
Опции
Формат файла задания
Параметры файла задания
Примеры работы
Тесты производительности операций ввода-вывода в секунду
Тест скорости записи
Тест скорости чтения
Тест скорости чтения/записи
Тест пропускной способности
Использование файла задания
Тест с разными значениями iodepth
Удаление результатов тестирования

Окружение

  • Версия РЕД ОС: 8
  • Конфигурация: Рабочая станция, Сервер графический, Сервер минимальный
  • Версия ПО: fio-3.28-2

Fio (Flexible I/O Tester) — это инструмент, который позволяет запускать несколько потоков или процессов для выполнения операций ввода-вывода, заданных пользователем. Обычно fio используется для создания файла задания, описывающего нагрузку на ввод-вывод, которую необходимо смоделировать. Для получения точного результата тестирования производительности системы хранения данных важно учитывать несколько ключевых аспектов.

Выбор типов тестов и параметров fio является важным, поскольку такие настройки, как размер блока данных (bs) и количество задач (numjobs), могут существенно влиять на результаты. Изменение этих параметров может привести к получению различных данных о производительности. Поэтому следует стремиться к единообразию параметров на всех тестируемых стендах.

Важно!

Не запускайте тесты fio с рабочей нагрузкой на запись (readwrite, randrw, write, trimwrite) непосредственно на используемом устройстве. Для проведения таких тестов рекомендуется использовать тестовые среды или резервные устройства, чтобы избежать потери данных и негативных последствий для основного рабочего устройства.

Установка

Для установки утилиты выполните в терминале команду (потребуются права администратора):

 sudo dnf install fio

Синтаксис

Утилита доступна для запуска через терминал при помощи команды следующего вида:

 fio [<Опции>] [<Файл задания>]

Опции

Основные опции fio:

  • —debug=<параметры> — включает ведение журнала отладки;

  • —parse-only — анализирует файл задания и выводит настройки, без операций ввода;

  • —merge-blktrace-only — объединяет вывод blktrace (трассировка блоков) из предыдущих тестов;

  • —output=имя_файла — указывает файл для записи результатов;

  • —output-format=формат — устанавливает формат вывода;

  • —bandwidth-log — включает ведение журнала пропускной способности;

  • —minimal — выводит минимально необходимую информацию;

  • —append-terse — дополняет короткий вывод предыдущих результатов;

  • —terse-version=версия — указывает версию для короткого вывода;

  • —version — выводит информацию о версии программы и завершает работу;

  • —help — показывает справку по командам;

  • —cpuclock-test — тестирует тактовую частоту процессора;

  • —crctest=[тест] — запускает тест контрольной суммы;

  • —cmdhelp=команда — выводит справку по указанной команде;

  • —enghelp=[ввод-вывод[,команда]] — выводит справку по указанному механизму ввода-вывода и команде;

  • —showcmd — показывает команду, которую нужно использовать для запуска текущей конфигурации;

  • —readonly — работает в режиме только для чтения;

  • —eta=when — показывает время до завершения (ETA) теста;

  • —eta-interval=время — интервал обновления информации о ETA;

  • —eta-newline=время — интервал добавления новой строки в вывод ETA;

  • —status-interval=время — интервал обновления статуса;

  • —section=имя — указывает конкретный раздел конфигурации для выполнения;

  • —alloc-size=kb — устанавливает размер выделения памяти в КБ;

  • —warnings-fatal — обрабатывает предупреждения как ошибки;

  • —max-jobs=номер — максимальное количество параллельных задач;

  • —server=аргументы — запускает fio в режиме сервера с указанными аргументами;

  • —daemonize=pid-файл — запускает fio как фоновый процесс и записывает PID в файл;

  • —client=имя_хоста — подключается к серверу fio на указанном хосте;

  • —remote-config=файл — использует удалённый конфигурационный файл;

  • —idle-prof=опция — формирует отчёт о простое процессора, опция может быть одной из следующих:

    • calibrate — выполняет калибровку и завершает работу;
    • system — показывает общий уровень простоя системы и единичную работу;
    • percpu — как system, но также показывает время простоя каждого процессора;
  • —inflate-log=журнал_регистрации — увеличить размер лог-файла;

  • —trigger-file=файл — выполняет команду запуска, когда файл существует;

  • —trigger-timeout=время — время ожидания перед запуском триггера;

  • —trigger=команда — устанавливает команду в качестве локального триггера;

  • —trigger-remote=команда — устанавливает команду в качестве удалённого запуска;

  • —aux-path=путь — вспомогательный путь для временных файлов вместо текущего рабочего каталога.

Формат файла задания

Любые параметры, следующие за опциями, будут считаться файлами заданий, если они не соответствуют параметру файла задания. В списке может быть несколько файлов заданий, и каждый файл задания будет рассматриваться как отдельная группа.

Fio принимает один или несколько файлов заданий, описывающих, что он должен делать. Формат файла задания — классический ini-файл, в котором имена, заключённые в квадратные скобки [], определяют название задания. Можно использовать любое имя в формате ASCII, кроме global, которое имеет предопределенное значение. После названия задания указывается последовательность из параметров, которые определяют поведение задания.

В разделе global устанавливаются значения по умолчанию для заданий, описанных в этом файле. Задание может переопределять параметр *global* section, а файл задания может также содержать несколько глобальных параметров.

Параметры файла задания

Для некоторых параметров используется параметр определённого типа, например, целое число или строка. Везде, где требуется числовое значение, можно использовать арифметическое выражение, при условии, что оно заключено в круглые скобки.

Поддерживаются следующие операции:

  • сложение (+),

  • вычитание (-),

  • умножение (*),

  • деление (/),

  • модуль (%),

  • возведение в степень (^).

Для значений времени в выражениях по умолчанию единицами измерения являются микросекунды.

Основные параметры для задания:

  • —name — имя теста (можно изменить на любое другое);
  • —filename — путь к файлу, который будет использоваться для тестирования I/O;
  • —directory — каталог, который будет использоваться для тестирования I/O;
  • —size — размер файла для теста;
  • —direct — использование прямых I/O, обходящих кеш операционной системы;
  • —rw — режим теста (чтение, запись или оба);
  • —bs — размер блока ввода-вывода (I/O) для теста;
  • —ioengine — механизм ввода-вывода, который будет использоваться для теста (например, libaio для асинхронного ввода-вывода);
  • —iodepth — глубина очереди запросов на ввод-вывод для теста (количество одновременных запросов к файловой системе);
  • —runtime — время выполнения теста;
  • —numjobs — количество параллельных задач для теста;
  • —time_based — время работы будет использоваться для определения длительности теста;
  • —group_reporting — режим групповой отчётности (результаты будут отображаться для каждой группы рабочих нитей, а не для каждого рабочего потока);
  • —eta-newline — интервал отображения прогресса выполнения теста и перевода строки.

Примеры работы

Тесты производительности операций ввода-вывода в секунду

Для тестирования пропускной способности используется одновременное чтение и запись небольшими блоками с использованием множества процессов. Тесты измеряют количество операций чтения/записи, которые система может выполнить за секунду.

Тесты являются показателем производительности хранилища данных или системы ввода-вывода и позволяют оценить скорость обработки операций ввода и вывода данных, независимо от их объёма. Чем выше значение IOPS, тем быстрее система может обрабатывать запросы на чтение и запись данных.

Важно!

При выполнении тестирования на запись в указанном файле данные перезаписываются. Поэтому не рекомендуется указывать в качестве файла блочное устройство с нужными данными.

Тест скорости записи

Перед выполнением теста убедитесь, что в указанной директории достаточно свободного места (более 5 ГБ) для завершения теста.

 fio --name=fiotest --blocksize=4k --directory=/home/user --size=5g --ioengine=libaio --iodepth=256 --runtime=60 --rw=randwrite --direct=1

где:

  • —name=fiotest — имя теста (можно изменить на любое другое);
  • —blocksize=4k — размер блока данных для теста (4 КБ);

  • —directory=/home/user — каталог, в котором будет проводиться тест;

  • —size=5g — размер файла для теста (5 ГБ);

  • —ioengine=libaio — использование libaio (асинхронный ввод-вывод);

  • —iodepth=256 — глубина очереди (256 запросов одновременно);

  • —runtime=60 — время выполнения теста (60 секунд);

  • —rw=randwrite — режим теста (случайная запись);

  • —direct=1 — использование прямого доступа к устройству (чтобы избежать кеширования данных).

В результате запуска команды будет проведён тест производительности I/O на указанном каталоге с указанными параметрами.

Результат:

fiotest: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=256
fio-3.28
Starting 1 process
fiotest: Laying out IO file (1 file / 5120MiB)
Jobs: 1 (f=1): [w(1)][100.0%][w=33.4MiB/s][w=8540 IOPS][eta 00m:00s]
fiotest: (groupid=0, jobs=1): err= 0: pid=3906: Tue Jul 30 12:05:52 2024
  write: IOPS=1354, BW=5418KiB/s (5548kB/s)(317MiB/60001msec); 0 zone resets
    slat (usec): min=4, max=7229.8k, avg=733.37, stdev=53817.01
    clat (usec): min=23, max=11931k, avg=188197.99, stdev=1188675.61
     lat (usec): min=89, max=11931k, avg=188931.83, stdev=1190998.57
    clat percentiles (msec):
     |  1.00th=[   10],  5.00th=[   12], 10.00th=[   12], 20.00th=[   13],
     | 30.00th=[   13], 40.00th=[   14], 50.00th=[   14], 60.00th=[   15],
     | 70.00th=[   20], 80.00th=[   27], 90.00th=[   75], 95.00th=[  184],
     | 99.00th=[ 7886], 99.50th=[11476], 99.90th=[11879], 99.95th=[11879],
     | 99.99th=[11879]
   bw (  KiB/s): min=    8, max=68669, per=100.00%, avg=17068.00, stdev=18091.84, samples=35
   iops        : min=    2, max=17167, avg=4266.94, stdev=4522.95, samples=35
  lat (usec)   : 50=0.01%, 100=0.01%, 250=0.01%, 500=0.02%, 750=0.02%
  lat (usec)   : 1000=0.02%
  lat (msec)   : 2=0.07%, 4=0.12%, 10=1.00%, 20=69.48%, 50=15.80%
  lat (msec)   : 100=5.15%, 250=4.88%, 500=0.76%, 750=0.08%, 1000=0.57%
  lat (msec)   : 2000=0.16%, >=2000=1.87%
  cpu          : usr=0.67%, sys=4.04%, ctx=77891, majf=0, minf=15
  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.0%, >=64=0.1%
     issued rwts: total=0,81270,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=256

Run status group 0 (all jobs):
  WRITE: bw=5418KiB/s (5548kB/s), 5418KiB/s-5418KiB/s (5548kB/s-5548kB/s), io=317MiB (333MB), run=60001-60001msec

Disk stats (read/write):
  sda: ios=3/77906, merge=0/1835, ticks=63/698196, in_queue=716266, util=95.37%

где:

  • slat — время подачи операции ввода-вывода (задержка);

  • clat — время от подачи до завершения операции ввода-вывода (задержка завершения);

  • lat — полная задержка от создания до завершения операции;

  • bw — пропускная способность: количество образцов и процент от общей пропускной способности;

  • iops — IOPS-статистика операций в секунду;

  • lat (nsec/usec/msec) — распределение задержек завершения операций ввода-вывода;

  • cpu — использование процессора и количество переключений контекста, дефектов страниц;

  • IO depths — распределение глубин ввода-вывода за время существования задания;

  • IO submit — количество операций ввода-вывода, отправленных в одном вызове;

  • IO complete — количество завершённых операций ввода-вывода;

  • IO issued rwt — количество отправленных запросов на чтение/запись/обрезку, короткие или отброшенные;

  • IO latency — задержки ввода-вывода для достижения заданной цели.

После того как каждый клиент был перечислен, появляются статистические данные для группы:

Run status group 0 (all jobs):
  WRITE: bw=5418KiB/s (5548kB/s), 5418KiB/s-5418KiB/s (5548kB/s-5548kB/s), io=317MiB (333MB), run=60001-60001msec

где:

  • WRITE — указывает, что результаты относятся к операциям записи;
  • bw — совокупная пропускная способность потоков в заданной группе, за которой следуют минимальная и максимальная пропускная способность всех потоков в группе. 5418KiB/s-5418KiB/s (5548kB/s-5548kB/s) — диапазон скоростей записи, достигнутых в ходе теста, является фиксированным;

  • io — совокупный объём выполненных операций ввода-вывода всех потоков в группе;

  • run — самое короткое и самое длинное время выполнения потоков в группе.

В конце выводится статистика по дискам:

Disk stats (read/write):
  sda: ios=3/77906, merge=0/1835, ticks=63/698196, in_queue=716266, util=95.37%

где:

  • ios — количество операций ввода-вывода, выполненных всеми группами (3 — количество операций чтения, 77906 — количество операций записи);

  • merge — количество объединений, выполненных планировщиком ввода-вывода (иногда несколько операций могут быть объединены в одну, чтобы снизить нагрузку на систему). 0 — количество объединённых операций чтения, 1835 — количество объединённых операций записи.

  • ticks — количество тактов, в течение которых диск был занят, 63 — время, затраченное на операции чтения (в миллисекундах), 698196 — время, затраченное на операции записи (в миллисекундах);

  • in_queue — общее время, проведённое в очереди на выполнение (в миллисекундах);

  • util — занятость устройства, отображаемая в процентах (95.37%). Значение, близкое к 100%, может указывать на высокую загрузку диска и на необходимость оптимизации или добавления дополнительного оборудования.

Тест скорости чтения

Для корректного выполнения команды тестирования скорости чтения с приведёнными ниже параметрами необходимо выполнить следующие условия:

  • для выполнения теста в директории /home/user автоматически будут созданы файлы для каждого задания, количество которых определяется параметром —numjobs, размер файлов определяется параметром  —size;

  • пользователь, под которым запускается команда fio, должен иметь права на чтение/запись файлов в директории /home/user.

 fio --directory=/home/user --direct=1 --rw=randread --bs=4k --ioengine=libaio --iodepth=256 --runtime=60 --numjobs=3 --time_based --group_reporting --name=iops-test-job --eta-newline=1 --size=1G

где:

  • —directory=/home/user — каталог /home/user, в котором будут созданы тестовые файлы;

  • —direct=1 — включает режим прямого ввода-вывода, обходя кеширование в операционной системе;

  • —rw=randread — тип выполняемых операций ввода-вывода (randread означает случайное чтение). В режиме randread fio будет случайным образом выбирать блоки для чтения;

  • —bs=4k — устанавливает размер блока ввода-вывода на 4 КБ, каждая операция чтения будет обрабатывать 4 КБ данных;

  • —ioengine=libaio — указывает механизм ввода-вывода, libaio использует асинхронные операции ввода-вывода, позволяет одновременно запускать несколько запросов ввода-вывода, не дожидаясь завершения предыдущих;

  • —iodepth=256 — задаёт глубину очереди операций ввода-вывода, 256 операций могут находиться в очереди на выполнение одновременно;

  • —runtime=60 — устанавливает время выполнения теста в секундах;

  • —numjobs=3 — определяет количество параллельно выполняемых заданий, тест будет выполняться с тремя потоками;

  • —time_based — указывает, что тест должен быть основан на времени, а не на объёме данных;

  • —group_reporting — включает групповой отчёт, результаты всех заданий будут объединены и представлены как один общий результат;

  • —name=iops-test-job — имя задания;

  • —eta-newline=1 — опция, которая указывает fio обновлять строку с расчётным оставшимся временем (ETA) каждую секунду.

Результат:

iops-test-job: (g=0): rw=randread, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=256
...
fio-3.28
Starting 3 processes
Jobs: 3 (f=3): [r(3)][4.9%][r=129MiB/s][r=33.1k IOPS][eta 00m:58s]
Jobs: 3 (f=3): [r(3)][6.6%][r=120MiB/s][r=30.7k IOPS][eta 00m:57s]
Jobs: 3 (f=3): [r(3)][9.8%][r=128MiB/s][r=32.8k IOPS][eta 00m:55s] 
Jobs: 3 (f=3): [r(3)][13.1%][r=138MiB/s][r=35.4k IOPS][eta 00m:53s] 
Jobs: 3 (f=3): [r(3)][14.8%][r=139MiB/s][r=35.6k IOPS][eta 00m:52s]
Jobs: 3 (f=3): [r(3)][16.4%][r=137MiB/s][r=35.0k IOPS][eta 00m:51s]
Jobs: 3 (f=3): [r(3)][18.0%][r=139MiB/s][r=35.6k IOPS][eta 00m:50s]
Jobs: 3 (f=3): [r(3)][19.7%][r=139MiB/s][r=35.7k IOPS][eta 00m:49s]
Jobs: 3 (f=3): [r(3)][21.3%][r=133MiB/s][r=34.0k IOPS][eta 00m:48s]
Jobs: 3 (f=3): [r(3)][24.6%][r=139MiB/s][r=35.7k IOPS][eta 00m:46s] 
Jobs: 3 (f=3): [r(3)][27.9%][r=138MiB/s][r=35.3k IOPS][eta 00m:44s] 
Jobs: 3 (f=3): [r(3)][29.5%][r=140MiB/s][r=35.8k IOPS][eta 00m:43s]
Jobs: 3 (f=3): [r(3)][32.8%][r=139MiB/s][r=35.5k IOPS][eta 00m:41s] 
Jobs: 3 (f=3): [r(3)][36.1%][r=140MiB/s][r=35.8k IOPS][eta 00m:39s] 
Jobs: 3 (f=3): [r(3)][40.0%][r=139MiB/s][r=35.5k IOPS][eta 00m:36s] 
Jobs: 3 (f=3): [r(3)][41.0%][r=139MiB/s][r=35.7k IOPS][eta 00m:36s]
Jobs: 3 (f=3): [r(3)][44.3%][r=140MiB/s][r=35.7k IOPS][eta 00m:34s] 
Jobs: 3 (f=3): [r(3)][47.5%][r=138MiB/s][r=35.4k IOPS][eta 00m:32s] 
Jobs: 3 (f=3): [r(3)][50.8%][r=139MiB/s][r=35.7k IOPS][eta 00m:30s] 
Jobs: 3 (f=3): [r(3)][53.3%][r=138MiB/s][r=35.2k IOPS][eta 00m:28s]
Jobs: 3 (f=3): [r(3)][54.1%][r=126MiB/s][r=32.4k IOPS][eta 00m:28s]
Jobs: 3 (f=3): [r(3)][57.4%][r=139MiB/s][r=35.7k IOPS][eta 00m:26s] 
Jobs: 3 (f=3): [r(3)][60.0%][r=139MiB/s][r=35.6k IOPS][eta 00m:24s]
Jobs: 3 (f=3): [r(3)][60.7%][r=139MiB/s][r=35.7k IOPS][eta 00m:24s]
Jobs: 3 (f=3): [r(3)][63.9%][r=139MiB/s][r=35.7k IOPS][eta 00m:22s] 
Jobs: 3 (f=3): [r(3)][65.6%][r=139MiB/s][r=35.7k IOPS][eta 00m:21s]
Jobs: 3 (f=3): [r(3)][68.9%][r=139MiB/s][r=35.7k IOPS][eta 00m:19s] 
Jobs: 3 (f=3): [r(3)][70.5%][r=136MiB/s][r=34.9k IOPS][eta 00m:18s]
Jobs: 3 (f=3): [r(3)][73.8%][r=134MiB/s][r=34.2k IOPS][eta 00m:16s] 
Jobs: 3 (f=3): [r(3)][78.3%][r=135MiB/s][r=34.5k IOPS][eta 00m:13s] 
Jobs: 3 (f=3): [r(3)][80.3%][r=135MiB/s][r=34.5k IOPS][eta 00m:12s] 
Jobs: 3 (f=3): [r(3)][83.6%][r=136MiB/s][r=34.7k IOPS][eta 00m:10s] 
Jobs: 3 (f=3): [r(3)][85.2%][r=133MiB/s][r=34.2k IOPS][eta 00m:09s]
Jobs: 3 (f=3): [r(3)][86.9%][r=134MiB/s][r=34.3k IOPS][eta 00m:08s]
Jobs: 3 (f=3): [r(3)][88.5%][r=133MiB/s][r=34.1k IOPS][eta 00m:07s]
Jobs: 3 (f=3): [r(3)][91.8%][r=136MiB/s][r=34.8k IOPS][eta 00m:05s] 
Jobs: 3 (f=3): [r(3)][95.1%][r=128MiB/s][r=32.6k IOPS][eta 00m:03s] 
Jobs: 3 (f=3): [r(3)][96.7%][r=126MiB/s][r=32.2k IOPS][eta 00m:02s]
Jobs: 3 (f=3): [r(3)][100.0%][r=130MiB/s][r=33.2k IOPS][eta 00m:00s]
iops-test-job: (groupid=0, jobs=3): err= 0: pid=3593: Tue Jul 30 21:43:19 2024
  read: IOPS=34.7k, BW=136MiB/s (142MB/s)(8133MiB/60007msec)
    slat (nsec): min=1166, max=97127k, avg=75924.61, stdev=510067.56
    clat (usec): min=2, max=123674, avg=22035.95, stdev=4534.57
     lat (msec): min=6, max=123, avg=22.11, stdev= 4.54
    clat percentiles (msec):
     |  1.00th=[   16],  5.00th=[   18], 10.00th=[   19], 20.00th=[   20],
     | 30.00th=[   21], 40.00th=[   21], 50.00th=[   22], 60.00th=[   23],
     | 70.00th=[   24], 80.00th=[   24], 90.00th=[   26], 95.00th=[   27],
     | 99.00th=[   34], 99.50th=[   40], 99.90th=[   91], 99.95th=[  101],
     | 99.99th=[  117]
   bw (  KiB/s): min=103294, max=148248, per=100.00%, avg=138926.83, stdev=2412.68, samples=357
   iops        : min=25823, max=37062, avg=34731.20, stdev=603.19, samples=357
  lat (usec)   : 4=0.01%
  lat (msec)   : 10=0.03%, 20=27.34%, 50=72.31%, 100=0.25%, 250=0.06%
  cpu          : usr=2.31%, sys=13.81%, ctx=45133, majf=0, minf=805
  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.0%, >=64=0.1%
     issued rwts: total=2081938,0,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=256

Run status group 0 (all jobs):
   READ: bw=136MiB/s (142MB/s), 136MiB/s-136MiB/s (142MB/s-142MB/s), io=8133MiB (8528MB), run=60007-60007msec

Disk stats (read/write):
  sda: ios=2055328/37, merge=82/22, ticks=487922/130, in_queue=488058, util=80.34%

где:

  • iops — среднее количество операций ввода/вывода в секунду (34,700 операций чтения в секунду);
  • bw — средняя скорость передачи данных — 136 МБ/с;

  • latency — среднее время, которое требуется для завершения одной операции чтения — 22.11 миллисекунды;

  • clat percentiles — показывает, какое время задержки имеет определённый процент запросов:

    • 1% запросов имеют задержку менее 16 мс;

    • 50% запросов имеют задержку менее 22 мс;

    • 99% запросов имеют задержку менее 34 мс.

  • cpu — процентное использование процессора: usr=2.31%, sys=13.81% (2.31% используется для пользовательских задач, 13.81% для системных задач);

  • IO depths — все операции ввода/вывода были выполнены с глубиной очереди 64 или больше: >=64=100.0%;

  • общее количество данных прочитано: 8133 МБ (8.528 ГБ);

  • средняя скорость чтения: 136 МБ/с;

  • среднее количество операций чтения в секунду: 34,700 IOPS;

  • процент выполнения операций:

    • 50% операций завершены за 22 мс или меньше;

    • 95% операций завершены за 27 мс или меньше.

Результат показывает:

  • выполнение операций чтения с пропускной способностью в 136 МБ/с и 34.7k IOPS;

  • среднее время задержки в 22 мс и латентность в 100 мс для 99% операций демонстрируют, что задержки относительно стабильны и приемлемы для большинства операций;

  • процент использования процессора относительно низкий, что указывает на то, что CPU не является узким местом в тесте.

Тест скорости чтения/записи

 fio --directory=/home/user --direct=1 --rw=randrw --bs=4k --ioengine=libaio --iodepth=256 --runtime=60 --numjobs=3 --time_based --group_reporting --name=iops-test-job --eta-newline=1

где:

  • —directory=/home/user — директория, где будут производиться тесты ввода-вывода;

  • —direct=1 — активирует прямой ввод-вывод, что означает, что операции не будут кешироваться операционной системой;

  • —rw=randrw — режим работы, тест будет одновременно выполнять операции чтения и записи в случайном порядке;

  • —bs=4k — устанавливает размер блока для операций ввода-вывода, размер блока равен 4 КБ (4096 байт);

  • —ioengine=libaio — механизм ввода-вывода, libaio — асинхронный ввод-вывод через библиотеку libaio;

  • —iodepth=256 — определяет глубину очереди ввода-вывода (256 — максимальное количество операций ввода-вывода, которые могут находиться в ожидании одновременно);

  • —runtime=60 — устанавливает время работы теста в секундах — 60 секунд (1 минута);

  • —numjobs=3 — количество задач, которые будут выполняться параллельно;

  • —time_based — задаёт режим тестирования по времени, а не по количеству операций;

  • —group_reporting — указывает, что результаты теста должны группироваться и выводиться в одном отчёте для всех задач, а не по отдельности для каждой;

  • —name=iops-test-job — задаёт имя теста, которое будет отображаться в результатах;

  • —eta-newline=1 — выводит оставшееся время в следующей строке в процессе выполнения теста.

Результат:

iops-test-job: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=256
...
fio-3.28
Starting 3 processes
fio: io_u error on file /home/user/iops-test-job.1.0: No space left on device: write offset=1053564928, buflen=4096
fio: io_u error on file /home/user/iops-test-job.1.0: No space left on device: write offset=1066758144, buflen=4096
fio: io_u error on file /home/user/iops-test-job.1.0: No space left on device: write offset=1072381952, buflen=4096
fio: io_u error on file /home/user/iops-test-job.1.0: No space left on device: write offset=1066737664, buflen=4096
fio: io_u error on file /home/user/iops-test-job.1.0: No space left on device: write offset=1039486976, buflen=4096
fio: io_u error on file /home/user/iops-test-job.1.0: No space left on device: write offset=1033895936, buflen=4096
fio: pid=3773, err=28/file:io_u.c:1845, func=io_u error, error=No space left on device
Jobs: 2 (f=2): [m(2),X(1)][4.9%][r=47.4MiB/s,w=46.8MiB/s][r=12.1k,w=12.0k IOPS][eta 00m:58s]
Jobs: 2 (f=2): [m(2),X(1)][8.2%][r=51.2MiB/s,w=50.3MiB/s][r=13.1k,w=12.9k IOPS][eta 00m:56s] 
Jobs: 2 (f=2): [m(2),X(1)][9.8%][r=47.4MiB/s,w=48.7MiB/s][r=12.1k,w=12.5k IOPS][eta 00m:55s]
Jobs: 2 (f=2): [m(2),X(1)][11.5%][r=44.5MiB/s,w=44.5MiB/s][r=11.4k,w=11.4k IOPS][eta 00m:54s]
Jobs: 2 (f=2): [m(2),X(1)][13.1%][r=47.0MiB/s,w=46.6MiB/s][r=12.0k,w=11.9k IOPS][eta 00m:53s]
Jobs: 2 (f=2): [m(2),X(1)][16.4%][r=44.6MiB/s,w=45.0MiB/s][r=11.4k,w=11.5k IOPS][eta 00m:51s] 
Jobs: 2 (f=2): [m(2),X(1)][18.0%][r=47.4MiB/s,w=47.5MiB/s][r=12.1k,w=12.2k IOPS][eta 00m:50s]
Jobs: 2 (f=2): [m(2),X(1)][21.3%][r=43.3MiB/s,w=43.6MiB/s][r=11.1k,w=11.2k IOPS][eta 00m:48s] 
Jobs: 2 (f=2): [m(2),X(1)][23.0%][r=43.4MiB/s,w=43.7MiB/s][r=11.1k,w=11.2k IOPS][eta 00m:47s]
Jobs: 2 (f=2): [m(2),X(1)][26.2%][r=47.7MiB/s,w=47.3MiB/s][r=12.2k,w=12.1k IOPS][eta 00m:45s] 
Jobs: 2 (f=2): [m(2),X(1)][29.5%][r=46.8MiB/s,w=47.2MiB/s][r=12.0k,w=12.1k IOPS][eta 00m:43s] 
Jobs: 2 (f=2): [m(2),X(1)][32.8%][r=47.6MiB/s,w=47.4MiB/s][r=12.2k,w=12.1k IOPS][eta 00m:41s] 
Jobs: 2 (f=2): [m(2),X(1)][36.1%][r=46.5MiB/s,w=47.1MiB/s][r=11.9k,w=12.1k IOPS][eta 00m:39s] 
Jobs: 2 (f=2): [m(2),X(1)][40.0%][r=50.2MiB/s,w=49.8MiB/s][r=12.9k,w=12.7k IOPS][eta 00m:36s] 
Jobs: 2 (f=2): [m(2),X(1)][41.0%][r=49.3MiB/s,w=49.1MiB/s][r=12.6k,w=12.6k IOPS][eta 00m:36s]
Jobs: 2 (f=2): [m(2),X(1)][44.3%][r=47.6MiB/s,w=47.6MiB/s][r=12.2k,w=12.2k IOPS][eta 00m:34s] 
Jobs: 2 (f=2): [m(2),X(1)][47.5%][r=49.8MiB/s,w=49.7MiB/s][r=12.8k,w=12.7k IOPS][eta 00m:32s] 
Jobs: 2 (f=2): [m(2),X(1)][49.2%][r=49.0MiB/s,w=48.8MiB/s][r=12.6k,w=12.5k IOPS][eta 00m:31s]
Jobs: 2 (f=2): [m(2),X(1)][53.3%][r=48.3MiB/s,w=49.3MiB/s][r=12.4k,w=12.6k IOPS][eta 00m:28s] 
Jobs: 2 (f=2): [m(2),X(1)][56.7%][r=48.6MiB/s,w=49.0MiB/s][r=12.4k,w=12.5k IOPS][eta 00m:26s] 
Jobs: 2 (f=2): [m(2),X(1)][60.0%][r=48.0MiB/s,w=47.8MiB/s][r=12.3k,w=12.2k IOPS][eta 00m:24s] 
Jobs: 2 (f=2): [m(2),X(1)][60.7%][r=48.0MiB/s,w=48.1MiB/s][r=12.3k,w=12.3k IOPS][eta 00m:24s]
Jobs: 2 (f=2): [m(2),X(1)][63.9%][r=51.0MiB/s,w=50.6MiB/s][r=13.1k,w=13.0k IOPS][eta 00m:22s] 
Jobs: 2 (f=2): [m(2),X(1)][67.2%][r=49.8MiB/s,w=49.5MiB/s][r=12.7k,w=12.7k IOPS][eta 00m:20s] 
Jobs: 2 (f=2): [m(2),X(1)][70.5%][r=49.0MiB/s,w=50.3MiB/s][r=12.5k,w=12.9k IOPS][eta 00m:18s] 
Jobs: 2 (f=2): [m(2),X(1)][73.8%][r=48.5MiB/s,w=49.4MiB/s][r=12.4k,w=12.7k IOPS][eta 00m:16s] 
Jobs: 2 (f=2): [m(2),X(1)][78.3%][r=48.2MiB/s,w=47.3MiB/s][r=12.3k,w=12.1k IOPS][eta 00m:13s] 
Jobs: 2 (f=2): [m(2),X(1)][80.3%][r=50.3MiB/s,w=49.4MiB/s][r=12.9k,w=12.7k IOPS][eta 00m:12s] 
Jobs: 2 (f=2): [m(2),X(1)][83.6%][r=50.2MiB/s,w=49.0MiB/s][r=12.9k,w=12.5k IOPS][eta 00m:10s] 
Jobs: 2 (f=2): [m(2),X(1)][85.2%][r=47.5MiB/s,w=47.7MiB/s][r=12.2k,w=12.2k IOPS][eta 00m:09s]
Jobs: 2 (f=2): [m(2),X(1)][86.9%][r=50.1MiB/s,w=49.5MiB/s][r=12.8k,w=12.7k IOPS][eta 00m:08s]
Jobs: 2 (f=2): [m(2),X(1)][90.2%][r=48.8MiB/s,w=49.6MiB/s][r=12.5k,w=12.7k IOPS][eta 00m:06s] 
Jobs: 2 (f=2): [m(2),X(1)][93.4%][r=48.4MiB/s,w=47.4MiB/s][r=12.4k,w=12.1k IOPS][eta 00m:04s] 
Jobs: 2 (f=2): [m(2),X(1)][96.7%][r=47.5MiB/s,w=48.7MiB/s][r=12.2k,w=12.5k IOPS][eta 00m:02s] 
Jobs: 2 (f=2): [m(2),X(1)][98.4%][r=49.8MiB/s,w=49.5MiB/s][r=12.8k,w=12.7k IOPS][eta 00m:01s]
Jobs: 2 (f=2): [m(2),X(1)][100.0%][r=48.9MiB/s,w=47.9MiB/s][r=12.5k,w=12.3k IOPS][eta 00m:00s]
iops-test-job: (groupid=0, jobs=3): err=28 (file:io_u.c:1845, func=io_u error, error=No space left on device): pid=3771: Tue Jul 30 23:06:17 2024
  read: IOPS=12.3k, BW=48.1MiB/s (50.4MB/s)(2886MiB/60002msec)
    slat (nsec): min=1679, max=61519k, avg=57980.28, stdev=147149.84
    clat (usec): min=1126, max=163039, avg=20880.35, stdev=5236.80
     lat (usec): min=1188, max=163066, avg=20938.57, stdev=5236.55
    clat percentiles (usec):
     |  1.00th=[14746],  5.00th=[15664], 10.00th=[16057], 20.00th=[16581],
     | 30.00th=[17171], 40.00th=[17957], 50.00th=[18744], 60.00th=[21627],
     | 70.00th=[23200], 80.00th=[24773], 90.00th=[27132], 95.00th=[31327],
     | 99.00th=[36963], 99.50th=[39060], 99.90th=[49021], 99.95th=[51643],
     | 99.99th=[76022]
   bw (  KiB/s): min=35632, max=53506, per=100.00%, avg=49309.31, stdev=1275.25, samples=236
   iops        : min= 8907, max=13376, avg=12326.85, stdev=318.82, samples=236
  write: IOPS=12.3k, BW=48.1MiB/s (50.5MB/s)(2888MiB/60002msec); 0 zone resets
    slat (usec): min=2, max=112744, avg=98.70, stdev=586.77
    clat (usec): min=1013, max=162272, avg=20443.88, stdev=5185.99
     lat (usec): min=1125, max=163299, avg=20542.90, stdev=5202.03
    clat percentiles (usec):
     |  1.00th=[14353],  5.00th=[15401], 10.00th=[15795], 20.00th=[16319],
     | 30.00th=[16712], 40.00th=[17433], 50.00th=[18220], 60.00th=[21103],
     | 70.00th=[22938], 80.00th=[24249], 90.00th=[26608], 95.00th=[30802],
     | 99.00th=[36439], 99.50th=[38536], 99.90th=[48497], 99.95th=[51119],
     | 99.99th=[76022]
   bw (  KiB/s): min=37137, max=53249, per=100.00%, avg=49333.05, stdev=1188.12, samples=236
   iops        : min= 9283, max=13312, avg=12332.74, stdev=297.01, samples=236
  lat (msec)   : 2=0.01%, 4=0.01%, 10=0.02%, 20=56.72%, 50=43.18%
  lat (msec)   : 100=0.07%, 250=0.01%
  cpu          : usr=2.87%, sys=16.33%, ctx=447882, majf=0, minf=56
  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.0%, >=64=0.1%
     issued rwts: total=738903,739381,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=256

Run status group 0 (all jobs):
   READ: bw=48.1MiB/s (50.4MB/s), 48.1MiB/s-48.1MiB/s (50.4MB/s-50.4MB/s), io=2886MiB (3027MB), run=60002-60002msec
  WRITE: bw=48.1MiB/s (50.5MB/s), 48.1MiB/s-48.1MiB/s (50.5MB/s-50.5MB/s), io=2888MiB (3028MB), run=60002-60002msec

Disk stats (read/write):
  sda: ios=738033/738664, merge=43/87, ticks=767404/135599, in_queue=903136, util=72.27%

Тест пропускной способности

Для тестирования пропускной способности используется одновременное чтение и запись крупными блоками с использованием множества процессов. Эти тесты измеряют значение объёма данных, который может быть передан за определённое время. Чем выше значение пропускной способности, тем больше данных может быть передано или принято за единицу времени.

bw — основной параметр вывода для теста пропускной способности, означающий совокупную пропускную способность потоков в группе, за которой следуют минимальная и максимальная пропускная способность всех потоков.

Перед выполнением теста убедитесь, что в указанной директории достаточно свободного места (более 10 ГБ) для завершения теста.

Тест чтения/записи:

 fio --name=fiotest --blocksize=256k --directory=/home/user --size=10G --ioengine=psync --iodepth=1 --runtime=120 --rw=randrw --direct=1 --numjobs=25 --group_reporting

где:

—name=fiotest — имя задания, используемое для отчётов;

—blocksize=256k — устанавливает размер читаемого или записываемого блока данных на 256 КБ;

—directory=/home/user — задаёт каталог /home/user, в котором будут созданы тестовые файлы;

—size=10G — общий объем данных, который будет использоваться для каждого задания (10 ГБ);

—ioengine=psync — устанавливает синхронный механизм ввода-вывода с использованием стандартных системных вызовов (pread/pwrite);

—iodepth=1 — глубина очереди ввода-вывода, которая равна 1, каждая операция будет дожидаться завершения перед началом следующей;

—runtime=120 — устанавливает время выполнения теста в 120 секунд;

—rw=randrw — режим работы с диском: данные будут читаться и записываться случайным образом;

—direct=1 — включает режим прямого ввода-вывода, минуя кеширование в операционной системе;

—numjobs=25 — количество параллельно выполняемых заданий (25 заданий);

—group_reporting — включает групповой отчёт, объединяющий результаты всех заданий.

Использование файла задания

Можно получить более последовательные результаты, если использовать файл задания вместо выполнения команды напрямую.

Для этого создайте файл задания fiorandomreadwrite.fio:

 nano fiorandomreadwrite.fio

Добавьте в файл следующие строки:

[global]

name=fiotest
blocksize=4k
directory=/home/user
size=5g
ioengine=libaio
iodepth=256
runtime=60
rw=randwrite
direct=1
runtime=60
rw=randwrite
direct=1
[job1]
filename=directory=/home/user

Для выполнения файла задания используйте команду:

 fio ./fiorandomreadwrite.fio

Результат:

job1: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=256
fio-3.28
Starting 1 process
job1: Laying out IO file (1 file / 5120MiB)
Jobs: 1 (f=1): [w(1)][100.0%][w=53.5MiB/s][w=13.7k IOPS][eta 00m:00s]
job1: (groupid=0, jobs=1): err= 0: pid=4312: Tue Jul 30 12:29:40 2024
  write: IOPS=5104, BW=19.9MiB/s (20.9MB/s)(1197MiB/60001msec); 0 zone resets
    slat (usec): min=4, max=6968.9k, avg=192.75, stdev=21138.71
    clat (nsec): min=884, max=8563.0M, avg=49933698.53, stdev=420390411.52
     lat (usec): min=89, max=8563.0k, avg=50126.78, stdev=421252.44
    clat percentiles (msec):
     |  1.00th=[   11],  5.00th=[   12], 10.00th=[   12], 20.00th=[   13],
     | 30.00th=[   13], 40.00th=[   14], 50.00th=[   14], 60.00th=[   14],
     | 70.00th=[   14], 80.00th=[   18], 90.00th=[   25], 95.00th=[   43],
     | 99.00th=[  342], 99.50th=[ 2039], 99.90th=[ 7282], 99.95th=[ 8423],
     | 99.99th=[ 8423]
   bw (  KiB/s): min=    8, max=74003, per=100.00%, avg=38357.61, stdev=26329.13, samples=61
   iops        : min=    2, max=18500, avg=9589.21, stdev=6582.25, samples=61
  lat (nsec)   : 1000=0.01%
  lat (usec)   : 50=0.01%, 100=0.01%, 250=0.01%, 500=0.01%, 750=0.01%
  lat (usec)   : 1000=0.01%
  lat (msec)   : 2=0.01%, 4=0.04%, 10=0.45%, 20=82.69%, 50=12.38%
  lat (msec)   : 100=2.49%, 250=0.46%, 500=0.70%, 750=0.09%, 1000=0.01%
  lat (msec)   : 2000=0.16%, >=2000=0.50%
  cpu          : usr=1.00%, sys=15.06%, ctx=334602, majf=0, minf=16
  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.0%, >=64=0.1%
     issued rwts: total=0,306304,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=256

Run status group 0 (all jobs):
  WRITE: bw=19.9MiB/s (20.9MB/s), 19.9MiB/s-19.9MiB/s (20.9MB/s-20.9MB/s), io=1197MiB (1255MB), run=60001-60001msec
Disk stats (read/write):
  sda: ios=4/304465, merge=0/6666, ticks=446/976801, in_queue=983934, util=84.55%

Тест с разными значениями iodepth

Перед выполнением теста убедитесь, что в указанной директории достаточно свободного места (более 5 ГБ) для завершения теста.

Основная цель данного теста — измерить производительность дисковой подсистемы при различных значениях iodepth.

Значение iodepth определяет, сколько операций ввода-вывода может быть выполнено одновременно. Чем выше значение iodepth, тем выше нагрузка на систему, и тест позволяет увидеть, как это влияет на скорость чтения/записи.

Тест можно использовать для:

  • оценки производительности устройства хранения;

  • выявления пределов производительности для различных сценариев загрузки;

  • сравнения различных устройств хранения;

  • оптимизации конфигураций серверов/приложений, особенно при высокой нагрузке.

Скрипт для тестирования диска с разными значениями iodepth (разным количеством одновременных запросов):

Создайте файл run_fio_tests.sh:

 nano run_fio_tests.sh

Добавьте в файл следующие строки:

#!/bin/bash
for i in 1 2 4 8 16 32 64 128 256 512 1024; do
echo "Testing with iodepth=$i"
fio --name=fiotest --ioengine=libaio --direct=1 --rw=randread --bs=4k --size=5G --randrepeat=0 --norandommap --fsync=1 --numjobs=1 --runtime=60 --group_reporting --directory=/base/fio_test --iodepth=$i
echo ""
done

где:

  • —name=fiotest — название теста;

  • —ioengine=libaio — задаёт используемый механизм ввода-вывода. libaio — асинхронный механизм ввода-вывода, который позволяет программе выполнять ввод-вывод в неблокирующем режиме;

  • —direct=1 — ввод-вывод будет осуществляться непосредственно на устройство, минуя кеш операционной системы;

  • —rw=randread — тип операции ввода-вывода (read/write). randread означает, что будут выполняться случайные операции чтения;

  • —bs=4k — размер блока ввода-вывода 4 КБ;

  • —size=5G — определяет общий размер файла — 5 ГБ, который будет использоваться в тестировании;

  • —randrepeat=0 — указывает, что не нужно повторять одно и то же случайное последовательности ввода-вывода;

  • —norandommap — отключает создание карты случайных блоков;

  • —fsync=1 — после каждой записи необходимо синхронизировать данные с устройством хранения;

  • —numjobs=1 — определяет количество параллельных задач, которые будут запущены. В примере 1 задача;

  • —runtime=60 — определяет продолжительность теста в секундах. Тест будет выполняться 60 секунд;

  • —group_reporting — результаты должны быть собраны и отображены глобально;

  • —directory=/home/user — определяет директорию, где будет осуществляться тестирование;

  • —iodepth=$i — глубина очереди ввода-вывода, которая будет варьироваться от 1 до 1024 в зависимости от текущего значения $i в цикле.

Сделайте файл исполняемым:

 chmod +x run_fio_tests.sh

Запустите скрипт:

 ./run_fio_tests.sh

Удаление результатов тестирования

Удалить файлы после тестирования можно с помощью следующей команды:

 rm /home/user/fiotest*

где:

  • /home/user/fiotest* — путь и шаблон имён файлов, которые нужно удалить.

Перед удалением можно проверить, что удаляются только нужные файлы:

 ls /home/user/fiotest*

Примерный вывод:

 /home/user/fiotest.0.0 /home/user/fiotest.1.0

Эта информация оказалась полезной? ДА НЕТ

Дата последнего изменения: 24.09.2024

Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.

fio on Windows

Download pre-compiled fio binary for Windows

Example fio windows file, single drive

This will create a 1GB file called fiofile on the F:\ Drive in Windows then read the file.  Notice that the specification is “Driveletter” “Backslash” “Colon” “Filename”

In fio terms we are “escaping” the : which fio traditionally uses as a file separator.

[global]
bs=1024k
size=1G
time_based
runtime=30
rw=read
direct=1
iodepth=8

[job1]
filename=F\:fiofile 
Example fio windows file, multiple drives
[global]
bs=1024k
size=1G
time_based
runtime=30
rw=read
direct=1
iodepth=8
group_reporting

[job1]
filename=F\:fiofile 

[job2]
filename=G\:fiofile 
To use Physical Drives (Not formatted)

Use the format \\.\\PhysicalDrive<N>

Firstly find the correct drive using diskpart -> list disk

DISKPART> list disk

Disk ### Status Size Free Dyn Gpt
-------- ------------- ------- ------- --- ---
Disk 0 Online 60 GB 0 B
Disk 1 Online 1024 GB 0 B *
Disk 2 Online 1024 GB 0 B *
Disk 3 Online 50 GB 0 B *
Disk 4 Online 50 GB 0 B *
Disk 5 Online 50 GB 0 B *
Disk 6 Online 50 GB 0 B *
Disk 7 Online 600 GB 1024 KB
Disk 8 Online 500 GB 1024 KB
Disk 9 Online 1024 GB 1024 KB
Disk 10 Online 77 GB 1024 KB

Then use the disk number you want in your fio file e.g.

[global]
ioengine=windowsaio
direct=1
time_based
runtime=60s
size=10g

[log]
rw=write
bs=4k
iodepth=1
filename=\\.\PhysicalDrive10

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Windows server 2008 r2 enterprise upgrade
  • Видеодрайвер для windows 7 64 bit asus
  • Genius g pen 4500 windows 10
  • Thunderobot драйвера для windows 11 64 bit
  • Горячая клавиша windows поворот экрана