一
前言
提及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用户态驱动下,硬件设备的性能指标,可以通过