我正在使用 blktrace 来捕获流向我的设备的流量,并且一直在处理一些痛苦的问题。想知道你们是否可以确认/纠正我的发现。
似乎 blktrace 缺少一些事件。我一直在尝试获取向设备发出的读取命令的延迟分布。我知道 blkparse 和 btt 这样做。然而,在仔细检查 blkparse 结果后,似乎延迟数字实际上是响应响应(C 到 C)延迟而不是命令响应(D 到 C)。BTT 也会失败,因为它遇到没有响应的命令(D 存在但 C 缺失)。
所以我尝试开发自己的代码,并意识到有很多情况下发出的命令没有找到响应(D 存在,但没有 C)。还有许多没有命令的响应的情况(C 存在但没有看到先前的 D)。为了确认我的发现,我在 nullblk 设备上运行了 FIO(使用 DRAM,所以它非常快)并启用 blktrace 来跟踪 nullblk 设备。我看到当 FIO 记录 80GB 的数据写入时,blktrace 仅将大约 50GB 的数据捕获到磁盘。我有点困惑,不确定这个结论,但似乎在繁重的工作负载中 blktrace 会丢弃事件。
是不是你们也注意到了?有人可以指出我的错误分析或确认我的发现吗?
我使用的 fio 命令是这样的:
sudo fio --name=seqwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=128k --direct=0 --size=130M --numjobs=600 --runtime=300 --group_reporting
不幸的是,您没有包含您的 blktrace 摘要输出 - 它是否提到了非零数量的丢弃事件?如果是这样,则很可能是保存事件的环形缓冲区,直到它们可以被读取溢出。如果是这种情况,您可以通过使用
--buffer-size
手册页中提到的选项请求更大的缓冲区来解决此问题...