磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底
文章目录
- 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
:读请求处理完成等待时间,也包括队列中的等待时间和设备实际处理的时间,单位是msw_wait
:写请求处理完成等待时间,也包括队列中的等待时间和设备实际处理的时间,单位是msavgqu-sz
:平均请求队列长度avgrq-sz
: 平均读请求块(sector)大小,一个sector是512Bsvctm
:处理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
用户IDPID
进程IDkB_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搞定。
相关文章:

Java项目:旅游网站管理系统设计和实现(java+springboot+jsp+mysql+spring)
源码获取:博客首页 "资源" 里下载! 运行环境: java jdk 1.8 IDE环境: IDEA tomcat环境: Tomcat 7.x,8.x,9.x版本均可 主要功能说明: 管理员角色包含以下功能:管理员登录,用户管理,旅游路线管理,…

稀疏矩阵十字链表表示
类型定义 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define MAX 100 /*稀疏矩阵的十字链表表示:非零元素节点与表头节点公用一种类型 */ typedef struct matrixnode {int row,col;struct matrixnode *right,*down;union{int val…

thrift框架使用C++
2019独角兽企业重金招聘Python工程师标准>>> 1. 编写thrift接口文件student.thrift struct Student{1: i32 sno,2: string sname,3: bool ssex,4: i16 sage, } service Serv{i32 put(1: Student s), } 2. 用“thrift -r --gen cpp student.thrift”在gen-cpp文件夹中…

shell编程:实现shell字符串连接功能
功能:实现shell字符串连接功能 a0 s1test. s2.wav s3.mp3 s40 s500str"sox ./${s1}${a}${s2} ./${a}${s3}"./tts -c bcgirl.0.0.4.bin -b 1 -i input.txt -s 1.0 -speed 1.0 $str rm ./*.wav转载于:https://www.cnblogs.com/kay2018/p/10673110.html

一文运维zookeeper
文章目录1. zookeeper生产环境的安装配置1.1 软件配置1.2 硬件配置1.3 日志配置文件1.4 配置三节点的zookeeper集群2. zookeeper的监控方法2.1 four letters命令2.2 JMX 监控方式3. 通过zookeeper observer实现跨地域部署3.1 什么是observer3.2 observer 提升 写性能3.3 observ…

Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
源码获取:博客首页 "资源" 里下载! JAVA springboot 电商书城平台系统(已调试) 主要实现了书城网站的浏览、加入购物车操作、订单操作、支付操作、分类查看、搜索、以及后台上传图书信息以及订单管理和一些基本操作功能 主要功能截图如下&…

(周三赛)FATE
//题意 打怪的经验值 ,消耗忍耐度 看升级后还能保留的最大忍耐度 用 背包去做,不是很会啊 T T Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感&#…

ASP.NET MVC 3中ViewBag, ViewData和 TempData
ViewBag, ViewData十分类似,都可用于把数据从controller传递到view。 ViewBag是WebViewPage中的一个属性,它的类型是dynamic。dynamic类型可以理解为,编译器在编译到这种类型时,会跳过类型检查,而在运行时做这些事情。…

如何在指定文件夹下进入jupyter notebook
第一步: 打开 Anaconda Prompt 第二步: 查看文件夹所在路径 例如:你有个jupyterwork文件夹在 D:\ 路径下 第三步: 在Anaconda Prompt依次输入一下命令: d:cd jupyterworkjupyter notebook完成。转载于:https://www.cnb…

Go 分布式学习利器(16) -- go中可复用的package构建
通过本文,你将了解go 语言中如何将自己的package构建到项目中 以及如何将远程(github)的package构建到项目中。 1. 构建本地的package package 是可复用模块的基本单元,以首字母大写的函数实现来表明可被包外代码访问代码的pack…

JQuery UI
//拖拽插件 draggable <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><title>拖曳…

Java项目:房屋租赁系统设计和实现(java+ssm+mysql+spring+jsp)
源码获取:博客首页 "资源" 里下载! 主要功能描述: 1.登录管理:主要有管理员登录和租客登录 2.房源列表以及添加房源功能: 3.租赁合同管理以及在租房源和已退租房源信息管理: 4.看房申请和退租申请管理&a…

学习网页制作中如何在正确选取和使用 CSS 单位
在 CSS 测量系统中,有好几种单位,如像素、百分比、英寸、厘米等等,Web 开发人员很难了解哪些单位在何处使用,如何使用。很多人习惯了总是使用同一种单位,但这一决定可能会严重限制你的设计的执行。 这里推荐的《Which …

SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目。 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治线段树区间合并(单点更新、区间查询) 代码: 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long l…

Zookeeper ZAB协议原理浅析
文章目录前言1. 基本角色和概念2. Leader Election3. Discovery4. Synchronization5. BroadCast后记前言 DTCC 要在下周一到周三要在北京举办,身边有不少人都去参加了,领略中国最为领先的一些公司的自研存储技术。 阿里自研polardb,polardb-…

Java项目:仓库管理系统设计和实现(java+ssm+springboot+layui)
源码获取:博客首页 "资源" 里下载! 主要功能模块 1.用户模块管理:用户登录、用户注册、用户的查询、添加、删除操作、 2.客户信息管理:.客户列表的展示、添加、修改、删除操作、 3.供应商管理:供应商详情…

Java Web 中的一些问题
http://localhost:8080/struts2demo/online/userLogin.jsp 请求模式 :// 主机名名称(或者服务器名称) : 端口 / Servlet容器的名称(通常为项目名称) / 自定义的网页文件夹名或者映射中的文件包名 / 网页名称及其后缀或者响应动作…

《零成本实现Web自动化测试--基于Selenium》第一章 自动化测试基础
第一篇 Selenium 和WebDriver工具篇 第一章 自动化测试基础 1.1 初识自动化测试 自动化测试有两种常见方式 1.1.1 代码驱动测试,又叫测试驱动开发(TDD) 1.1.2 图形用户接口测试: 测试框架产生用户接口事件(例如键盘敲击&#x…

第11章 AOF持久化
AOF持久化在硬盘上保存的是对Redis进行的逻辑操作,类似InnoDB中的bin log。说白了就是你对一个Redis输入了哪些语句,AOF文件都会原封不动的保存起来,等到需要回复Redis的时候再把这些语句执行一遍。 11.1 AOF持久化的实现 AOF简单的理解是把执…

Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)
今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force)RK(Rabin Karp) 源字符串:src, 目标字符串:dest; 确认dest是否是src 的一部分。 BF算法很简单暴力,维护两个下标…

Java项目:前后端分离网上手机商城平台系统设计和实现(java+vue+redis+springboot+mysql+ssm)
源码获取:博客首页 "资源" 里下载! 主要模块设计如下: 前后端主要技术:Java springboot springMVC mybatis mysql vue jquery node.js redis 1) 用户注册和登录功能:。 2) 用户信息的管理以及角色的…

利用AutoSPSourceBuilder和Autospinstaller自动安装SharePoint Server 2013图解教程——Part 1...
这是一篇对之前 《利用AutoSPSourceBuilder和Autospinstaller自动安装SharePoint Server 2013图解教程——Part 2》的补充。本篇博客将对AutoSPSourceBuilder的使用进行说明。 AutoSPSourceBuilder介绍 下载AutoSPSourceBuilder点击进入AutoSPSourceBuilder的官网,找…

Git 版本还原命令
转载:https://blog.csdn.net/yxlshk/article/details/79944535 1.需求场景: 在利用github实现多人协作开发项目的过程中,有时会出现错误提交的情况,此时我们希望能撤销提交操作,让当前版本回到提交前的样子或者某一个版…

NVME CLI -- nvme 命令查看NVME设备内部状态
文章目录NVME 和 AHCI 性能比较NVME-CLI nvme工具使用1. 安装2. 命令综述3. 基本命令演示4. NVME 固件设备升级近期在做一些rocksdb on 新硬件的性能测试(flash ssd, nvme ssd , nvme optane ssd, optane persistent memory),由于底层一些设备…

Java项目:网上水果蔬菜项目系统设计和实现(java+springboot+mysql+ssm)
源码获取:博客首页 "资源" 里下载! 主主要技术:java springmvc springboot mybatis mysql jquery layui 等技术要模块设计如下: 用户角色的功能: 登录、注册、浏览商品、修改个人信息(上传…

POJ 1189 记忆化搜索
钉子和小球Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 7218 Accepted: 2164Description 有一个三角形木板,竖直立放,上面钉着n(n1)/2颗钉子,还有(n1)个格子(当n5时如图1)。每颗钉子和周围的钉子的距离都等于d&am…

Android短信管家视频播放器代码备份
自己保留备份,增强记忆 这是video的类 public class VideoActivity extends Activity {/*** 解析网络页面*/private WebView wv;/*** 进度条类*/private ProgressDialog pd;/*** 异步处理消息*/private Handler handler;private static final int SHOW 0;private s…

Python常用函数--文档字符串DocStrings
Python 有一个甚是优美的功能称作python文档字符串(Documentation Strings),在称呼它时通常会使用另一个短一些的名字docstrings。DocStrings 是一款你应当使用的重要工具,它能够帮助你更好地记录程序并让其更加易于理解。令人惊叹…

Go 分布式学习利器(17)-- Go并发编程之协程机制:Grountine 原理及使用
文章目录1. Thread VS Groutine2. Groutine 调度原理3. Groutine 示例代码关于Go的底层实现还需要后续持续研究,文中如有一些原理描述有误,欢迎指证。 1. Thread VS Groutine 这里主要介绍一下Go的并发协程相比于传统的线程 的不同点: 创建…

Java项目:美食菜谱分享平台系统设计和实现(java+springboot+mysql+ssm)
源码获取:博客首页 "资源" 里下载! 主要技术实现:spring、 springmvc、 springboot、mybatis 、session、 jquery 、 md5 、bootstarp.js tomcat、拦截器等。 具体主要功能模块如下: 1.用户模块管理:用户…