Caching 如何保持缓存为二等公民

Caching 如何保持缓存为二等公民,caching,linux-kernel,Caching,Linux Kernel,好的,在对这个问题的评论中: 声称: “应用程序将始终是内存的第一公民,不必与缓存争夺内存。” 嗯,我认为我的缓存是叛逆的,不想接受它的社会阶层。我在这里进行了实验: 步骤1: $ free -m total used free shared buffers cached Mem: 3015 2901 113 0 15 2282 -/+ buffers/cache: 603 2411 Swap: 2406 2406 0 所以缓存使用2282MB,而113MB是免费的 现在: 好吧,Linu

好的,在对这个问题的评论中:

声称:

“应用程序将始终是内存的第一公民,不必与缓存争夺内存。”

嗯,我认为我的缓存是叛逆的,不想接受它的社会阶层。我在这里进行了实验:

步骤1:

$ free -m
total used free shared buffers cached
Mem: 3015 2901 113 0 15 2282
-/+ buffers/cache: 603 2411
Swap: 2406 2406 0
所以缓存使用2282MB,而113MB是免费的

现在:

好吧,Linux慷慨地又给了我156MB,就这样!那么,我如何告诉Linux我的程序比2282MB缓存更重要呢

额外信息:我的/家是加密的

更多人有同样的问题(这使得加密假设不太可信):


我不确定Linux特定的东西,但是一个好的操作系统会记录一个内存页被访问了多少次,以及访问了多长时间。如果最近访问不多,它可以将其调出,并使用RAM进行缓存。
此外,已分配但未使用的内存也可以发送到交换,因为有时程序分配的内存比实际需要的内存多,所以很多内存页都会放在那里填满RAM。

关于内核中的缓存,需要知道的是,它的设计是尽可能高效的。这通常意味着,当没有其他东西需要内存时,放入缓存的东西就留在那里了


这是一个内核,它准备在缓存中的东西再次被请求时幸运一点。如果没有其他人需要内存,那么释放内存没有什么好处。

我发现,如果我通过

#swapoff -a
问题正在消失。如果我有swap,当我请求更多内存时,linux会尝试将缓存移动到swap,然后swap变满,然后linux会停止整个操作,而不是丢弃缓存。这会导致“内存不足”。但是如果没有交换,Linux知道它没有希望,只能首先丢弃缓存

我认为这是linux内核中的一个bug

从添加到问题的一个链接中可以看出:

sysctl-w vm.min_free_kbytes=65536


帮助,对我来说,64毫克仍然很容易陷入麻烦。我正在使用128MG保证金,当贪婪的缓存到达那里时,机器变得非常慢,但不像以前那样不会冻结。我将检查256MG的余量,看看是否会有改进。

但是“我”需要内存,Linux没有给我,因为它已将内存用于缓存。有时候Linux会关闭我的浏览器,显示“内存不足”错误,而2GB被缓存使用,这是一个严重的问题。对不起,我错过了你最初的观点。也就是说,你的问题比报道的更奇怪。free的输出实际上表明您有2411MB的空闲(-/+缓冲区/缓存线)。可能在munch运行时,另一个进程占用了实际可用内存?您可以在munch程序中设置睡眠,使其在内存分配之间睡眠1秒,然后在munch运行时运行“free-m-s1”以监视内存使用情况。您的进程可以分配的内存量也可能受到限制。检查“ulimit-a”的输出,查看shell上的内存限制。如果天气好,我可以分配高达2GB左右的内存。因此,我认为没有限制:例如,这是从现在开始分配的
1519 MB分配的1520 MB分配的1521 MB^C
(我停止了它,否则,OOM killer将生效,关闭我的浏览器,我的评论将丢失)。从我的ulimit-a进一步了解
max memory size(kbytes,-m)unlimited
。我应该在free-m-s1中寻找什么?我有系统监视器小部件,缓存是浅绿色的,用户内存是深绿色的。在好的一天,深绿色上升,浅绿色收缩。在坏的一天,当浅绿色到达顶部时,计算机冻结,然后我的程序被终止。有一种缓存是在几天后积累起来的,不会消失。但问题是,现在我需要ram,linux没有给我,即使ram在技术上可用于程序(缓存应该只使用ram,如果没有其他人需要它)那么,你是真的使用了那个ram,还是仅仅分配了它?如果您使用它,缓存应该会收缩,并且您的程序应该使用所有RAM。您可以检查链接,程序在分配内存后运行这一行:
memset(buffer,0,1024*1024)
,这意味着它使用RAM。然而,缓存仍然坚如磐石,我的程序也会死掉。缓存永远不会“移动到交换”。脏页缓存页被写回它们的备份存储器,干净页缓存页被简单地丢弃。您的
overmit\u内存设置(在
/proc/sys/vm/overmit\u内存中)是什么?有可能大部分空闲内存都被分配给了其他还没有接触到它的进程
/proc/meminfo
也提供了比
免费
更详细的信息。
#swapoff -a