Linux 内存 Buffers、Cache、Swap 及查看命令 free 详解

文章
林里克斯

Linux 内存 Buffers、Cache、Swap 及查看命令 free 详解


试验平台:CentOS Linux release 7.6.1810



一、命令详解


1.free 命令详解

$ free --help

Options:
 -b, --bytes         #以字节为单位显示内存信息(b)
 -k, --kilo          #以千字节为单位显示内存信息(kb)
 -m, --mega          #以兆字节为单位显示内存信息(m)
 -g, --giga          #以千兆字节为单位显示内存信息(g)
     --tera          #以万兆字节为单位显示内存信息(t)
 -h, --human         #以很直观的信息显示内存信息,
     --si            #换算为 1000 而不是 1024
 -l, --lohi          #显示详细的低内存和高内存统计信息
 -t, --total         #附加一行显示 内存 和 Swap虚拟内存 的和
 -s N, --seconds N   #以 N(以秒为单位) 刷新打印一次
 -c N, --count N     #重复打印 N 次后停止刷新,以秒刷新
 -w, --wide          #将 buffer/cache 分开显示,显示比较详细的

     --help          #打印帮助信息
 -V, --version       #删除版本号
  1. 使用 free 命令查看内存信息
$ free -m
              total        used        free      shared  buff/cache   available
Mem:           1839         652         685           1         501        1018
Swap:          1024          16        1008

#total      此实例可用的总内存大小
#used       此实例已使用的内存大小(这里面包含 shared/buffers/cache 部分)
#free       此实例空闲的内存大小
#shared     进程间共享内存
#buffers    内存中写完的数据暂时缓存起来,定期将数据同步至磁盘上
#cache      内存中读完缓存起来的数据,这部分是为了下次查询时快速返回
#Swap       交换分区的信息

有些 openSUSE 低版本系统还会打印一个 -/+ buffers/cache 的信息:

Linux 内存 Buffers、Cache、Swap 及查看命令 free 详解

-/+ buffers/cache看做两部分:

#-buffers/cache:缓冲区是还没有被"写入"磁盘的数据。正在使用的内存大小(注意不是 used 部分,因为 buffers 和 cache 并不是正在使用的,需要它们的时候是可以释放的)
其值 = used - buffers - cached = 1938MB – 497MB – 1235MB = 205MB

#+buffers/cache:缓存是指从磁盘中"读取"并存储以供以后使用的数据。可用的内存大小(同理也不是 free 表示的部分)
其值 = free + buffers + cached = 1982MB + 497MB + 1235MB = 3714MB

二、Buffer/Cache 详解


1.Buffer (缓冲),简单说,Buffer 的核心作用是用来缓冲,缓和冲击。为了提高 内存硬盘(或其他 I/O 设备的数据交换而设计)

打个比方:每秒写 100 次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事。如果此时用个 buffer 暂存起来,变成每 10 秒写一次硬盘,对系统的冲击就很小,写入效率也会提高,极大缓和了冲击。

Buffer 主要是针对写操作设计的,更细的说是针对内存和硬盘之间的写操作来设计的,目的是将写的操作集中起来进行,减少磁盘碎片和硬盘反复寻址过程,提高性能。

2.Cache (缓存),简单来说,Cache 的核心作用是加快取用的速度,暂时缓存起来。为了调高 CPU内存 之间数据交换而设计

打个比方:比如一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。

Cache 主要是针对读操作设计的


三、直观试验 Buffer/Cache


1.生成一个 1G 的文件

# dd if=/dev/zero of=testfirl bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 7.35442 s, 143 MB/s

# du -sh testfirl 
1000M   testfirl

2.清空全部缓存

# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819          88         565           9        1165        1547
Swap:             0           0           0

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

# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819          82        1666           9          70        1612
Swap:             0           0           0

3.读取此文件,查看所消耗时间

# time cat testfirl > /dev/null 
real    0m1.106s
user    0m0.005s
sys     0m1.100s

4.再次读取此文件,并查看 buffer 的大小

# time cat testfirl > /dev/null 
real    0m0.178s
user    0m0.012s
sys     0m0.166s
#可以看到差不多快了整整 1秒 的时间

# free -m
              total        used        free      shared  buff/cache   available
Mem:           1819          83         664           9        1072        1567
Swap:             0           0           0

四、强制回收缓存内存


注意:强制回收前需要先进行 sync 同步数据到硬盘操作,避免强制回收时造成数据丢失;建议只在 cache 占用大量内存时导致系统内存不够用,系统运行缓慢的情况下使用

1,仅清除 pagecahe 缓存页

# sync; echo 1 > /proc/sys/vm/drop_caches

2,清除 dentries 目录项 和 inodes

# sync; echo 2 > /proc/sys/vm/drop_caches

3,三项都清楚,pagecahe 缓存页,dentries 目录项inodes

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

4.清理不生效原因可能是:buffer/cached 使用的内存并不大时,而系统本身确实不足时无法回收

5.手动增加 buffer/cache 测试

$ free -h;find .>/dev/null

6.回收交换分区 Swap

$ swapoff -a && swapon -a

注意:如果已经使用了 Swap,且当前清空下 +buffers/cache 还有空间,在执行 swapoff -a 操作时,会触发把 Swap 中的内容交换到内存中,数据不会丢失


Over~

版权协议须知!

本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意

1629 0 2020-12-16


分享:
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
博主卡片
林里克斯 博主大人
一个致力于Linux的运维平台
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。

现在时间 2024-12-28

今日天气
站点统计
  • 文章总数:241篇
  • 分类总数:29个
  • 评论总数:12条
  • 本站总访问量 353455 次

@奥奥

@Wong arrhenius 牛比

@MakerFace 厉害了!