[转帖]探索fio参数如何选择以及全方位对比HDD和SSD性能

news/2024/10/6 12:25:03

文章目录

    • 1. 磁盘I/O性能指标
      • 1.1 性能指标
      • 1.2 I/O 观测
        • 1.2.1 磁盘I/O 观测
        • 1.2.2 进程I/O观测
    • 2. Fio 性能测试
      • 2.1 环境准备
      • 2.2 测试维度选择
      • 2.3 测试
        • 2.3.1 optane ssd和nvme ssd性能测试
        • 2.3.2 aep性能测试(intel persistent memory)

真正测试之前 我们需要清楚 评判磁盘I/O性能 是通过哪一些指标以及以查看相关指标的工具,这样在实际测试以及生产环境中才能对磁盘I/O性能又有一个全面而正确的评估。

本文并没有对文中提到的相关硬件的实现原理做描述,如有不足还请指正,谢谢。

1. 磁盘I/O性能指标

这里有一个磁盘性能指标相关的思维导图
在这里插入图片描述

1.1 性能指标

  • 使用率 :磁盘处理I/O时间的百分比,使用率过高(超过80%),可能存在I/O瓶颈。这个指标一般在机械硬盘中用来评判I/O瓶颈准确率会高一点,但是在固态硬盘,nvme,optane以及持久化内存aep中基本不会特别准确,即使达到100%,但并未达到其I/O带宽。
  • 饱和度:磁盘处理I/O的繁忙程度。饱和度过高,存在严重的性能瓶颈。如果饱和度为100%,则磁盘无法继续接受I/O
  • IOPS:每秒的I/O请求数
  • 吞吐量(磁盘带宽):每秒I/O请求总的大小
  • 响应时间(I/O latency):I/O请求从发出到收到响应的时间

1.2 I/O 观测

1.2.1 磁盘I/O 观测
  • iostat

    • r/s: 每秒发送给磁盘的读请求数。合并后的请求数

    • w/s: 每秒发送给磁盘的写请求数。同上也是合并后的

    • rKB/s 每秒从磁盘读取的数据量

    • wKB/s:每秒向磁盘写入的数据量

    • rrpm/s:每秒合并的读请求数

    • wrpm/s:每秒合并的写请求数

    • await: 读/写 请求处理完成的等待时间

    • r_wait:读请求处理完成等待时间,也包括队列中的等待时间和设备实际处理的时间,单位是ms

    • w_wait:写请求处理完成等待时间,也包括队列中的等待时间和设备实际处理的时间,单位是ms

    • avgqu-sz:平均请求队列长度

    • avgrq-sz: 平均读请求块(sector)大小,一个sector是512B

    • svctm:处理I/O请求所需的平均时间(不包括等待时间),单位ms。

      该指标不被推荐作为参考,后续该指标会在新版本的 iostat中移除

    • %utill: 磁盘处理I/O时间的百分比。
      100% 并不一定是磁盘I/O瓶颈。

  • PS:

    iostat 中的指标和我们磁盘I/O指标对应如下:

    • %util 磁盘I/O的使用率
    • r/s + w/s 即IOPS
    • rKB/s + wKB/s 即 吞吐量
    • r_await + w_await 响应时间
1.2.2 进程I/O观测
  • pidstat -d 1
    • UID 用户ID
    • PID 进程ID
    • kB_rd/s 进程每秒读取的数据大小
    • kB_wd/s 进程每秒发出的数据大小
    • kB_ccwr/s 进程每秒取消的写请求数据大小
    • Command 进程名称
  • iotop 追踪多个正在处理读写的进程,需要root权限
  • strace -p $pid/$tid -f 查看进程/线程系统调用情况
  • lsof -p pid 追踪一个具体进程打开的文件

2. Fio 性能测试

2.1 环境准备

软件准备:

环境有fio ,那么就不需要安装了。如果没有,则可以直接通过环境中的安装命令安装一下,我的基础环境是CentOS Linux release 7.4.1708 (Core) ,fio版本是:fio-3.7

硬件准备:

