【问题标题】:How to keep cache a second class citizen如何保持缓存二等公民
【发布时间】:2011-12-25 22:28:09
【问题描述】:

可以评论这个问题:

How to clean caches used by the Linux kernel

ypnos 声称:

“应用程序将永远是内存的第一公民,不必为它与缓存竞争。”

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

http://www.linuxatemyram.com/play.html

第 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 是空闲的。

现在:

$ ./munch
Allocated 1 MB
Allocated 2 MB
Allocated 3 MB
Allocated 4 MB
.
.
.
Allocated 265 MB
Allocated 266 MB
Allocated 267 MB
Allocated 268 MB
Allocated 269 MB
Killed

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

额外信息:我的 /home 已加密。

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

https://serverfault.com/questions/171164/can-you-set-a-minimum-linux-disk-buffer-size

https://askubuntu.com/questions/41778/computer-freezing-on-almost-full-ram-possibly-disk-cache-problem

【问题讨论】:

  • 您的overcommit_memory 设置是什么(在/proc/sys/vm/overcommit_memory 中)?有可能大部分空闲内存被提交给尚未触及它的其他进程。 /proc/meminfo 也提供了比 free 更详细的信息。

标签: caching linux-kernel


【解决方案1】:

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

这是内核准备幸运,以防再次请求缓存中的内容。如果没有其他人需要内存,那么释放它几乎没有什么好处。

【讨论】:

  • 但是“我”需要内存,Linux 没有给我,因为它已经用于缓存。有时Linux关闭我的浏览器,显示“内存不足”错误,而2GB被缓存使用,这是一个严重的问题。
  • 对不起,我错过了你的原点。也就是说,您的问题比报告的更奇怪。 free 的输出实际上显示您有 2411MB 可用空间(-/+ 缓冲区/缓存行)。也许当 munch 运行时,实际的可用内存被另一个进程消耗了?你可以在你的 munch 程序中设置一个 sleep 以在内存分配之间休眠 1 秒,然后在 munch 运行时运行“free -m -s 1”来监控内存使用情况。
  • 您的进程可以分配的内存量也可能受到限制。检查“ulimit -a”的输出,了解你的 shell 上的任何内存限制。
  • 在美好的一天,我可以分配多达 2GB 左右的空间。所以我认为没有限制:例如这是从现在开始Allocated 1519 MB Allocated 1520 MB Allocated 1521 MB ^C (否则我停止了它,OOM 杀手将生效,关闭我的浏览器,我的评论将丢失)。来自我的 ulimit -a 的更多 max memory size (kbytes, -m) unlimited
  • 我应该在 free -m -s 1 中寻找什么?我有系统监视器小部件,缓存为浅绿色,用户内存为深绿色。在好的日子里,深绿色上升,浅绿色在不好的日子里收缩,当浅绿色到达顶部时,计算机死机,然后我的程序被杀死。几天后积累的缓存不会消失。
【解决方案2】:

我不确定 Linux 特定的东西,但一个好的操作系统会跟踪内存页面被访问了多少次,以及多久之前。如果它最近没有被访问太多,它可以将其换出,并使用 RAM 进行缓存。 此外,已分配但未使用的内存也可以发送到交换空间,因为有时程序分配的内存超出了实际需要,所以很多内存页面会坐在那里填满你的 RAM。

【讨论】:

  • 但问题是现在我需要 ram 而 linux 并没有给我它,即使 ram 在技术上可用于程序(如果没有其他人需要,缓存应该只使用 ram)
  • 嗯,你真的使用了那个内存,还是只是分配了它?如果你使用它,缓存应该会缩小,你的程序应该使用所有的 RAM。
  • 你可以查看链接,程序在分配内存后运行这一行:memset(buffer, 0, 1024*1024),这意味着它使用了内存。然而缓存在那里坚如磐石,我的程序死了。
【解决方案3】:

我发现如果我关闭了交换

#swapoff -a

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

我认为这是 linux 内核中的一个错误。

从添加到问题的链接之一表明:

sysctl -w vm.min_free_kbytes=65536

有帮助,对于 64MG 的我来说,我仍然很容易陷入困境。我正在使用 128MG 边距,当贪婪的缓存到达那里时,机器变得非常慢,但不像以前它不会冻结。我会检查256MG的保证金,看看是否会有改善。

【讨论】:

  • 缓存永远不会“移动到交换”。脏页缓存页被写回它们的后备存储,干净的页缓存页被简单地丢弃。
猜你喜欢
  • 1970-01-01
  • 2011-07-07
  • 2018-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多