是否可以通过系统调用和 mmap 来跟踪/记录一个或所有应用程序执行的每个文件 IO?

是否可以通过系统调用和 mmap 来跟踪/记录一个或所有应用程序执行的每个文件 IO?

我想跟踪应用程序在其生命周期中执行的每个 IO 操作,并且不希望任何缓存效果干扰。我无法更改应用程序源代码,使用填充程序就可以了。性能不是问题,我只是想记录应用程序所做的事情,即使需要几个小时。其最终目标是使用跟踪来尝试改进与文件系统相关的启发式方法,例如预取。理想情况下,输出类似于 <filename, offset>,但可能就足够了。

到目前为止,这是我的想法以及为什么我认为它们行不通:

  1. 跟踪所有块级访问,例如发送到 SSD 的 IO。这需要禁用预读和页面缓存。前者很容易做到,后者似乎不可能。每 X 个时间单位刷新页面缓存是不可能的,因为不能保证每次读取都会绕过页面缓存。仅禁用写入缓存也是不够的。

  2. 使用 eBPF 跟踪所有文件系统操作,例如这篇文章确实。这里有两个问题:显然只记录了文件的第一个请求(来自博客:“我们实现的探针......识别第一次请求块的时间”),并且我写了博客所做的副本并且读数不会打印出来来源在这里]2(编辑:它没有显示的原因是我正在读取的文件位于 NFS 驱动器上。哎呀)。 BCC 脚本显示系统上发生的一些 IO,但touchblk应用程序中的任何 IO 都没有打印出来。我不知道为什么或如何。

编辑:这里有一些其他想法,但我还不知道如何实现:

  1. 始终将页面标记为不可用,以便始终从磁盘获取它们。
  2. TLB中毒。

我是不是想太多了?是否有一个我没有想到的解决方案可以做到这一点,或者可以修复我发现的问题之一?

谢谢!

相关内容