我在 Amazon EC2 微型实例上运行一个网站,其中包含一个流行的 99% 静态 html 页面(1 MB),每天的页面浏览量约为 35,000 次。该网站大约每 3-4 小时才更改一次,并且已经运行 mod_deflate,使页面大小达到 100KB 左右。
我想知道是否有任何方法可以告诉 apache2 该页面应该始终位于内存中?
或者它已经以某种方式被 apache2 或磁盘缓存(运行 ubuntu,ext3)?
答案1
(半)技术要点
Linux(以及其他类 Unix 系统,可能还有任何其他服务器操作系统)会将最近/经常使用的文件数据保存在 RAM 中。在 Linux 中,这称为“页面缓存“。
对于目录,linux 还会将最近查找的文件名和最近列出的目录保存在“牙髓“(目录条目)。这样,反复查找同一个名称不会引起磁盘访问,甚至不需要经过特定的文件系统层代码(例如,ext3)。
因此,如果文件经常使用,Linux 会将文件数据和元数据都保存在 RAM 中。这发生在内核中,因此:
- Apache 和其他 Linux 进程不需要做任何事情;
- 不同的进程共享 Linux 文件系统缓存功能;如果某些程序需要读取另一个程序最近读取(或写入)的文件,它将受益于缓存。
如果每个程序都必须实现自己的磁盘缓存,那么即使它们需要相同的文件,它们也会占用内存。(如果某个进程被换出,并且带有 RAM 文件缓存,情况也会变得混乱!)
但事实上,一个文件经常被完全读取,因此会完全缓存在 RAM 中,这并不意味着对此文件的重复只读访问不会引起任何磁盘访问:因为 Linux 和其他 Un*x 一样,有一个文件的概念上次访问时间(atime
),它将必须定期更新磁盘上的文件元数据 - 除非您关闭 fs 级别的访问时间更新(选项noatime
)。在这样做之前,您必须确保没有任何内容依赖于正确的访问时间。这主要是个人电脑的问题,其中atime
更新会阻止磁盘休眠,在服务器上可能无关紧要。我提到这一点主要是为了完整性。
真正的问题
您是否对您的系统进行了性能分析?您是否发现了具体的性能问题?