如何清理 Linux 内核使用的缓存
Posted
技术标签:
【中文标题】如何清理 Linux 内核使用的缓存【英文标题】:How to clean caches used by the Linux kernel 【发布时间】:2010-10-10 15:02:55 【问题描述】:我想在缓存开始占用过多内存后强制 Linux 内核为应用程序分配更多内存(从 'free' 的输出可以看出)。
我跑了
sudo sync; sudo sysctl -w vm.drop_caches=3; free
(释放磁盘目录/inode 缓存和页面缓存)我看到只有大约一半已使用的缓存被释放 - 其余的仍然存在。如何判断是什么占用了缓存的其余部分并强制释放它?
【问题讨论】:
留下的缓存只是缓存,当需要新内存时会立即丢弃。强制删除这些缓存区域是没有好处的。应用程序将永远是内存的第一公民,不必为它与缓存竞争。 我的服务器有问题,我认为某些东西正在滥用缓存,以至于应用程序被降级为换出页面,并且由于内存不足而崩溃。这可能是内核问题,也可能不是。清除缓存可能是一个很好的测试方法。 【参考方案1】:您可能希望增加vfs_cache_pressure
并将swappiness
设置为0
。
这样做将使内核更快地回收缓存,同时在决定要分页的内容时给予进程同等或更多的支持。
如果您关心的进程很少进行磁盘 I/O,您可能只想要这样做。
如果一个受网络 I/O 限制的进程必须交换来处理请求,这是一个问题,真正的解决方案是将其放在竞争不那么激烈的服务器上。
使用默认的swappiness
设置,内核几乎总是倾向于将与 FS 相关的缓存保留在实际内存中。
因此,如果增加缓存压力,一定要等量调整swappiness
。
【讨论】:
感谢您的回答。虽然这不是我所希望的,但我会接受它,因为它包含我不知道的信息,并提供了一些实现目标的指导方针。我仍然想更好地了解如何弄清楚缓存的用途,尤其是当它没有被 drop_caches 清理时。【参考方案2】:/proc/meminfo 的内容告诉你内核使用 RAM 的目的。
您可以使用 /proc/sys/vm/vfs_cache_pressure 来强制内核更懒惰或急切地回收用于文件系统相关缓存的内存。
请注意,如果您的应用程序很少或没有磁盘 I/O,则调整此参数可能只会使您的应用程序受益。
【讨论】:
我的应用程序执行很少的 IO - 大多数数据来自远程数据库。我对 /proc/meminfo 有点模糊:我看到 Cached:1.9GB,SwapCached:8MB。 IIRC,这意味着 Cached 由 8MB 交换缓存、1.892GB 其他东西(磁盘缓存,还有什么?)组成。内存映射文件在哪里计算? 内存映射文件(如果应用程序很好的话)应该有自己的建议和压力,最好是通过应用程序调用 posix_madvise()。您可能还想了解您的“swappiness”设置。 确实是一个很好的答案,只是不是我的问题的答案:-)。我是否正确理解内存映射文件计入其应用程序的 RES 内存占用? 针对他们的应用程序VIRT,它可能驻留也可能不驻留,具体取决于是否访问和分页所有页面。【参考方案3】:您可能会发现John Nilsson's answer to my Question 可用于清除缓存以测试这是否与您的问题有关:
sync && echo 1 > /proc/sys/vm/drop_caches
虽然我猜唯一真正的区别是 1 对 3
【讨论】:
1 仅清除磁盘缓存 - 它与您的问题有关。我还想清除页面缓存,因为我认为我的一个应用程序正在泄漏内存并严重抖动。 1清除页面缓存,2清除dentries和inode,3清除页面缓存,dentries和inode以上是关于如何清理 Linux 内核使用的缓存的主要内容,如果未能解决你的问题,请参考以下文章