从内核获取总块设备 IO,包括缓冲区高速缓存命中

从内核获取总块设备 IO,包括缓冲区高速缓存命中

我正在致力于创建一个在 Linux 上显示系统统计信息的工具。我使用 /sys 和 /proc API 来了解它们的工作原理。

目前,我正在阅读/sys/block/<dev>/stat以获取块设备统计信息(文档)。这对于查看磁盘上发生的读写量非常有用,但我想知道是否可以从应用程序的角度查看总块设备 I/O。

这是一个例子来证明我的意思:

> cat somebigfile > /dev/zero # Takes some time, triggers device I/O
> cat somebigfile > /dev/zero # Runs quickly a second time, no device I/O

我相信两次运行之间的差异是由于内核进入缓冲区缓存而不是磁盘进行第二次读取。我通过刷新缓存来确认这一点,/proc/sys/vm/drop_caches使命令再次像第一次一样执行。

查看一段时间内从块设备读取的总字节数(包括从缓冲区高速缓存提供的字节数)的最简单方法是什么?

我还考虑过对 中的值求和/proc/<pid>/io,但这包括所有 I/O,并且不按设备或类型进行拆分。

我知道我可以使用类似的东西来做到这一点系统点击,但我想知道是否有更简单的方法。

答案1

几年前我编写了“统计收集器”服务 -读写磁盘状态

我使用了值,/sys/block/<dev>/stat然后将它们转换为字节。

从应用角度来看,cgroups很有用。可以将不同的应用程序放在某个组中'BLKIO'并读取'blkio.io_service_bytes'计数器。

相关内容