版本号:sysbench1.1
简介
sysbench除了测试数据库外,还可以用于测试硬盘在不同负载下的性能表现,包括随机读写、顺序读写、随机访问模式、I/O延迟等。原理是通过生成不同的文件I/O负载模式(如顺序读写和随机读写),并根据指定的数据块大小和线程数量,测量系统在这些条件下的读写吞吐量和延迟。
文章目录如下
生成数据文件语法
sysbench fileio [选项] prepare
运行测试语法
sysbench fileio [选项] run
清理文件语法
sysbench fileio [选项] cleanup
文件准备参数
- --file-num=N # 指定创建的文件总数量[128]
- --file-total-size=SIZE # 指定创建的文件总大小[2G]
常用测试参数
- --file-block-size=N # 指定IO测试中使用的块大小[16k]
- --file-test-mode=STRING # 指定测试模式{seqrd, seqwr, seqrewr, rndrd, rndwr, rndrw}
- --file-io-mode=STRING # 指定文件操作模式{sync,async,mmap} [sync]
- --file-rw-ratio=N # 指定读写比例 [1.5]
- --file-extra-flags=[LIST,...] # 指定在打开文件时使用的额外选项{sync,dsync,direct}
刷盘参数 [ fsync() 表示强制将文件系统缓冲区中的数据写入到磁盘中,避免数据丢失 ]
- --file-fsync-freq=N # 指定在多少次文件写入操作后调用fsync() [100]
- --file-fsync-all[=on|off] # 每次写操作后执行fsync() [off]
- --file-fsync-end[=on|off] # 在测试结束时执行fsync() [on]
- --file-fsync-mode=STRING # 指定同步方法{fsync, fdatasync} [fsync]
- --file-merged-requests=N # 控制在文件 I/O 测试中最多合并的 I/O 请求数量 [0],0表示禁用
其他常用参数
- --threads=N # 测试线程数 [1]
- --time=N # 测试时间(单位:s) [10]
- --report-interval=N # 定期报告统计信息间隔时间(单位:s), 0表示禁用 [0]
- --verbosity=N # 详细日志级别(0~5), 0表示只输出重要信息, 5表示输出debug [3]
- --histogram=[on|off] # 输出延迟直方图 [off]
--file-test-mode=STRING
说明:指定测试模式
- seqrd:顺序读取
- seqwr:顺序写入
- seqrewr:顺序混合读写
- rndrd:随机读取
- rndwr:随机写入
- rndrw:随机混合读写
--file-io-mode=STRING
说明:指定文件操作模式(默认同步)
- sync:同步模式。文件操作将按顺序执行,每次操作会等待数据写入完成后再返回结果。适合需要确保数据完整性和稳定性的场景。
- async:异步模式。文件操作会尽可能快地执行,不等待数据写入完成即返回结果。适合对性能要求较高、可以容忍少量数据丢失的应用场景。
- mmap:内存映射模式。通过内存映射文件的方式进行文件 I/O 操作。
--file-extra-flags=[LIST,...]
说明:用于指定在打开文件时使用的额外选项
- sync:文件操作使用同步 I/O。即每次读写操作都会等待数据完全写入到物理存储介质后才返回结果。这确保了数据写入的稳定性和一致性,适合对数据完整性要求高的应用场景。
- dsync:强制每次写操作都等待数据以及元数据(如文件描述符)都已写入磁盘后才返回。相比于sync,dsync仅需等待数据提交而不需等待硬件设备将所有数据写入。
- direct:使用直接 I/O,即绕过文件系统缓存直接读取或写入磁盘。这可以减少对系统缓存的依赖,适合大文件或需要避免文件系统缓存影响的应用。
--file-fsync-mode=STRING
说明:用于指定文件同步操作的方法(默认fsync)
- fsync:使用 fsync() 系统调用进行同步操作。fsync() 强制将文件系统缓冲区中的数据及其相关的元数据(如文件描述符)写入到磁盘中,确保数据持久化存储。这种方式可以提供更强的数据保护,但通常比 fdatasync 操作更耗时。
- fdatasync:使用 fdatasync() 系统调用进行同步操作。与 fsync() 不同的是,fdatasync() 只等待数据部分被写入到磁盘,而不等待相关的文件描述符或其他元数据。因此,相比于 fsync(),fdatasync() 可以提供更高的性能,但牺牲了一些数据保护的严格性。
sysbench fileio prepare
结果如下

最终生成128个文件

总文件大小为2G

以测试随机读写为例,由于生成的数据文件使用的默认值,所以这里可以不指定;如果生成文件数/大小是自定义的,那么测试时需要指定的文件数/大小与prepare一致。
sysbench fileio --file-test-mode=rndrw run
结果如下

除了指定文件测试方法外,还有一些其他的常规参数,比如设置线程数10、测试时间5s、每隔1秒输出1次结果。
sysbench fileio --file-test-mode=rndrw --threads=10 --time=5 --report-interval=1 run
清理数据文件根据指定的数量来清理,比如不指定文件数据,默认清理128个,超过128个文件不会被清理
sysbench fileio prepare