选择要测试的磁盘,先确认磁盘型号 以及 官网给定的磁盘性能情况。

  • 非AEP(intel pmem 持久化内存)的磁盘 查看磁盘型号命令可以通过:
    sudo smartctl -a /dev/nvme0n1
    在这里插入图片描述

  • 这里很明显是intel的ssd, 可以通过intel官网初步确认该ssd性能

    intel 产品官网 搜索对应的 model number
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EHKWn5bc-1607445027771)(/Users/zhanghuigui/Library/Application Support/typora-user-images/image-20201208204110343.png)]

这其实有点麻烦,当然买他们产品的时候肯定会附带对应的文档,会有相关的性能描述信息。

这里需要注意的是官网的latecny 一般是使用1depth+1job跑出来的延时,并非带宽瓶颈时的延时

这个时候我们软硬件都准备好了,同时也有了对应的性能标准,接下来就是按照自己的workload来测试当前硬件下的不同性能。

2.2 测试维度选择

我们测试磁盘性能,那么内存/cache 相关的选项其实就没有必要开了,直接用direct选项。

当然,如果测试的是aep 持久化内存相关的性能,这里其实只需要选择intel在fio中提供的测试引擎即可。

下面的测试主要列一下通用的测试维度:

  • 队列深度
    在这里插入图片描述

  • workload

    磁盘性能的话 主要是随机读 ,随机写 以及 混合读写(5:5 和 9:1读写比)

2.3 测试

这里是通过将待测试设备格式化成文件系统,并将其挂载起来,然后通过fio的direct选项进行测试;当然fio也可以直接压测裸盘,需要注意的是如果测盘不用的话可以直接压测,如果磁盘上有数据或者该磁盘是系统盘,使用fio直接压测会破坏磁盘的分区表

2.3.1 optane ssd和nvme ssd性能测试

将设备格式化成xfs文件系统并挂载,通用的fio测试脚本如下,会将不同的workload全部跑完

[global]
ioengine=libaio # 选择的i/o引擎,即使用什么方式的系统调用
direct=1 # direct选项,表示不经过文件系统
norandommap=1  # 覆盖size内的每一个磁盘block,保证写入均匀
randrepeat=0 # 保证完全随机的I/O
time_based # 增加这个选项后面的runtim才会生效
runtime=60  # 保证进程运行60秒,如果写/读完成了size的大小,那么重复读/写,直到完成
size=1G # 一个文件大小是1G
directory=./fio # 指定fio压测的文件目录,一般会在该目录内生成numjobs个size大小的文件

group_reporting # 最终会将压测结果形成可读的报告

[read4k-rand] # 压测随机读
bs=4k
rw=randread
numjobs=1
iodepth=1

[write4k-rand] # 压测随机写
bs=4k
rw=randwrite
numjobs=1
iodepth=1

[mixread50-rand] # 压测1:1 随机读写
bs=4k
rw=randrw
rwmixread=50
numjobs=1
iodepth=1

[mixread90-rand] # 压测9:1 随机读写
bs=4k
rw=randrw
rwmixread=50
numjobs=1
iodepth=1

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

最后可以通过fio fio.conf命令来运行

不过以上的测试脚本仅仅选择了workload的维度,并没有增加iodepth和numjobs 维度,因此基本达不到ssd的性能瓶颈,需要测试的同学可以增加一下这个测试维度。

每一次跑完 输出结果类似如下:

在这里插入图片描述

在测试过程中可以通过blktrace 系列工具进一步确认设备耗时情况:

# 以下命令默认在root权限下执行

# -a read, 表示只抓读请求,也可以-a write。默认是读写都抓
# -d 指定设备,最后会在当前目录生成cpu逻辑核数个文件,类似nvme0n1.blktrace.55
# -w 指定抓取时间
blktrace -a read -d /dev/nvme0n1 -w 180

# 解析所有nvme0n1开头的数据到一个文件nvme0n1.blktrace.bin
blkparse -i nvme0n1 -d nvme0n1.blktrace.bin

# 生成报表
btt -i nvme0n1.blktrace.bin -o bttout

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
2.3.2 aep性能测试(intel persistent memory)

aep是intel 开发出来的新硬件,叫做持久化内存 pmem

