为了基准testing的目的,我想强制Apache 2从磁盘加载每个请求的文件,而不是从内存中的caching加载它。 从我读过的同步跟随
echo 3 > /proc/sys/vm/drop_caches
让我放下linux的caching。 随后对特定文件的请求将不会从linux的caching中提供,但是对于同一文件的进一步请求将再次从linux的caching中提供。 这是因为/ proc / sys / vm / drop_caches不禁用caching,它只丢弃那些已被caching到那一刻的内容。 我可能会在每个请求之前删除caching,但我更喜欢另一个解决scheme。 还有什么我可以做,以确保Apache从磁盘加载每个请求的文件?
为什么我想这样做 :我知道在正常的操作中caching是启用的。 但是服务器并没有提供小的,经常访问的文件,比如html页面,小图片等,而是从大量的文件中提供几兆字节大小的文件。 这些文件访问非常一致,因此每个单独的文件很less被访问。 因此,在正常操作中,我期望大多数访问不会导致caching命中,但需要从磁盘加载文件。 我有几个示例文件,我想通过使用apache的ab基准testing来衡量服务器每秒能够处理多less事务。 不幸的是我相信我得到的结果是因为caching太乐观了。 因此,我想禁用Linux的磁盘caching,任何cachingApache可能会自己做。
更新: 到目前为止给出的答案告诉我如何禁用Apache自己的caching,但我仍然想知道是否有一种方法来禁用由Linux内核完成的caching。
我不认为你可以禁用Linux中的所有磁盘caching。
作为一个黑客,你可以继续运行“sync; echo 3> / proc / sys / vm / drop_caches”来刷新几乎所有caching在内存中的东西。 从控制台
watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`
会做的伎俩。 在上面的例子中,没有任何东西会被内核caching超过一秒钟,尽pipe它不会影响Apache或其他进程在内存中保存的数据。 它也可能不会从任何内存映射文件中冲洗仍然打开并locking部分的文件。
如果你只想在testing运行开始时不caching任何东西,并且不在乎在testing过程中是否caching了东西,那么你可以添加一个调用来“同步”和“echo 3> / proc / sys / vm / drop_caches“在testing运行开始。
如果你的testing涉及访问数据库的脚本,那么你需要能够告诉你的数据库后端不要在testing之间在内存中caching东西。
您可以通过禁用mod_cache模块来禁用Apache中的大部分caching,在configuration中注释掉以下几行就可以了:
LoadModule cache_module LoadModule disk_cache_module LoadModule mem_cache_module 不,禁止使用缓冲区caching是不可能的。 有一些方法可以通过编程来实现(例如在O_DIRECT中打开文件),但是必须重写apache才能执行此操作。
从核心上看,您似乎正在尝试为多个stream式兆字节大小的文件对IO子系统进行基准testing。 有没有更好的方法来做到这一点,而无需将Apache的开销混入到图片中。
如果你决定尝试这样做,你可以尝试写一个小程序malloc在机器上的大部分物理内存来减less磁盘caching可用的数量,但这可能会导致服务器页面毁了你的基准testing结果(apaches多进程模型将与此交互严重,除非将StartServers , MinServers和MaxServers设置为相同的值,以避免在基准testing期间创buildstream程)
我可能在这里非常糟糕(所以让我知道,如果我做了一个不正确的假设),但Linux中的磁盘caching被称为交换,并使用交换文件或交换分区。
swapoff -a
应该禁用磁盘caching。