文章目录

  • 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

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

这里需要注意的是官网的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

最后可以通过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

2.3.2 aep性能测试(intel persistent memory)

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

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

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

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

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

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

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

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

[global]
# 使用 pmem开发的io引擎,会跳过文件系统的相关调用,直接通过mmap写入到持久化内存中
ioengine=libpmem
direct=1
norandommap=1
randrepeat=0
runtime=30
time_based
size=1G
directory=./fiogroup_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之间迁移造成的开销会影响性能

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

磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底相关推荐

  1. 磁盘 io 的性能指标 简介

    目录 主要关注指标 IOPS 带宽 响应时间 磁盘繁忙程度 服务队列满 文件系统使用率 Inode使用率 业务服务器的操作系统作为存储的用户只能看到disk(存储层面的LUN),而存储管理员才知道存储 ...

  2. 磁盘 I/O性能指标

    磁盘 I/O性能指标 在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能.磁盘I/O 性能监控的指标主要包括: 1)每秒 I/O 数(IO ...

  3. Persistent Memory编程简介

    Persistent Memory编程简介 编程 libpmem 持久化函数 libpmemobj 跟对象 root object 例程 事务支持 type safety 线程安全 管理工具 ipmc ...

  4. KVell 单机k/v引擎:用最少的CPU 来调度Nvme的极致性能

    文章目录 前言 KVell背景 业界引擎使用Nvme的问题 CPU 会是 LSM-kv 存储的瓶颈 CPU 也会是 Btree-kv 存储的瓶颈 KVell 设计亮点 及 总体架构实现 KVell 设 ...

  5. 高性能日志:如何提升日志性能避免 IO 瓶颈?

    是当系统处理大量磁盘 IO 操作的时候,由于 CPU 和内存的速度远高于磁盘,可能导致 CPU 耗费太多时间等待磁盘返回处理的结果.对于这部分 CPU 在 IO 上的开销,我们称为 "iow ...

  6. 程序员笔记本性能需求分析--2020年--极致性价比(真香定律)

    最近由于豌豆电脑配置落后,码代码经常卡死.然后本人就重装系统了,但是由于我手残,一不小心把以前的一些重要的学习资料给删了**/(ㄒoㄒ)/~~,仔细想想都是电脑的锅!!于是我决定换电脑!但是我手头甚紧 ...

  7. linux磁盘fio压力测试,fio进行磁盘压力测试

    fio可以用来测试磁盘IO 常用的参数如下: filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb di ...

  8. Linux下磁盘IO读写测试工具-FIO详解

    FIO简介 FIO是Linux下开源的一款IOPS测试工具,主要用来对磁盘进行压力测试和性能验证. 它可以产生许多线程或进程来执行用户特定类型的I/O操作,通过编写作业文件(类似于k8s的yaml)或 ...

  9. 31 | 套路篇:磁盘 I/O 性能优化的几个思路

    上一节,我们一起回顾了常见的文件系统和磁盘 I/O 性能指标,梳理了核心的 I/O 性能观测工具,最后还总结了快速分析 I/O 性能问题的思路. 虽然 I/O 的性能指标很多,相应的性能分析工具也有好 ...

最新文章

  1. 如何破除“唯论文”?详解伯克利“科研重工业模式”的成功经验
  2. 最新 ECSHOP v2.7.3数据表(88张表)
  3. tf.dynamic_stitch 和  tf.dynamic_partition
  4. 史蒂夫·乔布斯很懂团队建设
  5. c++的构造函数初始化列表
  6. 产品经理应该mysql_数据库对产品经理的重要性
  7. 【Java】计算1!+2!+.....+20!的值
  8. MinGW 编译zlib libpng libjpeg等
  9. NUnit单元测试笔记
  10. 买断式软件逐渐向订阅式软件发展,是不是资本想一直割韭菜?
  11. ubuntu(jdk配置)
  12. eclipse无法运行PHP_eclipse 无法运行php文件怎么办
  13. Vue项目部署到服务器上路由无法访问的问题
  14. photo player 显示 ☞ 列表选中项的处理
  15. Win11 22H2怎么跳过联网和微软账户登录?
  16. 弘辽科技:淘宝流量下滑了怎么办?淘宝流量下滑应对方法
  17. 训练诗词生成模型(GPT2)的一点心得
  18. PAT乙级 1003 我要通过! (20分)
  19. 购买电脑时,关于CPU和显卡
  20. 腾讯棋牌开发商(深圳泊众):投身网络棋牌游戏有风险

热门文章

  1. MYSQL 连接数据库命令收藏
  2. 在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址
  3. [原]tornado源码分析系列(三)[网络层 IOLoop类]
  4. .net下绘制统计图工具-请推荐
  5. 计算机二级函数知识,2017年全国计算机二级考试MS Office高级应用知识点:INDIRECT函数...
  6. linux的tar中ztvf,linux中的tar命令(2)
  7. linux wifi-tools,Linux下WiFi工具wireless_tools交叉编译,及其支持生成iwconfig使用的内核配置...
  8. java工具集_Java 工具集
  9. 华为鸿蒙运行视频,某游戏在华为鸿蒙运行,被识别成使用安卓模拟器
  10. mysql h 127.0.0.1_MySQL 连接时尽量使用 127.0.0.1 而不是 localhost