Iostat.py: 输出SPDK Bdev IO子系统性能指标
作者简介
周嘉祺 | Intel 软件工程师,主要从事spdk、isa-l开发和存储软件性能优化的工作
一
前言
提及SPDK应用的测试工具,你可能会想到SPDK自带的Perf工具 或者 SPDK针对标准FIO工具的fio_plugin。这两个工具都可以很好地测试SPDK的性能。
Perf使用参考: 一文读懂SPDK加速关键应用:解析SPDK Perf应用
fio_plugin 使用参考: 基于SPDK的NVMe SSD性能评估指南
但当你跑起了构建在SPDK上的应用后,或者运行起来了SPDK自带的target 后,当你想查看IO子系统的具体IO数据该怎么做呢?这时候使用SPDK开发的iostat.py工具就能获取Bdev层IO数据。
相比perf或者fio_plugin最大的不同:iostat.py获取的是SPDK 应用运行时Bdev自统计的IO数据并计算得出结果。顾名思义,统计出的是bdev子系统的数据。
但这个统计的数据可能和上一层(比如这个application是ISCSI subsystem)和下一层(NVMe 驱动层)统计出的数据未必完全一致。举个例子,在client和target 模型中。Target端部署了一个SPDK iSCSI target,Client 端使用iscsiadm命令然后内核驱动把target上iSCSI target 暴露出的盘mount 到本地。然后使用fio 进行测试,比如是128KB大小的数据。那么client 端统计的IO大小是128KB, 在target端使用Bdev IO统计出的值可能是有区别的。原因在SDPK iSCSI target在使用Bdev 的时候,可能在iSCSI层对IO 做了拆分。比如在ISCSI target中,一个128KB的I/O肯能被拆成了3个,分别是8KB、64KB、56KB(如果iSCSI target 端的firstburstlength是8KB)。
所以bdev 层的io只是bdev 层自己的io统计,并不一定和client 统计的数据完全对应。Iostat.py的使用,是基于SPDK框架(Target / Bdev / Driver),加上测试统计逻辑,进行IO测试统计。因此,iostat.py是无法获得SPDK驱动层管理的设备的性能信息的,如果需要在SPDK用户态驱动下,硬件设备的性能指标,可以通过SPDK NVMe字符设备,或者通过多进程模式。
关于这块,这里不展开描述。
二
iostat简介
Iostat.py的想法来源于sysstat。当装在本机的NVMe SSD绑定的是内核nvme驱动时候,使用sysstat工具时,可以看到该NVMe使用内核驱动统计的IO的情况:
而当使用SPDK的setup.sh脚本(位于script/setup.sh)后,setup.sh脚本将会把本机的NVMe盘绑定到用户态驱动。这时候NVMe盘就可以被SPDK在用户态使用。此时sysstat也将找不到走内核态nvme驱动的NVMe SSD。
如果用户在使用SPDK了后,还想要看到IO子系统具体的IO内容,就可以使用SPDK的iostat.py工具进行监测。
Iostat.py的原理并不复杂,它请求了SPDK Bdev RPC的bdev_get_iostat接口,获取了一些比较原始的数据,进行计算统计,返回结果。
三一
SPDK iostat.py使用
Iostat.py工具位于scripts/iostat.py。由于是python3写的工具,所以需要确保使用者的机器上安装了python3。
在使用之前,请确保SPDK Bdev层的RPC启动之后(如果RPC地址和端口不为默认的地址和端口,则需要指定相应的参数),iostat.py才能正常工作。在这之后,只需要运行./scripts/iostat.py即可启动。
可以看到我的target只配置了两块NVMe,所以显示有两个Bdev的状态在这里。
这里解释一下iostat.py的统计标题的含义:
Device : Bdev名称
Tps : 设备每秒的IO次数(read , write , discarded)
KB_read/s : 每秒读带宽
Kb_wrtn/s : 每秒写带宽
Kb_dscd/s : 每秒丢弃量
KB_read : 总读取量
KB_wrtn : 总写入量
KB_wrtn : 总丢弃量
Iostat.py 可选参数:
-h, --help打印参数选项
-c, --cpu-status 只看cpu stat的选项
-d, --bdev-status 只看SPDK Bdev stat的选项
-k, --kb-display 数据单位以kb显示
-m, --mb-display 数据单位以mb显示
-u, --use-uptime 使用uptime来计算时间间隔,默认应用使用SPDK ticks来计算时间间隔
-i INTERVAL, --interval INTERVAL iostat结果打印的间隔时间,需要配合-t使用
-t TIME_IN_SECOND, --time TIME_IN_SECOND 打印多少次iostat结果,需要配合-i使用
-s SERVER_ADDR, --server SERVER_ADDR RPC的地址
-p PORT, --port PORT RPC的端口
-b NAME, --name NAME 指定Bdev的名称,不指定将会默认所有Bdev
-o TIMEOUT, --timeout RPC接口超时时间
-v RPC请求与返回的数据将被打印
推荐阅读
转载须知
我知道你 在看 哦