删除linux缓存的ram

Pat*_*k R 17 linux memory web-server cache swapping

我有一个具有 8GB 内存的网络服务器,并且正在运行一个非常密集的 php 站点(1 个站点),该站点可以进行文件操作、绘图、电子邮件、论坛,等等。环境远非静态,这让我相信在 ram 中缓存任何东西几乎没有什么好处,因为几乎每个对服务器的请求都会创建新的或更新的页面。很多缓存是在客户端完成的,所以当涉及到图像、javascript、css 时,我们有大量的 304 请求。

此外,我确实有语言文件被写入服务器上的平面文件,其中缓存的 ram 绝对是好的,而不是从磁盘读取。但是这样的文件屈指可数。

在大约两周内,我从拥有 98% 的空闲内存变成了 4% 的空闲内存。这发生在我们还将几个大型 svn 更新推送到服务器的时候。

我的问题是,如果我使用以下命令定期清除缓存(我知道 Linus Torvalds 对缓存的感觉),我的服务器是否会得到更好的调整:

sync; echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

或者我最好编辑以下文件:

/proc/sys/vm/swappiness  
Run Code Online (Sandbox Code Playgroud)

如果我用 30 替换默认值 60,我应该有更少的交换和更多的陈旧缓存重用。

看到使用第一个命令释放所有缓存确实感觉很好,但如果我告诉你这对桌面环境有好处,那我就是在骗你。但是像我上面描述的那样的网络服务器呢?想法?

编辑:我知道系统将根据需要从缓存中获取内存,但感谢您指出我们的清晰。当大部分服务器内存存储在缓存中时 Apache 会变慢,我是否在想象事情?那是完全不同的问题吗?

Dav*_*ett 16

清除缓存会影响性能,而不是帮助。如果 RAM 需要用于其他用途,则它会被其他用途使用,因此您所做的就是在执行清除后暂时降低缓存命中/未命中率。

如果缓存中的数据非常过时(即它是在异常操作期间缓存的内容),它将根据需要替换为“较新”的数据,而无需您人为地清除它。

sync; echo 3 > /proc/sys/vm/drop_caches正常运行的唯一原因是如果您要尝试进行一些 I/O 性能测试并希望从一个已知状态开始(在运行之间运行缓存删除以减少由于缓存在每个上的准备不同而导致的结果差异)跑)。

内核有时会交换几页,即使有足够的 RAM 可以从缓存/缓冲区中收回,如果您发现它是服务器的问题,则调整 swappiness 设置可以阻止这种情况。您可能会从中看到一点好处,但可能会因人为清除缓存 + 缓冲区而导致暂时的性能下降

  • 不仅仅是文件,还有缓存的元数据等等。曾经在一个巨大的目录上执行 'ls' 并让它花很长时间,然后再做一次,它是即时的吗?它使用缓存存储在内存中。我们都知道 Linux VM 系统很复杂。为什么不让它处理呢?您的应用程序将运行到交换的唯一时间是,如果它们立即请求 > 实际可用内存,然后直到缓存被释放 (5认同)
  • PatrickR:清除缓存会适得其反。您正在增加原本会存储在缓存中的任何内容的加载时间。 (2认同)