指定文件数量清理
sysbench fileio --file-num=200 prepare
1、最前面部分是测试说明,表示怎么测,配置了哪些参数(未配置参数自动使用默认值)
- [yt@localhost yt]$ sysbench fileio --file-test-mode=rndrw --threads=16 --report-interval=1 run
- sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)
-
- Running the test with following options:
- Number of threads: 16
- Report intermediate results every 1 second(s)
- Initializing random number generator from current time
-
- Extra file open flags: (none)
- 128 files, 16MiB each
- 2GiB total file size
- Block size 16KiB
- Number of IO requests: 0
- Read/Write ratio for combined random IO test: 1.50
- Periodic FSYNC enabled, calling fsync() each 100 requests.
- Calling fsync() at the end of test, Enabled.
- Using synchronous I/O mode
- Doing random r/w test
2、中间部分就是实时打印的结果报告
- Threads started!
-
- [ 1s ] reads: 116.56 MiB/s writes: 77.73 MiB/s fsyncs: 15857.34/s latency (ms,95%): 0.116
- [ 2s ] reads: 111.20 MiB/s writes: 74.06 MiB/s fsyncs: 15144.52/s latency (ms,95%): 0.116
- [ 3s ] reads: 100.96 MiB/s writes: 67.39 MiB/s fsyncs: 13785.92/s latency (ms,95%): 0.160
- [ 4s ] reads: 65.61 MiB/s writes: 43.72 MiB/s fsyncs: 8940.84/s latency (ms,95%): 0.307
3、最后报告部分呈现的是最终结果
吞吐量部分
- Throughput:
- read: IOPS=6906.50 107.91 MiB/s (113.16 MB/s) # 读取结果
- write: IOPS=4604.40 71.94 MiB/s (75.44 MB/s) # 写入结果
- fsync: IOPS=14926.88 # 文件同步结果(每秒执行的文件同步操作数量)
延迟部分(单位:毫秒)
- Latency (ms):
- min: 0.00 # 最小延迟
- avg: 0.61 # 平均延迟
- max: 396.70 # 最大延迟
- 95th percentile: 0.14 # 第95百分位数延迟(显示了绝大多数操作的快速响应性能)
- sum: 159686.86 # 总延迟时间
举几种常见的例子,这里就不再描述准备数据了,直接运行命令。前面4个目录是为了描述不同方法,实际使用参考目录3.5
指定块大小为8k,随机读写
sysbench fileio --file-test-mode=rndrw --file-block-size=8k run
顺序读取
sysbench fileio --file-test-mode=seqrd run
顺序写入
sysbench fileio --file-test-mode=seqwr run
顺序混合读写
sysbench fileio --file-test-mode=seqrewr run
随机读取
sysbench fileio --file-test-mode=rndrd run
随机写入
sysbench fileio --file-test-mode=rndwr run
随机混合读写
sysbench fileio --file-test-mode=rndrw run
sysbench1.1 读写比例通过参数 --file-rw-ratio 来控制(默认6:4)。比如测试7:3,换算为n:1
sysbench fileio --file-test-mode=rndrw --file-rw-ratio=2.3 run
测试结果

同步模式(文件操作将按顺序执行,每次操作会等待数据写入完成后再返回结果。适合需要确保数据完整性和稳定性的场景)
sysbench fileio --file-test-mode=rndrw --file-io-mode=sync run
异步模式(文件操作会尽可能快地执行,不等待数据写入完成即返回结果。适合对性能要求较高、可以容忍少量数据丢失的应用场景)。某些平台可能不支持
sysbench fileio --file-test-mode=rndrw --file-io-mode=async run
内存映射模式(通过内存映射文件的方式进行文件 I/O 操作,可以提高访问文件的速度和效率,特别是对于大文件的读写操作)
sysbench fileio --file-test-mode=rndrw --file-io-mode=mmap run
1、准备数据(100个文件,共10G大小)
- sysbench fileio \
- --file-num=100 \
- --file-total-size=10G \
- prepare
2、演示两种不同的测试方法
方法一
- sysbench fileio \
- --file-num=100 \
- --file-total-size=10G \
- --file-block-size=8k \
- --file-test-mode=seqrd \
- --file-io-mode=sync \
- --threads=100 \
- --time=60 \
- --report-interval=5 \
- --histogram=on \
- run
测试块大小8k、顺序读同步模式、多线程测试100并发、共测试1分钟,每5秒输出1次结果、开启结果延迟直方图
方法二
- sysbench fileio \
- --file-num=100 \
- --file-total-size=10G \
- --file-block-size=32k \
- --file-test-mode=rndrw \
- --file-io-mode=async \
- --threads=100 \
- --time=60 \
- --report-interval=5 \
- --histogram=on \
- run
测试块大小32k、随机混合读写异步模式、多线程测试100并发、共测试1分钟,每5秒输出1次结果、开启结果延迟直方图
直方图效果图(显示了不同延迟时间的次数)

3、清理数据
- sysbench fileio \
- --file-num=100 \
- cleanup