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