对这个问题发表评论确定:
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
和
答案 0 :(得分:1)
在内核中了解缓存的一点是它的设计尽可能高效。这通常意味着当没有其他东西要求记忆时,放入缓存的东西就会留在那里。
这是准备好运的内核,以防再次询问缓存中的内容。如果没有其他人需要记忆,那么释放它就没什么好处。
答案 1 :(得分:0)
我不确定Linux特定的东西,但是一个好的操作系统会跟踪内存页面被访问的次数,以及多久以前。如果最近没有访问它,它可以将其交换出来,并使用RAM进行缓存。 此外,分配但未使用的内存也可以发送到交换,因为有时程序分配的内容比实际需要的多,所以很多内存页只会坐在那里填充你的内存。
答案 2 :(得分:0)
我发现我是否通过
关闭交换#swapoff -a
问题正在消失。如果我有交换,当我要求更多的内存,然后linux尝试将缓存移动到交换,然后交换完全,然后Linux停止整个操作而不是删除缓存。这导致“内存不足”。但是没有交换Linux知道它没有希望,但首先放弃了缓存。
我认为这是linux内核中的一个错误。
从添加到问题的链接之一建议:
sysctl -w vm.min_free_kbytes = 65536
有帮助,对于64MG的我来说,我很容易陷入困境。我正在使用128MG的边距,当贪婪的缓存到达那里时,机器变得非常慢但不同之前它不会冻结。我将检查256MG保证金,看看是否会有改善。