我购买了一台虚拟服务器,有 8 个 vCPU、16G 内存和 500G ssd 卷(由 ceph rbd 支持)。然后我使用fio来测试服务器的IO性能。为了更好地理解fio结果,在测试过程中,我还使用了blktrace来捕获块层IO跟踪。
序列写入
fio --filename=/dev/vdc --ioengine=libaio --bs=4k --rw=write --size=8G --io深度=64 --numjobs=8 --direct=1 --runtime=960 --name=seqwrite --group_reporting
兰德阅读
fio --filename=/dev/vdc --ioengine=libaio --bs=4k --rw=randread --size=8G --io深度=64 --numjobs=8 --direct=1 --runtime=960 --name=randread --group_reporting
我想了解的是 seqwrite 和 randread 在块层的区别。
为什么 randread 有很大一部分 I2D 而 seqwrite 没有?
您是否意识到您的 8 个 numjobs 中的每一个都覆盖了与其他 numjobs 相同的区域?这意味着如果同一区域的覆盖足够接近的话,块层可能会丢弃后续请求(这在顺序情况下有点可能)...
为什么randread没有Q2M?
很难将随机 I/O 与现有的排队 I/O 进行反向合并,因为它通常是不连续的!