本文主要解释cached
占用内存高的原因,以及如何释放cached
的内存占用。
cached占用内存高
在使用procrank
做内存性能统计的时候,发现当播放USB video,会发现cached
占用的内存越来越高。
1 |
|
通过free -m
查看内存的使用情况,发现剩余的可用内存只有3M。
1 |
|
由于我这里的busybox版本为v1.22.1,没有-/+ buffers/cache
这一列,可以通过下面的路径下载特定版本特定体系结构的二进制文件。
https://busybox.net/downloads/binaries/
上述的情况,通过/proc/meminfo
得到的结果也是一致的:
1 |
|
Linux ate my ram!
Linux ate my ram!这篇文章详细的讲述了cached
占用内存越来越高的情况,在此翻译如下:
(1)、 发生了啥?
Linux会借用不使用的内存用来做磁盘缓存。那样看起来像是memory变得非常的少,但并不是这样的,一切都是ok的。
(2)、 为什么这么做?
磁盘缓存使得系统更快,响应更快。除了会令新手困惑外,没有任何缺点。它不会以任何方式将应用程序从内存中分离出去!
(3)、 如果我要运行更多的应用程序要怎么办?
如果应用程序需要更多的内存,他们只回收磁盘缓存借用的块。磁盘缓存总是可以立即回馈给应用程序。内存并不低。
(4)、 我需要更多的交换分区吗?
不需要,磁盘缓存只会借用应用程序当前不使用的内存。不会使用到交换分区。如果应用程序需要更多的内存,他们只回收磁盘缓存借用的块。不会开始使用交换分区。
(5)、 怎样关闭磁盘缓存?
你不能关闭磁盘缓存。任何人想要禁用磁盘缓存的唯一原因是因为他们认为它将内存从应用程序中移走,而不是这样! 磁盘缓存使应用程序加载速度更快,运行更流畅,但它永远不会将内存从它们移开! 因此,绝对没有理由禁用它!
(6)、 为什么top和free会显示内存都被用了然而事实并不是那样的?
这只是术语上的差异。你和Linux都认为内存被应用程序使用的为used
,不被任何内容使用的为free
。
但是如何统计那些被用于something
,但是又能被应用程序所使用的内存呢?
你也许会将内存用free
和available
用来进行统计。Linux将其统计为used
,但也是available
。
内存的使用 | 你称之为 | Linux称之为 |
---|---|---|
被应用程序使用 | Used | Used |
被使用,但可用 | Free (or Available) | Used (and Available) |
不被任何使用 | Free | Free |
上面的something
大致是top
和free
中显示的buffers
和cached
。正是由于你和Linux的术语不同,你可能会认为你内存越来越少。
(7)、 我应该怎么去查看内存真正剩多少?
为了查看你应用程序不使用交换分区的话还剩多少内存,可用运行free -m
来查看available
这一列的内容。
(在2016年之前安装的,查看-/+ buffers/cache
的free
列来替代)。该命令会以M
的来显示。
如果你只是天真地看待free
和used
,你会认为你的内存是99%,当它只有47%!有关Linux计算为available
的更详细和技术性描述,请参阅the commit that added the field.
(8)、 什么情况下我才担心?
一个健康的的Linux系统,在运行一段时间后,有足够的内存,并且会显示以下预期和无害的行为:
free
的memory接近与0;used
的memory接近于total
;available
的memory(或者free + buffers/cache
)有足够的空间(比方说,20%以上的total
);swap used
没有变化;
可能想要了解的真正低内存情况的警告信号:
available
的memory(或者free + buffers/cache
)接近于0;swap used
增加或波动;dmesg | grep oom-killer
显示OutOfMemory-killer正在工作;
(9)、 我要怎样确认上面所说的?
有关更多详细信息以及如何试用磁盘缓存以显示此处所述的效果,请参阅此页面。 很少有东西让你欣赏磁盘缓存,而不仅仅是在自己的硬件上测量数量级的加速!
验证磁盘缓存是否可回收
在 https://www.linuxatemyram.com/play.html 中,使用多种方法来验证磁盘缓存的作用以及磁盘缓存的回收。
磁盘缓存的某些部分不能丢弃,甚至不能容纳新的应用程序。这包括已被某些应用程序mlocked
的mmap'd
页面,尚未写入存储区的脏页以及存储在tmpfs中的数据(包括/ dev / shm,用于共享内存)。mmap’d,mlocked页面卡在页面缓存中。肮脏的页面大部分将很快写出来。如果可能的话,tmpfs中的数据将被换出。
drop_caches
关于这部分的解释,可以参照<Kernel_Dir>/Documentation/sysctl/vm.txt
文件:
1 | ============================================================== |
清空slab
和page cached
,可以使用如下命令:
1 |
MemAvailable
Linux kernel在这次提交中加入了MemAvailable
的列表。详见:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
根据提交的履历可以看到它的解释如下:
1 | MemAvailable: An estimate of how much memory is available for starting new |
翻译如下:
MemAvailable
:估计有多少内存可用于启动新应用程序,无需交换。 根据MemFree,SReclaimable计算,文件LRU列表的大小以及每个区域中的低水印。 估算考虑到系统需要一些页面缓存才能正常工作,并且并不是所有的可回收板块都可以回收,因为项目正在使用。 这些因素的影响因系统而异。
以这个值作为参照,更能说明当前系统的内存是否够新的应用程序使用。
参考资料
- https://www.linuxatemyram.com/
- https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
- https://www.linuxatemyram.com/play.html
- https://unix.stackexchange.com/questions/87908/how-do-you-empty-the-buffers-and-cache-on-a-linux-system
- http://linuxperf.com/?p=142