出于基准测试的目的,我想强制 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 内核完成的缓存。
我认为您不能禁用 Linux 中的所有磁盘缓存。
作为 hack,您可以继续运行“sync; echo 3 > /proc/sys/vm/drop_caches”来刷新几乎所有缓存在内存中的内容。从控制台
会成功的。在上面的例子中,内核缓存的时间不会超过一秒钟,尽管它不会影响 Apache 或其他进程在内存中保存的数据。它也可能不会从任何仍然打开且部分锁定的内存映射文件中刷新内容。
如果您只想在测试运行开始时不缓存任何内容,并且不在乎它是否在测试期间缓存内容,那么您只需添加一个对“sync”和“echo 3 > /proc/sys/vm”的调用/drop_caches”在您的测试运行开始时。
如果您的测试涉及访问数据库的脚本,您将需要能够告诉您的数据库后端不要在测试之间也将内容缓存在 RAM 中。
您可以通过禁用 mod_cache 模块来禁用 Apache 中的大部分缓存,注释掉配置中的以下行应该可以解决问题:
LoadModule cache_module
LoadModule disk_cache_module
LoadModule mem_cache_module
不,不可能禁用缓冲区高速缓存。有一些方法可以以编程方式执行此操作(例如,在 O_DIRECT 中打开文件),但必须重写 apache 才能执行此操作。
从本质上讲,您似乎正在尝试针对多个流传输兆字节大小的文件对 IO 子系统进行基准测试。有很多更好的方法可以做到这一点,而不会将 apache 的开销混入图片中。
如果您决定尝试这样做,您可以尝试编写一个小程序来分配机器中的大部分物理内存以减少可用磁盘缓存的数量,但这可能会导致服务器页面破坏您的基准测试结果(apaches 多进程除非您将
StartServers
,MinServers
和设置MaxServers
为相同的值以避免在基准测试运行期间创建进程,否则模型将与此交互不良)我在这里可能非常不平衡(如果我做出不正确的假设,请告诉我),但 Linux 中的磁盘缓存称为交换,并使用交换文件或交换分区。
应该禁用磁盘缓存。