我有一个拥有 8GB RAM 的网络服务器,它运行着一个相当密集的 php 站点(1 个站点),可以进行文件操作、绘图、电子邮件、论坛等。环境远非静态,这让我相信将任何东西缓存在 RAM 中几乎没有什么好处,因为几乎每个对服务器的请求都会创建新的或更新的页面。而且很多缓存都是在客户端完成的,因此当涉及到图像、javascript、css 时,我们会有大量的 304 请求。
此外,我确实有一些语言文件被写入服务器上的平面文件,缓存内存肯定比从磁盘读取更好。但只有少数文件是这样的。
大约两周后,我的可用内存从 98% 降到了 4%。这发生在我们还将几个大型 svn 更新推送到服务器的时候。
我的问题是,如果我使用以下命令定期清除缓存(我知道 Linus Torvalds 对缓存的看法),我的服务器是否会得到更好的调整:
sync; echo 3 > /proc/sys/vm/drop_caches
或者我最好编辑以下文件:
/proc/sys/vm/swappiness
如果我将默认值 60 替换为 30,那么交换次数就会大大减少,而陈旧缓存的重用次数也会增加。
使用第一个命令看到所有缓存都释放了确实感觉很好,但如果我说这对桌面环境有好处,那我就是在骗你。但是对于我上面描述的 Web 服务器呢?有什么想法吗?
编辑:我知道系统会在需要时从缓存中获取内存,但感谢您指出这一点,以便我们澄清。当大多数服务器内存存储在缓存中时,Apache 会变慢,这是我的想象吗?这是完全不同的问题吗?
答案1
清除缓存会降低性能,而不是帮助。如果 RAM 需要用于其他用途,那么它就会被其他用途使用,因此,在执行清除操作后,您所做的只是在一段时间内降低缓存命中/未命中率。
如果缓存中的数据非常过时(即它是在异常操作期间缓存的内容),它将根据需要被“较新”的数据替换,而无需您人为清除它。
正常运行的唯一原因sync; echo 3 > /proc/sys/vm/drop_caches
是您要尝试做一些 I/O 性能测试并希望从已知状态开始(在运行之间运行缓存删除以减少由于每次运行时缓存的准备不同而导致的结果差异)。
即使有足够的 RAM 可以从缓存/缓冲区中回收,内核有时也会交换一些页面,如果您发现这对您的服务器来说是一个问题,则调整 swappiness 设置可以阻止这种情况。您可能会从中看到一点好处,但可能会看到暂时的性能下降降低通过人为地清除缓存+缓冲区。