spdk nvme测试工具 perf

spdk nvme测试工具 perf

perf vs libaio

fio命令

fio -filename=/dev/nvme1n1 -direct=1 -iodepth=128 -thread -rw=randwrite -ioengine=libaio -bs=4k -numjobs=1 -runtime=180 -group_reporting -name=randw
fio -filename=/dev/nvme1n1 -direct=1 -iodepth=128 -thread -rw=randwrite -ioengine=libaio -bs=4k -numjobs=4 -runtime=180 -group_reporting -name=randw

perf命令

/usr/local/bin/spdk_nvme_perf -q 128 -o 4096 -w randwrite -r 'trtype:PCIe traddr:0000:da:00.0' -t 300
/usr/local/bin/spdk_nvme_perf -c 0xf -q 128 -o 4096 -w randwrite -r 'trtype:PCIe traddr:0000:da:00.0' -t 300

结果

iops(libao) iops(perf)
4K randwrite,1 cpu 317k 469K
4K randwrite, 4cpu 482k 497K
4K randread, 1cpu 294k 290K
4K randread, 4cpu 642k 532K

可以看到libaio并不比perf的性能差,甚至有的性能数据还比perf好。网上也有分析说,perf在快速的介质下,更能体现出来优势;
尝试增加队列深度为4096

/usr/local/bin/spdk_nvme_perf -q 4096 -o 4096 -w randread -r 'trtype:PCIe traddr:0000:da:00.0' -t 300
engine randread(1core)
libaio 317k
perf 492K

此时可以看见,差距还是比较明显的

perf参数

多qpair vs 单qpair

/usr/local/bin/spdk_nvme_perf  -P 4 -q 128 -o 4096 -w randread -r 'trtype:PCIe traddr:0000:da:00.0' -t 300
/usr/local/bin/spdk_nvme_perf  -P 1 -q 128 -o 4096 -w randread -r 'trtype:PCIe traddr:0000:da:00.0' -t 300
1 qpair 4 qpair
randread 332K 324K
randwrite 490K 496K

两者之间没有明显的差异。
在这里,研究了一下perf向qpair下发IO的模型:
spdk nvme测试工具 perf_第1张图片

当queue depth为128,qpair数量为4时,平均分配到每个qpair的io个数为32个。perf的IO下发流程为:

1、向每一个qpair下发32个IO;
2 、busy polling这个4个qpair;
      (1) 第一次批量下发IO,此时还没有doorbell SQ,无法poll到completion;触发doorbell SQ;
      (2) poll到32个completions,同时在每一个completion的回调中,再次submit一个IO;
      (3) 积累到32个completions,同时也下发了32笔IO,一次doorbell SQ和CQ;
      (4) 继续polling completion;
hardcode最大的poll completions个数为128个

基于上面的分析,在128的队列深度里,使用1qpair进行doorbell的次数还要小于4qpair(因为使用1个qpair时,这个qpair的队深度是128,刚好为max poll completions)。但是显然,在这种情况下,doorbell的差异,并不能引起明显的性能差异。

结论

基于SPDK的nvme驱动替代libaio作为底层的存储engine,仍需要进一步的测试研究。

你可能感兴趣的:(spdk,测试工具)