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的情况:

Iostat.py: 输出SPDK Bdev IO子系统性能指标

而当使用SPDK的setup.sh脚本(位于script/setup.sh)后,setup.sh脚本将会把本机的NVMe盘绑定到用户态驱动。这时候NVMe盘就可以被SPDK在用户态使用。此时sysstat也将找不到走内核态nvme驱动的NVMe SSD。

Iostat.py: 输出SPDK Bdev IO子系统性能指标

如果用户在使用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即可启动。

Iostat.py: 输出SPDK Bdev IO子系统性能指标

可以看到我的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请求与返回的数据将被打印

Iostat.py: 输出SPDK Bdev IO子系统性能指标

推荐阅读

SPDK线程模型解析

用户态NVMe运维利器 -- SPDK NVMe 字符设备

转载须知

DPDK与SPDK开源社区公众号文章转载声明

Iostat.py: 输出SPDK Bdev IO子系统性能指标

我知道你  在看  哦