在 Linux 上禁用 apache2 的所有磁盘缓存

在 Linux 上禁用 apache2 的所有磁盘缓存

为了进行基准测试,我想强制 Apache 2 从磁盘加载每个请求的文件,而不是从内存中的缓存加载。据我所知,同步其次是

echo 3 > /proc/sys/vm/drop_caches

让我删除 linux 的缓存。然后,对特定文件的后续请求将不会从 linux 的缓存中提供,但对同一文件的进一步请求将再次从 linux 的缓存中提供。这是因为 /proc/sys/vm/drop_caches 不会禁用缓存,它只会丢弃到那时为止已缓存的内容。我可能可以在每次请求之前删除缓存,但我更喜欢另一种解决方案。我还能做些什么来确保 apache 从磁盘加载每个请求的文件?

我为什么要这么做:我知道在正常操作中缓存是启用的。但服务器不提供小型且经常访问的文件,例如 html 页面、小图像等。相反,它提供的文件大多是来自大量文件的几兆字节大小。这些文件的访问非常均匀,因此每个单独的文件很少被访问。因此,在正常操作中,我预计大多数访问不会导致缓存命中,但需要从磁盘加载文件。我有几个示例文件,我想使用 apache 的AB基准测试来衡量服务器每秒能够处理多少事务。不幸的是,我认为由于缓存的原因,我得到的结果过于乐观。因此,我想禁用 Linux 的磁盘缓存以及 Apache 可能自行执行的任何缓存。

更新:迄今为止给出的答案告诉我如何禁用 Apache 自己的缓存,但我仍然想知道是否有办法禁用 Linux 内核的缓存。

答案1

我认为您不能禁用 Linux 中的所有磁盘缓存。

作为一种黑客手段,你可以继续运行“sync; echo 3 > /proc/sys/vm/drop_caches”来刷新几乎所有缓存在内存中的内容。从控制台

watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`

就可以了。在上面的例子中,内核不会缓存任何内容超过一秒钟,但这不会影响 Apache 或其他进程在内存中保存的数据。它可能不会刷新任何仍处于打开状态且部分已锁定的内存映射文件中的内容。

如果您只希望在测试运行开始时不缓存任何内容,并且不关心它是否在测试期间缓存内容,那么您只需在测试运行开始时添加对“sync”和“echo 3 > /proc/sys/vm/drop_caches”的单个调用。

如果您的测试涉及访问数据库的脚本,您将需要能够告诉数据库后端在测试之间不要在 RAM 中缓存内容。

答案2

您可以通过禁用 mod_cache 模块来禁用 Apache 中的大部分缓存,在您的配置中注释掉以下几行就可以了:

  • LoadModule cache_module
  • LoadModule disk_cache_module
  • LoadModule mem_cache_module

答案3

不,无法禁用缓冲区缓存。有多种方法可以通过编程实现此目的(例如,在 O_DIRECT 中打开文件),但必须重写 apache 才能实现此目的。

从本质上讲,您似乎正在尝试对 IO 子系统进行基准测试,以处理多个流式兆字节大小的文件。有更好的方法可以做到这一点,而无需将 apache 的开销混入其中。

如果您决心尝试这一点,您可以尝试编写一个小程序来 malloc 机器中的大部分物理内存,以减少可用的磁盘缓存量,但是这可能会导致服务器页面破坏您的基准测试结果(除非您将 、 和 设置StartServersMinServers相同MaxServers的值以避免在基准测试运行期间创建进程,否则 apache 的多进程模型将与此产生不良交互)

答案4

我在这里可能非常不平衡(所以如果我做出了错误的假设,请告诉我)但 Linux 中的磁盘缓存称为交换,并使用交换文件或交换分区。

swapoff -a 

应该禁用磁盘缓存。

相关内容