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

dav*_*nio 7 linux disk-cache apache-2.2 benchmark

出于基准测试的目的,我想强制 Apache 2 从磁盘加载每个请求的文件,而不是从内存中的缓存加载它。从我读过的同步开始,然后

echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

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

我为什么要这样做:我知道在正常操作中启用了缓存。但是服务器不提供小的和经常访问的文件,例如 html 页面、小图像等。相反,它提供的文件大多是来自一个非常大的文件集的几兆字节大小的文件。这些文件的访问非常统一,因此很少访问每个单独的文件。因此,在正常操作中,我希望大多数访问不会导致缓存命中,但需要从磁盘加载文件。我有几个示例文件,我想使用 apache 的ab访问它们衡量服务器每秒能够处理多少事务的基准。不幸的是,我相信由于缓存,我得到的结果太乐观了。因此,我想禁用 Linux 的磁盘缓存,而任何缓存 Apache 可能会自行完成。

更新:到目前为止给出的答案告诉我如何禁用 Apache 自己的缓存,但我仍然想知道是否有办法禁用由 linux 内核完成的缓存。

Dav*_*ett 7

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

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

watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`
Run Code Online (Sandbox Code Playgroud)

会做的伎俩。在上面的例子中,内核缓存不会超过一秒钟,尽管它不会影响 Apache 或其他进程保存在内存中的数据。它也可能不会从仍然打开且部分锁定的任何内存映射文件中刷新内容。

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

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