Linux的磁盘缓存(页缓存)用于缓存文件数据并使用尽可能多的RAM。升级服务器的 RAM 后,我下载大文件的速度比磁盘允许的速度要快。但前提是该文件之前已下载过一次,这对我来说绝对是合乎逻辑的:
但这是否意味着,一个与我的缓冲区大小一样大或更大的文件,它将覆盖所有更频繁访问的缓存文件?或者是否有一种智能机制可以在不再访问大文件后“重新抓取”那些“热门”文件?
答案1
但这是否意味着,一个与我的缓冲区大小一样大或更大的文件,它将覆盖所有更频繁访问的缓存文件?
不,缓存比这更聪明。页面高速缓存中的页面在两个列表中进行跟踪:非活动列表和活动列表。当页面出现故障时(IE,从磁盘读取数据),最初被添加到非活动列表中;如果再次访问,则将其提升到活动列表。页面仅从非活动列表中逐出。
特别是,这意味着读取一次的大文件不会驱逐多次使用的小文件。
这也解释了您所看到的行为。当您第一次下载大文件时,它会被读入缓存,但随着 Web 服务器处理该文件而逐渐被逐出。因此,您的第二次下载并未在缓存中开始;但它最终赶上了仍在缓存中的页面。第二次下载导致相应的页面变得更适合保留在缓存中,而您的第三次下载则在缓存中找到了所有内容。
您将找到此方法的详细说明在内核源代码中。
或者是否有一种智能机制可以在不再访问大文件后“重新抓取”那些“热门”文件?
然而,这是内核所采用的一种智能机制。不(一个类似的例子是当系统安静时内核将未使用的页面移动到交换的持久想法;但事实并非如此)。内核不会过多地预测未来;而是会尝试预测未来。此“规则”的例外之一是它确实在块设备上执行预读,但仅此而已。