清除"缓存"没有drop_caches的{proc / meminfo中的内存

时间:2017-01-30 23:09:26

标签: linux caching memory memory-management

我有一个运行2.6.10 linux内核的嵌入式系统(我知道!)我注意到,随着系统长时间保持运行状态,"缓存" RAM的使用 - 如/ proc / meminfo中所示 - 线性增加。有时它达到总RAM的70%,系统崩溃。

  1. 我不知道为什么在低内存条件下内核没有自动重新声明这个空间。我认为"缓存"虽然使用了记忆,但仍然可以很容易地记得"。

  2. 为了至少手动回收这个空间,我必须调整/ proc / sys / vm /中的drop_caches设置。但是,此功能仅在2.6.16内核中引入。

  3. 由于"缓存的大部分内容"是页面缓存,文件和inode缓存,有没有什么方法可以在没有drop_caches功能的情况下正式回收它们?我已经尝试了sync,但这根本没有帮助。

    我已经搜索了很多相关内容,但无法找到任何不依赖于drop_caches功能的资源。

    编辑:

    根据a few other threads的建议,我每隔一秒就运行一次写入板载闪存分区的测试,我看到dentrysize-64字段都在{{1} (以每个循环的bash脚本的速率为1)。但是,我没有注意到/proc/slabinfo内存使用量的任何增加。

    更多信息:

    我必须提到根目录本身是在ramfs中。我有一个我们读/写的闪存芯片,但是太频繁了。我在坠机前的某个时候粘贴了meminfo和slabinfo。请注意活动和缓存字段的添加量是否大于总可用内存!

    Cached

1 个答案:

答案 0 :(得分:3)

我认为你在某处填充了tmpfs / ramfs。由于tmpfs / ramfs的工作方式,tmpfs上的文件使用的空间被Linux内核计为“缓存”。 tmpfs / ramfs上的文件实际上只是一个非支持的缓存条目。

# echo 1 > /proc/sys/vm/drop_caches
# grep '^Cached' /proc/meminfo
Cached:          1341824 kB
# dd if=/dev/zero of=/tmp/testfile bs=1G count=4
4+0 records in
4+0 records out
4294967296 bytes (4.3 GB) copied, 1.33696 s, 3.2 GB/s
# grep '^Cached' /proc/meminfo
Cached:          5543480 kB
# echo 1 > /proc/sys/vm/drop_caches
# grep '^Cached' /proc/meminfo
Cached:          5494072 kB
# rm /tmp/testfile
# grep '^Cached' /proc/meminfo
Cached:          1306488 kB

这是Linux无法自动回收的“缓存”内存,因为它没有任何真正的持久存储支持。正如您在示例中看到的那样,即使drop_caches也无法帮助您。

所以在/proc/mounts中查看已挂载的任何tmpfs / ramf,并监视其中哪些正在填满。