拥有接近内存性能,但能够持久化存储。

其在整个intel存储产品族中所处位置如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iv0OWRcY-1607445027777)(/Users/zhanghuigui/Library/Application Support/typora-user-images/image-20201208235331567.png)]

官方给的单个128G pmem的性能指标如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZrKY80fB-1607445027780)(/Users/zhanghuigui/Library/Application Support/typora-user-images/image-20201208235537823.png)]

将pmem格式化成xfs文件系统,然后使用dax选项挂载:

mkfs.xfs /dev/pmem1
mount -o rw,noatime,attr2,dax,inode64,noquota /dev/pmem1 /mnt/disk1
  • 1
  • 2

以上主要是通过dax方式进行挂载,则写入数据会跳过文件系统的IO栈,直接对接通用块层的接口,否则没有这个选项很难压测到aep的性能瓶颈。

这里建议的测试脚本如下:

[global]
# 使用 pmem开发的io引擎,会跳过文件系统的相关调用,直接通过mmap写入到持久化内存中
ioengine=libpmem 
direct=1
norandommap=1
randrepeat=0
runtime=30
time_based
size=1G
directory=./fio

group_reporting

[read4k-rand]
bs=256B
rw=randread
numjobs=32
iodepth=4
cpus_allowed=0-15,32-47 #CPU绑核,cpu之间迁移造成的开销会影响性能

[write4k-rand]
bs=256B
rw=randwrite
numjobs=32
iodepth=4
cpus_allowed=0-15,32-47 #CPU绑核,cpu之间迁移造成的开销会影响性能

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

关于aep 的设备IO情况,使用 linux操作系统工具比如(blktrace, iostat)是看不到的,需要使用intel提供的ipmwatch工具查看设备吞吐,以及emon查看耗时,两个工具安装比较辛苦,建议购买产品的时候直接让intel搞定。

</article>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/43029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

3. 使用Mybatis完成CRUD

前置工作准备创建Maven项目 , 引入依赖(mybatis依赖 ,mysql 驱动依赖 ,junit依赖 ,logback 依赖) 将xml文件放到类的根路径下 提供com.north.mybatis.utils.SqlSessionUtil工具类 创建测试用例:com.north.mybatis.CarMapperTest‍ 补充知识:什么是CRUD C: Create增 R: Re…

[转帖]JDK/Java 17 GA,新增「Free Java License」

https://zhuanlan.zhihu.com/p/410556607 按照发布规划,JDK/Java 17 属于长期支持版本 (LTS),将会获得 8 年的技术支持,直至 2029 年 9 年。JDK/Java 17 总共包含 14 个 JEP,具体如下:Restore Always-Strict Floating-Point Semantics 恢复始终执行严格模式 (Always-Str…

解密Prompt系列31. LLM Agent之从经验中不断学习的智能体

模型想要完成自主能力进化和自主能力获得,需要通过Self-Reflection from Past Experience来实现。那如何获得经历,把经历转化成经验,并在推理中使用呢?本章介绍三种方案Agent智能体的工作流可以简单分成两种:一种是固定的静态工作流,一种是智能体自主决策的动态工作流。 …

06-伪类和伪元素

伪类和伪元素01-伪类 1.1 元素状态的概念代码示例 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewp…

05-常用选择器

CSS常用选择器01 标签选择器 一般用来给所有元素做一些通用性的设置(效率比较低,尽量不要使用) <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="…

鸿蒙前端开发3-ArkTS语言基本语法

官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/arkts-basic-syntax-0000001504650057-V2 1.基本语法 装饰器   用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中@Entry、@Component和@State都是装饰器,@Component表示自定…

04-2个常用的文本属性

2个常用的文本属性01 text-decoration <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" c…

线程池的原理与C语言实现

这篇博客介绍了一个简单的线程池的C语言实现,详细解释了代码结构和工作流程,并附上了流程图。V1.0 2024年6月11日 发布于博客园目录 目录目录线程池原理线程池是什么线程池解决的问题动态创建子线程的缺点线程池相关接口线程池相关结构体struct task 任务节点线程池接口init_…