关于Linux操作系统buffer/cache

在使用Linux操作系统过程中,查看内存很常用的命令为free。在命令输出信息中 的buffer/cache你真的懂吗?

free命令


free用于显示当前系统中内存的使用量信息,格式为"free [-h]"。

为了保证Linux系统不会因资源耗尽而突然宕机,运维人员需要时刻关注内存的使用量。在使用free命令时,可以结合使用-h参数以更人性化的方式输出当前内存的实时使用量信息。

执行free -h命令后的输出信息

  内存总量 已用量 可用量 进程共享的内存量 磁盘缓存的内存量 缓存的

内存量

  total used free shared buffers cached
Mem 1.8GB 1.3GB 542MB 9.8MB 1.6MB 413MB
-/+ buffers/cache   869MB 957MB      
Swap 2.0GB 0 2.0GB      
注:  
  第一部分mem行解释:

tatal:内存总数

used:已经使用的内存数

free:空闲的内存数

shared:当前已经废弃不用

buffers Buffer:缓存内存数

cached Page:缓存内存数

关系:total = used + free

第二部分(-/+ buffers/cache)解释:

(-buffers/cache) used内存数:第一部分Mem行中的used-buffers-cached

(+buffers/cache)free内存数:第一部分Mem行中的free+buffers+cached

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

第三部分是指交换分区。

什么是Cache Memory(缓存内存):

当你读写文件的时候,Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。

其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory(缓存内存)的话也是有办法的。

#echo 3 > /proc/sys/vm/drop_caches

调整swap使用比例,默认是60,即是在你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用

cat /proc/sys/vm/swappiness

作为一个普通运维工程师,看到上面的内容基本上代表你已经入门了。但是,今天我们这篇笔记如果写到这里就结束,就太纯粹了。还是要挖一挖的。

上面提到的cache memory其实表达的应该是:buffers/cache部分。

什么是 page cache


Page cache 主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有 read/write 操作的时候。在当前的系统实现里, page cache 也被作为其它文件类型的缓存设备来用,所以事实上 page cache 也负责了大部分的块设备文件的缓存工作。

专业点的回答是主要针对文件inode的读写进行缓存操作用来提高读写效率。

什么是 buffer cache


Buffer cache 则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用 buffer cache 进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,page cache 的内容会被改变,而 buffer cache 则可以用来将 page 标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写writeback时,就不用将整个 page 写回,而只需要写回修改的部分即可。

如果cache占用的内存过多了,影响正常运行程序需要的内存,那么会释放掉一部分cache内存,但是总量会保持一个很高的值,所以,linux总是能最大限度的使用内存,就算加到16G,32G内存,也会随着不断的IO操作,内存的free值会慢慢减少。

如何手动释放缓存


使用free查看一下当前内存使用情况(可略过):

[root@*** ~]# free -m
total used free shared buffers cached
Mem: 512 488 23 0 57 157
-/+ buffers/cache: 273 238 Swap: 1055 0 1055

执行sync同步数据

[root@*** ~]# sync

清理cache

[root@*** ~]#echo 3 > /proc/sys/vm/drop_caches

扩展阅读:drop_cache的详细解释


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 2) into drop_caches.

 

人已赞赏
笔记

Linux下磁盘扩容及常见问题

2020-4-25 22:42:04

笔记

multipath多路径就该这么配置

2020-4-27 20:48:01

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