文章目录
- 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
用户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
- 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存储产品族中所处位置如下:
官方给的单个128G pmem的性能指标如下:
将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>