我有一个应用程序,我想测量其页面缓存命中/未命中数。我发现这个工具叫cachestat作者:Brendan Gregg,使用该ftrace
工具计算 4 个特定函数(mark_page_accessed()
、mark_buffer_dirty()
、add_to_page_cache_lru()
和account_page_dirtied()
)的数量,以找出页面缓存访问和页面缓存未命中的总数。详细信息可以查到这里,但基本上,页面缓存访问和页面缓存未命中的总数可以计算如下:
总访问次数 = 次数
mark_page_accessed()
-mark_buffer_dirty()
未命中次数 = 次数add_to_page_cache_lru()
- 未命中次数account_page_dirtied()
当在我的系统上运行时(在两个系统上测试,内核版本分别为3.10和4.18),命中率变成负数,因为由于某种原因, 的数量add_to_page_cache_lru()
大于 的数量mark_page_accessed()
,而其他两个函数的数量是几乎为零(每 5 秒调用 0~10 次,而其他两个函数则调用数十万~数百万次)
正如布伦丹(Brendan)在本文中所解释的那样线,不同的内核可能使用不同的内核函数来访问(或插入)页面缓存。我认为,如果我知道在页面缓存访问/未命中/命中时调用了哪些其他函数,我就可以修改提供的脚本以在我的内核上运行。不幸的是,我对 Linux 内核的函数知之甚少,希望您能帮助我确定在页面缓存访问时调用了哪些函数。
谢谢!