axboe/fio
GitHub: axboe/fio
一款灵活的 I/O 工作负载模拟与基准测试工具,通过可配置的 job 文件精确复现各类真实 I/O 场景以评估存储系统性能。
Stars: 6253 | Forks: 1413
## 概述与历史
Fio 最初是为了省去我在出于性能原因或为了查找/复现 bug 而想要测试特定工作负载时,编写特殊测试用例程序的麻烦而编写的。编写这样的测试程序的过程可能很繁琐,尤其是当你经常需要这样做时。因此,我需要一个能够模拟给定 I/O 工作负载的工具,而无需一次又一次地编写专门的测试用例。
不过,测试工作负载很难定义。其中可能涉及任意数量的进程或线程,并且每个进程或线程都可以使用各自的方式来生成 I/O。你可能需要有人在内存映射文件中弄脏大量内存,或者可能有多个线程使用异步 I/O 发出读取请求。fio 需要足够灵活,以便能够模拟这两种情况以及更多其他情况。
Fio 会根据用户的指定,生成一定数量的执行特定类型 I/O 操作的线程或进程。fio 接收许多全局参数,每个线程都会继承这些参数,除非向它们传递了覆盖该设置的参数。fio 的典型用法是编写一个与人们想要模拟的 I/O 负载相匹配的 job 文件。
## 源码
Fio 存放于一个 git 仓库中,规范地址为:
```
https://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio
```
系统会频繁生成快照,并且 :file:`fio-git-*.tar.gz` 也包含 git 元数据。其他 tar 包是官方 fio 发布版本的归档。可从以下地址下载快照:
```
https://brick.kernel.dk/snaps/
```
此外还有两个官方镜像。当有更改被推送时,这两个镜像都会自动与主仓库同步。如果由于某种原因主仓库出现故障,可以安全地将其中任何一个作为备份使用:
```
https://git.kernel.org/pub/scm/linux/kernel/git/axboe/fio.git
https://github.com/axboe/fio.git
```
## 邮件列表
fio 项目邮件列表旨在讨论与 fio 相关的所有内容,包括一般性讨论、bug 报告、提问和开发。有关 bug 报告,请参阅 REPORTING-BUGS。
一封详细说明近期提交的自动邮件每天最多会发送到列表一次。该列表的地址是 fio@vger.kernel.org,通过发送电子邮件至 fio+subscribe@vger.kernel.org 或访问 https://subspace.kernel.org/vger.kernel.org.html 进行订阅。
可在此处找到归档:
```
https://www.spinics.net/lists/fio/
```
或在此处:
```
https://lore.kernel.org/fio/
```
旧列表的归档可在此处找到:
```
http://maillist.kernel.dk/fio-devel/
```
## 作者
Fio 由 Jens Axboe 编写,旨在实现对 Linux I/O 子系统和调度程序的灵活测试。他厌倦了编写特定的测试应用程序来模拟给定的工作负载,并发现现有的 I/O 基准测试/测试工具不够灵活,无法满足他的需求。
Jens Axboe 20060905
## 维护者
Fio 由 Jens Axboe 维护,但是,为了报告 bug,请使用
fio reflector 或 GitHub 页面,而不是直接给他们中的任何一人发送
电子邮件。通过使用公共资源,其他人也能够从回复中
学习。其他成员也很可能能够帮助您解决您的问题。
## 二进制包
Debian:
从 Debian "Squeeze" 开始,fio 包已成为官方 Debian 仓库的一部分。
https://packages.debian.org/search?keywords=fio 。
Ubuntu:
从 Ubuntu 10.04 LTS(又称 "Lucid Lynx")开始,fio 包已成为 Ubuntu "universe" 仓库的一部分。
https://packages.ubuntu.com/search?keywords=fio 。
Red Hat、Fedora、CentOS 等:
从 Fedora 9/Extra Packages for Enterprise Linux 4 开始,fio 包已成为 Fedora/EPEL 仓库的一部分。
https://packages.fedoraproject.org/pkgs/fio/ 。
Mandriva:
Mandriva 已将 fio 集成到其包仓库中,因此在该发行版上进行安装应该只需键入 ``urpmi fio`` 即可。
Arch Linux:
Community 子仓库下提供了一个 Arch Linux 包:
https://www.archlinux.org/packages/?sort=&q=fio
Solaris:
适用于 Solaris 的包可从 OpenCSW 获取。安装他们的 pkgutil 工具 (http://www.opencsw.org/get-it/pkgutil/),然后通过 ``pkgutil -i fio`` 安装 fio。
Windows:
从 fio 3.31 开始,标记发布版本的 Windows 安装程序可在 GitHub 上获取,地址为 https://github.com/axboe/fio/releases。最新的 Windows 安装程序也可以作为 GitHub Actions 构建产物获取,只需从 https://github.com/axboe/fio/actions 选择一个构建版本即可。这些操作需要登录 GitHub 账号。
BSD:
适用于 BSD 的包可以从其二进制包仓库中获取。使用它们的二进制包管理器查找 "fio" 包。
## 构建
只需键入:
$ ./configure
$ make
$ make install
请注意,需要使用 GNU make。在 BSD 上,它可以在 ports 目录的 devel/gmake 中找到;在 Solaris 上,它位于 SUNWgmake 包中。在 GNU make 不是默认工具的平台上,请键入 ``gmake`` 而不是 ``make``。
configure 将打印出已启用的选项。请注意,在基于 Linux 的平台上,必须安装 libaio 开发包才能使用 libaio 引擎。根据发行版的不同,它通常被称为 libaio-devel 或 libaio-dev。
对于 gfio,需要安装 gtk 2.18(或更新版本)、相关的 glib 线程和 cairo。gfio 不会自动构建,可以通过为 configure 指定 ``--enable-gfio`` 选项来启用。
使用交叉编译器构建 fio:
$ make clean
$ make CROSS_COMPILE=/path/to/toolchain/prefix
configure 将尝试自动确定目标平台。
也可以为 ESX 构建 fio,请在 configure 时使用 ``--esx`` 开关。
是否启用 HTTP 引擎取决于系统上是否检测到了 curl 和 openssl 共享库。对于 Ubuntu,这些包是 libcurl4-openssl-dev 和 libssl-dev。
### Windows
构建/运行 fio 所需的最低 Windows 版本为 Windows 7/Windows Server 2008 R2。在 Windows 上,需要安装 Cygwin (https://www.cygwin.com/) 才能构建 fio。要创建 MSI 安装程序包,请从 https://wixtoolset.org 安装 WiX,并从 :file:`os/windows` 目录运行 :file:`dobuild.cmd`。
如何在 64 位 Windows 上编译 fio:
1. 安装 Cygwin (https://www.cygwin.com/)。安装 **make** 以及所有以 **mingw64-x86_64** 开头的包。如果你希望启用 fio 的日志压缩功能,请确保安装了 **mingw64-x86_64-zlib**。
2. 打开 Cygwin 终端。
3. 进入 fio 目录(源文件所在位置)。
4. 运行 ``make clean && make -j``。
要为 32 位 Windows 构建 fio,请确保安装了前面提到的 -x86_64 包的 -i686 版本,并在执行 ``make`` 之前运行 ``./configure --build-32bit-win``。
建议在构建或安装完成后,在命令提示符或其他“原生”控制台(例如 console2)中运行 fio,因为已知在 Cygwin shell 下运行它会出现显示和信号问题(有关详细信息,请参阅 https://github.com/mintty/mintty/issues/56 和 https://github.com/mintty/mintty/wiki/Tips#inputoutput-interaction-with-alien-programs)。
### 文档
Fio 使用 Sphinx_ 从 reStructuredText_ 文件生成文档。
要构建 HTML 格式的文档,请运行 ``make -C doc html``,然后将你的浏览器指向 :file:`./doc/output/html/index.html`。要构建手册页,请运行 ``make -C doc man``,然后运行 ``man doc/output/man/fio.1``。要查看支持的其他输出格式,请运行 ``make -C doc help``。
.. _reStructuredText: https://www.sphinx-doc.org/rest.html
.. _Sphinx: https://www.sphinx-doc.org
## 平台
Fio 可以在(至少)Linux、Solaris、AIX、HP-UX、OSX、NetBSD、OpenBSD、Windows、FreeBSD 和 DragonFly 上运行。某些功能和/或选项可能仅在部分平台上可用,这通常是因为这些功能仅适用于该平台(例如 solarisaio 引擎,或 Linux 上的 splice 引擎)。
某些功能在 FreeBSD/Solaris 上不可用,即使它们是可以实现的,我很乐意接受这方面的补丁。这方面的一个例子是磁盘实用程序统计信息以及(我认为的)大页支持,FreeBSD/Solaris 确实存在对它们的支持。
Fio 使用 pthread mutex 进行信号通知和锁定,而某些平台不支持进程共享的 pthread mutex。因此,在这样的平台上只能支持线程。这可以通过 sysv ipc 锁定或其他锁定替代方案来解决。
其他 \*BSD 平台未经测试,但 fio 在那里应该几乎可以开箱即用。由于我没有在这些平台上进行过测试运行甚至编译,你的情况可能会有所不同。非常欢迎大家向我发送针对其他平台的补丁。在所有平台上都能使用相同的测试/基准测试工具是非常有价值的。
请注意,在 AIX 上默认情况下不启用 POSIX aio。类似这样的消息:
```
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.
```
表明需要启用 POSIX aio。以 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 现在应该可以工作了。要使更改永久生效:
```
# chdev -l posix_aio0 -P -a autoconfig='available'
posix_aio0 changed
```
## 运行 fio
运行 fio 通常是最简单的部分——你只需将 job 文件(或多个 job 文件)作为参数传给它:
```
$ fio [options] [jobfile] ...
```
它就会开始执行 *jobfile* 告诉它要做的事情。你可以在命令行上指定多个 job 文件,fio 将按顺序串行运行这些文件。在内部,这等同于使用参数部分中描述的 :option:`stonewall` 参数。
如果 job 文件只包含一个作业,你倒不如直接在命令行上给出这些参数。命令行参数与作业参数完全相同,只是多了一些用于控制全局参数的额外选项。例如,对于 job 文件参数 :option:`iodepth=2 `,对应的命令行选项将是 :option:`--iodepth 2 ` 或 :option:`--iodepth=2 `。你也可以使用命令行来给出多个作业条目。对于 fio 看到的每一个 :option:`--name ` 选项,它都会启动一个具有该名称的新作业。跟随在 :option:`--name ` 条目之后的命令行条目将应用于该作业,直到没有更多条目或者出现了一个新的 :option:`--name ` 条目为止。这类似于 job 文件选项,其中每个选项都应用于当前作业,直到看到新的 [] 作业条目。
fio 不需要以 root 身份运行,除非 job 部分中指定的文件或设备有此要求。其他一些选项也可能受到限制,例如内存锁定、I/O 调度程序切换以及降低 nice 值。
如果 *jobfile* 指定为 ``-``,则会从标准输入读取 job 文件。
标签:ASM汇编, I/O测试, 压力测试, 客户端加密, 性能测试, 系统工具