如何清理Linux内核使用的缓存

28

我希望能够在缓存占用太多内存时(可以通过 'free' 命令的输出看到),强制 Linux 内核为应用程序分配更多的内存。

我已经运行了

sudo sync; sudo sysctl -w vm.drop_caches=3; free

(为了释放磁盘dentry/ inode缓存和页面缓存)我发现只有使用的缓存的一半被释放了-剩下的仍然存在。怎样才能知道是什么占用了剩余的缓存并强制将其释放?


留下的缓存只是在需要新内存时立即被丢弃的缓存。强制删除这些缓存区域并没有好处。应用程序始终是内存的第一公民,不必与缓存竞争。 - ypnos
1
我有一个服务器问题,我认为某些东西正在滥用缓存,导致应用程序被降级到交换出的页面并因内存不足而抖动。这可能是内核问题,也可能不是。清除缓存可能是一个好的测试方法。 - Guss
3个回答

18

您可能需要增加vfs_cache_pressure并将swappiness设置为0

这样做将使内核更快地回收缓存,同时在决定哪些内容被页面交换出去时,给予进程平等或更多的优先权。

只有当您关心的进程几乎没有磁盘I/O时,您才会想要这样做。

如果网络I/O受限的进程必须进行页面交换以提供服务请求,则存在问题,真正的解决方案是将其放在竞争力较少的服务器上。

在默认的swappiness设置下,内核几乎总是倾向于在实际内存中保留与文件系统相关的缓存。

因此,如果您增加了缓存压力,请确保同样调整swappiness


谢谢你的回答。虽然不是我所期望的,但我会接受它,因为它包含了我不知道的信息,并提供了一些实现目标的指导方针。我仍然想更好地了解缓存用于什么,特别是当它没有被drop_caches清除时。 - Guss

17

/proc/meminfo 的内容告诉您内核如何使用 RAM。

您可以使用 /proc/sys/vm/vfs_cache_pressure 来强制内核更懒惰或更积极地回收用于文件系统相关缓存的内存。

请注意,如果您的应用程序几乎不进行磁盘 I/O,则调整此参数可能不会对其产生影响。


1
我的应用程序几乎没有进行IO操作 - 大部分数据来自远程数据库。我对/proc/meminfo有点模糊:我看到大约1.9GB的Cached和8MB的SwapCached。如果我没记错的话,这意味着Cached由8MB的交换缓存和1.892GB的其他内容(磁盘缓存和其他什么?)组成。内存映射文件在哪里计算? - Guss
内存映射文件(如果应用程序足够好)应该有自己的建议和压力,最好由应用程序调用posix_madvise()。您可能还想了解一下“swappiness”设置。 - Tim Post
确实是一个好答案,只是不是我的问题的答案 :-)。我理解的是否正确,内存映射文件会计入其应用程序的 RES 内存占用量中? - Guss
根据它们的应用程序,VIRT可能驻留或不驻留,这取决于是否访问并调入了所有页面。 - stsquad

15
您可能会发现我在问题中提到的John Nilsson的答案对于清除缓存以测试是否与您的问题相关很有用:

sync && echo 1 > /proc/sys/vm/drop_caches

虽然我猜想唯一的区别是1和3之间的不同。


只有清除磁盘缓存 - 这与您的问题相关。我还想清除页面缓存,因为我认为我的某个应用程序正在泄漏内存并且运行非常缓慢。 - Guss
2
1 清除页面缓存,2 清除dentries和inodes,3 清除页面缓存、dentries和inodes。 - Schildmeijer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接