Linux Cached high memory usage

本文主要解释cached占用内存高的原因,以及如何释放cached的内存占用。


cached占用内存高

在使用procrank做内存性能统计的时候,发现当播放USB video,会发现cached占用的内存越来越高。

1
2
# procrank
RAM: 317308K total, 2952K free, 3796K buffers, 228188K cached, 360K shmem, 6492K slab

通过free -m查看内存的使用情况,发现剩余的可用内存只有3M。

1
2
3
4
5
# free -m                                           
total used free shared buffers
Mem: 309 306 3 0 4
-/+ buffers: 302 7
Swap: 0 0 0

由于我这里的busybox版本为v1.22.1,没有-/+ buffers/cache这一列,可以通过下面的路径下载特定版本特定体系结构的二进制文件。
https://busybox.net/downloads/binaries/

上述的情况,通过/proc/meminfo得到的结果也是一致的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#cat /proc/meminfo
MemTotal: 317308 kB
MemFree: 3576 kB
MemAvailable: 214268 kB
Buffers: 3796 kB
Cached: 228124 kB
SwapCached: 0 kB
Active: 177288 kB
Inactive: 99696 kB
Active(anon): 61104 kB
Inactive(anon): 348 kB
Active(file): 116184 kB
Inactive(file): 99348 kB
Unevictable: 16020 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 28 kB
Writeback: 0 kB
AnonPages: 61092 kB
Mapped: 9468 kB
Shmem: 360 kB
Slab: 6488 kB
SReclaimable: 1564 kB
SUnreclaim: 4924 kB
KernelStack: 2968 kB
PageTables: 2064 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 158652 kB
Committed_AS: 1696048 kB
VmallocTotal: 696320 kB
VmallocUsed: 45128 kB
VmallocChunk: 607228 kB

Linux ate my ram!

Linux ate my ram!这篇文章详细的讲述了cached占用内存越来越高的情况,在此翻译如下:

(1)、 发生了啥?
Linux会借用不使用的内存用来做磁盘缓存。那样看起来像是memory变得非常的少,但并不是这样的,一切都是ok的。

(2)、 为什么这么做?
磁盘缓存使得系统更快,响应更快。除了会令新手困惑外,没有任何缺点。它不会以任何方式将应用程序从内存中分离出去!

(3)、 如果我要运行更多的应用程序要怎么办?
如果应用程序需要更多的内存,他们只回收磁盘缓存借用的块。磁盘缓存总是可以立即回馈给应用程序。内存并不低。

(4)、 我需要更多的交换分区吗?
不需要,磁盘缓存只会借用应用程序当前不使用的内存。不会使用到交换分区。如果应用程序需要更多的内存,他们只回收磁盘缓存借用的块。不会开始使用交换分区。

(5)、 怎样关闭磁盘缓存?
你不能关闭磁盘缓存。任何人想要禁用磁盘缓存的唯一原因是因为他们认为它将内存从应用程序中移走,而不是这样! 磁盘缓存使应用程序加载速度更快,运行更流畅,但它永远不会将内存从它们移开! 因此,绝对没有理由禁用它!

(6)、 为什么top和free会显示内存都被用了然而事实并不是那样的?
这只是术语上的差异。你和Linux都认为内存被应用程序使用的为used,不被任何内容使用的为free
但是如何统计那些被用于something,但是又能被应用程序所使用的内存呢?
你也许会将内存用freeavailable用来进行统计。Linux将其统计为used,但也是available

内存的使用你称之为Linux称之为
被应用程序使用UsedUsed
被使用,但可用Free (or Available)Used (and Available)
不被任何使用FreeFree

上面的something大致是topfree中显示的bufferscached。正是由于你和Linux的术语不同,你可能会认为你内存越来越少。

(7)、 我应该怎么去查看内存真正剩多少?
为了查看你应用程序不使用交换分区的话还剩多少内存,可用运行free -m来查看available这一列的内容。
(在2016年之前安装的,查看-/+ buffers/cachefree列来替代)。该命令会以M的来显示。
如果你只是天真地看待freeused,你会认为你的内存是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 中,使用多种方法来验证磁盘缓存的作用以及磁盘缓存的回收。

磁盘缓存的某些部分不能丢弃,甚至不能容纳新的应用程序。这包括已被某些应用程序mlockedmmap'd页面,尚未写入存储区的脏页以及存储在tmpfs中的数据(包括/ dev / shm,用于共享内存)。mmap’d,mlocked页面卡在页面缓存中。肮脏的页面大部分将很快写出来。如果可能的话,tmpfs中的数据将被换出。


drop_caches

关于这部分的解释,可以参照<Kernel_Dir>/Documentation/sysctl/vm.txt文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
==============================================================

drop_caches

Writing to this will cause the kernel to drop clean caches, as well as
reclaimable slab objects like dentries and inodes. Once dropped, their
memory becomes free.

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free reclaimable slab objects (includes dentries and inodes):
echo 2 > /proc/sys/vm/drop_caches
To free slab objects and pagecache:
echo 3 > /proc/sys/vm/drop_caches

This is a non-destructive operation and will not free any dirty objects.
To increase the number of objects freed by this operation, the user may run
`sync' prior to writing to /proc/sys/vm/drop_caches. This will minimize the
number of dirty objects on the system and create more candidates to be
dropped.

This file is not a means to control the growth of the various kernel caches
(inodes, dentries, pagecache, etc...) These objects are automatically
reclaimed by the kernel when memory is needed elsewhere on the system.

Use of this file can cause performance problems. Since it discards cached
objects, it may cost a significant amount of I/O and CPU to recreate the
dropped objects, especially if they were under heavy use. Because of this,
use outside of a testing or debugging environment is not recommended.

You may see informational messages in your kernel log when this file is
used:

cat (1234): drop_caches: 3

These are informational only. They do not mean that anything is wrong
with your system. To disable them, echo 4 (bit 3) into drop_caches.

清空slabpage cached,可以使用如下命令:

1
# free && sync && echo 3 > /proc/sys/vm/drop_caches && free


MemAvailable

Linux kernel在这次提交中加入了MemAvailable的列表。详见:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773
根据提交的履历可以看到它的解释如下:

1
2
3
4
5
6
7
8
MemAvailable: An estimate of how much memory is available for starting new
applications, without swapping. Calculated from MemFree,
SReclaimable, the size of the file LRU lists, and the low
watermarks in each zone.
The estimate takes into account that the system needs some
page cache to function well, and that not all reclaimable
slab will be reclaimable, due to items being in use. The
impact of those factors will vary from system to system.

翻译如下:

MemAvailable:估计有多少内存可用于启动新应用程序,无需交换。 根据MemFree,SReclaimable计算,文件LRU列表的大小以及每个区域中的低水印。 估算考虑到系统需要一些页面缓存才能正常工作,并且并不是所有的可回收板块都可以回收,因为项目正在使用。 这些因素的影响因系统而异。

以这个值作为参照,更能说明当前系统的内存是否够新的应用程序使用。


参考资料

Title:Linux Cached high memory usage

Author:Victor Huang

Time:2019-03-17 / 16:03

Link:http://wowothink.com/b257434e/

License: Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)