【发布时间】:2014-09-28 19:09:16
【问题描述】:
我想截取在 linux 内核中的块 I/O 层和磁盘之间传输的数据。我的目标是收集有关在主机(通过操作系统)和磁盘之间传输的数据的一些统计信息。例如,我想知道特定字符在每个传输的块中出现了多少次。我需要在块级别收集这些信息,因为磁盘和主机之间的所有操作都是以块粒度完成的。
注意:我不确定是否应该使用bio struct 和bio_vec。
【问题讨论】:
-
我建议看
blktrace。它可以根据请求向特定磁盘报告大量信息,例如时间、规模、状态等。但我不确定它是否可以跟踪您请求中传输的数据。无论如何,我建议查看 blktrace 来源,看看它如何获取有关请求的信息。 -
是的,我用过 blktrace。不幸的是,它没有给你指向数据缓冲区的指针。但正如您所建议的,我将查看它的源代码,以了解它如何拦截块 I/O 事件。谢谢!
-
我只是无法想象如何在块层中截取数据。块驱动程序没有任何类型的 API,例如 netfilter 钩子。因此,您可以修改特定的块驱动程序或块调度程序。
-
似乎可以使用设备映射器来跟踪内容,但效率可能不高。
-
@arsane,关于设备映射器的要点。 aminfar,您可以使用简单的设备映射器目标包装您的块设备。在 dm 中,您将收到与数据一起发送的每个 BIO。您可以从琐碎的 dm-zero 和 dm-linear 开始,并添加必要的跟踪功能(字符记录等)。但是,您应该知道设备映射器子系统可能会修改原始 BIO,例如合并它并重新排序,所以如果你关心 BIO 的顺序,那么 dm 不是你的解决方案。
标签: linux file-io linux-kernel linux-device-driver kernel-module