当前位置: 首页 > news >正文

sysbench测试系统磁盘读写


版本号:sysbench1.1


简介

    sysbench除了测试数据库外,还可以用于测试硬盘在不同负载下的性能表现,包括随机读写、顺序读写、随机访问模式、I/O延迟等。原理是通过生成不同的文件I/O负载模式(如顺序读写和随机读写),并根据指定的数据块大小和线程数量,测量系统在这些条件下的读写吞吐量和延迟。

        

文章目录如下

1. 参数说明

1.1. 命令语法

1.2. 常用参数

1.3. 参数详解

2. 测试示例

2.1. 生成测试数据

2.2. 测试文件I/O

2.3. 清理数据文件

2.4. 报告解读

3. 常见测试

3.1. 按块大小测试

3.2. 按读写策略测试

3.3. 按读写比例测试

3.4. 按文件模式测试

3.5. 组合测试


        

1. 参数说明

1.1. 命令语法

  • 硬盘读写需要使用sysbench内置的文件来测试,所以在测试前需要先生成文件,再运行。所以命令语法分为3部分

生成数据文件语法

sysbench fileio [选项] prepare

运行测试语法

sysbench fileio [选项] run

清理文件语法

sysbench fileio [选项] cleanup

         

1.2. 常用参数

  • 注释内容中花括号{ }表示选项,方括号[ ]表示默认值

文件准备参数

--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]

         

1.3. 参数详解

--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() 可以提供更高的性能,但牺牲了一些数据保护的严格性。

        

2. 测试示例

2.1. 生成测试数据

sysbench fileio prepare
  • 这里主要举例子,上面3个参数是必选,其他参数可使用默认值。sysbench1.1 文件数量默认128,文件大小默认2GB

结果如下

最终生成128个文件

总文件大小为2G

        

2.2. 测试文件I/O

以测试随机读写为例,由于生成的数据文件使用的默认值,所以这里可以不指定;如果生成文件数/大小是自定义的,那么测试时需要指定的文件数/大小与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

        

2.3. 清理数据文件

清理数据文件根据指定的数量来清理,比如不指定文件数据,默认清理128个,超过128个文件不会被清理

sysbench fileio prepare

指定文件数量清理

sysbench fileio --file-num=200 prepare

        

2.4. 报告解读

  • 以常规测试方法为例的结果解读

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 timeExtra 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
  • [ 1s ]:当前测试第n秒
  • reads: 116.56 MiB/s:每秒执行了 116.56MiB 的读取操作
  • writes: 77.73 MiB/s:每秒执行了 77.73MiB 的写入操作
  • fsyncs: 15857.34/s:每秒大约完成15857个文件同步(数据写入磁盘)
  • latency (ms,95%): 0.116:95%的读写操作中,每个操作的延迟平均为0.116毫秒

        

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  # 文件同步结果(每秒执行的文件同步操作数量)
  • IOPS:表示每秒能够执行的输入输出操作数量(IO per second)
  • MiB/s 和 MB/s:读写的数据量,表示单位不同。
    • 1 MiB = 1024 KiB = 1024 * 1024 字节
    • 1 MB = 1000 KB = 1000 * 1000 字节

延迟部分(单位:毫秒)

Latency (ms):min:               0.00        # 最小延迟avg:               0.61        # 平均延迟max:               396.70      # 最大延迟95th percentile:   0.14        # 第95百分位数延迟(显示了绝大多数操作的快速响应性能)sum:               159686.86   # 总延迟时间

        

3. 常见测试

举几种常见的例子,这里就不再描述准备数据了,直接运行命令。前面4个目录是为了描述不同方法,实际使用参考目录3.5

3.1. 按块大小测试

  • sysbench1.1 通过参数 --file-block-size 来控制I/O测试块大小

指定块大小为8k,随机读写

sysbench fileio --file-test-mode=rndrw --file-block-size=8k run
  • --file-test-mode=rndrw:指定测试模式为随机读写
  • --file-block-size=8k:指定I/O块大小为8k

        

3.2. 按读写策略测试

  • 测试磁盘读写性能通过参数 --file-test-mode 来控制,这里列举全部测试方法

顺序读取

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

        

3.3. 按读写比例测试

sysbench1.1 读写比例通过参数 --file-rw-ratio 来控制(默认6:4)。比如测试7:3,换算为n:1

  • 7 ÷ 3 = 2.3,所以2.3:1,参数设置 --file-rw-ratio=2.3
sysbench fileio --file-test-mode=rndrw --file-rw-ratio=2.3 run

测试结果

  • 读比例:8266 ÷ ( 8266 + 3593 ) = 0.7
  • 写比例:3593 ÷ ( 8266 + 3593 ) = 0.3

        

3.4. 按文件模式测试

  • sysbench1.1 通过参数 --file-io-mode 来实现不同的文件模式测试(默认同步)

同步模式(文件操作将按顺序执行,每次操作会等待数据写入完成后再返回结果。适合需要确保数据完整性和稳定性的场景)

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

        

3.5. 组合测试

  • 上述目录 3.1 ~ 3.4 主要为了区分不同的测试方法,所以并没有将参数组合,这里举个例子

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

相关文章:

  • 【开源项目】Rust开发复制文件夹目录结构工具
  • 新款S32K3 MCU可解决汽车软件开发的成本和复杂性问题(器件编号包含S32K322E、S32K322N、S32K328)
  • 【linux】服务器ubuntu安装cuda11.0、cuDNN教程,简单易懂,包教包会
  • 秋招突击——7/12——复习{每日温度、完全平方数、无重复最长子串}——新作{字节面试——控制多线程按照顺序输出}
  • Spring的AOP
  • ASP.NET Core----基础学习06----将所有数据在页面中显示 布局页面的使用
  • 基于Faster R-CNN的安全帽目标检测
  • Redis分布式锁-Redisson可重入锁原理的个人见解。
  • 【全面介绍Pip换源】
  • 【密码学】密码学数学基础:剩余系
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十四)-无人机操控关键绩效指标(KPI)框架
  • Vue3 前置知识
  • 基于hive数据库的泰坦尼克号幸存者数据分析
  • starRocks搭建
  • 14、Python之super star:一颗星、两颗星,满天都是小星星
  • Date型的使用
  • ES6系统学习----从Apollo Client看解构赋值
  • happypack两次报错的问题
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JS数组方法汇总
  • oschina
  • spring boot下thymeleaf全局静态变量配置
  • 产品三维模型在线预览
  • 番外篇1:在Windows环境下安装JDK
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于遗传算法的优化问题求解
  • 悄悄地说一个bug
  • 山寨一个 Promise
  • 用 Swift 编写面向协议的视图
  • 用简单代码看卷积组块发展
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • hi-nginx-1.3.4编译安装
  • scrapy中间件源码分析及常用中间件大全
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • ​探讨元宇宙和VR虚拟现实之间的区别​
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • # Redis 入门到精通(七)-- redis 删除策略
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #162 (Div. 2)
  • %check_box% in rails :coditions={:has_many , :through}
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (web自动化测试+python)1
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (编译到47%失败)to be deleted
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (十五)使用Nexus创建Maven私服
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • .Net Core和.Net Standard直观理解
  • .Net MVC4 上传大文件,并保存表单
  • .net 设置默认首页