我正在使用 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
答案1
不幸的是,您没有包含 blktrace 摘要输出 - 它是否提到了非零数量的丢弃事件?如果是这样,那么很可能是环形缓冲区保存了事件,直到它们可以被读取溢出。如果是这种情况,您可以通过使用--buffer-size
手册页中提到的选项...