确定各种文件系统的缓存未命中

Posted

技术标签:

【中文标题】确定各种文件系统的缓存未命中【英文标题】:Determining cache misses for various filesystems 【发布时间】:2009-11-23 15:47:40 【问题描述】:

我有一个学校项目,我必须找出文件系统在重负载和轻负载以及多处理器机器上会有多少缓存未命中。在和我的教授讨论后,我想出了一个基本的执行计划:

    创建一个程序,该程序将阻塞文件系统并填满缓冲区缓存。 使用系统基准测试工具记录缓存未命中次数。 冲洗并在新条件下重复。

但是作为操作系统设计的新手,我不确定如何进行。所以这里有一些地方我需要一些help:

    理想的程序会执行哪些操作来填满缓冲区缓存?目前,我编写的程序读取和写入几个不同的文件,x 次。 有哪些工具可以记录缓存未命中的次数?我研究了 oprofile 但我认为它不会监视文件系统的缓冲区缓存。但我发现这个list 看起来很有希望。 其他正在运行的进程会影响这些基准吗?

感谢您的帮助!

【问题讨论】:

您正在开发什么操作系统?不同的操作系统会使用不同的工具。 我正在使用 Ubuntu 9.10 (ext4) 开始,但我还想测试 ext2、ext3 和 zfs。 ext2 和 ext3,我将在旧版本的 Ubuntu 上进行测试,我将使用 OpenSolaris for ZFS。 【参考方案1】:

1) 如果您正在尝试测试您的文件系统性能,请在您的 I/O 线程旁边加入几个处理大量文件元数据的线程。此外,在多个并行线程中执行 I/O 时,混合执行大型传输的线程和执行小型传输的线程。许多文件系统会将小的 I/O 操作合并成更大的请求,物理驱动器可以以更省时的方式处理这些请求,混合各种大小的 I/O 可能有助于更快地填满缓存(因为它必须缓冲合并的输入/输出)。

2) 请注意该工具列表,其中许多工具看起来像是设计用于在原始设备上运行,而不是通过文件系统层(因此您得到的结果可能并不代表您认为它们所做的事情)。如果您正在寻找一种工具来对特定文件系统进行基准测试,那么最好的选择可能是与该文件系统的开发团队联系。他们很可能会向您指出他们在开发过程中用来对 FS 进行基准测试的工具,即使它是内部开发的自定义工具。

3) 是的,任何其他正在运行并可能访问被测文件系统的东西都可能会影响您的结果。您可能希望创建一个单独的文件系统仅用于此测试,并关闭任何可能在您运行测试时尝试访问它的后台扫描。

【讨论】:

【参考方案2】:

这是一个有趣的问题。也许我可以给你一个部分的答案。

您应该知道 Linux 有多个与文件系统相关的缓存,这些缓存可能有不同的工具

inode 缓存 Dentry 缓存 块缓存

一种方法是计算(猜测?)您的操作应该产生多少块级流量,然后使用 blktrace 测量实际的块操作(读取、写入、查找)。

我不知道有什么方法可以读取 inode 和 dentry 缓存的缓存未命中状态。我真的很想被告知我在这里错了。

困难的方法是使用自己的计数器注释 inode 缓存和 dentry 缓存,但这些缓存是相当硬的内核代码。

【讨论】:

以上是关于确定各种文件系统的缓存未命中的主要内容,如果未能解决你的问题,请参考以下文章

为啥 perf 不报告缓存未命中?

在配置文件引导优化后嵌套 for 循环更快,但缓存未命中率更高

深入理解计算机系统笔记

高并发情况利用锁机制处理缓存未命中

并发编程高并发相关技术

深入理解计算机系统-虚拟内存笔记