centos6 free 和 centos 7的free 的差异与对比 使用Free命令查看Linux服务器内存使用状况(-/+ buffers/cache详解) linux下free命令详解 centos6 free 和 centos 7的free 的差异与对比

以下内容大多数是转载

在centos6中:

查看内存是这样的:

[root@ ~]# free -h  #人性化输出显示
             total       used       free     shared    buffers     cached
Mem:          996M       521M       474M        56K        35M       118M
-/+ buffers/cache:       368M       628M
Swap:         1.5G       234M       1.2G

total=used+free

centos6中的used=程序实际吃掉的内存+buffers/cache

程序实际吃掉的内存=used-buffers-cached

buffer和cache是为了提高速率而设计的,当我们内存吃紧的时候,我们可以把他们回收,所以就又产生了一个可用内存(available)的概念,available=free+cached+buffers

但是在cento7.2以后,available 代表的是一个新的应用程序可以使用内存的估计值,它不等于 free + buff/cache ,,因为在centos 7.2与Ubuntu 16.04以上(包含)的系统使用了新的Linux内核,所以并不是所有的buffer/cache空间都可以被回收。

关于centos6,参考https://www.cnblogs.com/diaosir/p/6912766.html

关于centos7 ,参考https://www.cnblogs.com/operationhome/p/10362776.htmlhttps://www.cnblogs.com/ultranms/p/9254160.html

以下为转载

centos6

https://www.cnblogs.com/diaosir/p/6912766.html

使用Free命令查看Linux服务器内存使用状况(-/+ buffers/cache详解)

 

free命令可选参数


  • -b,-k,-m,-g show output in bytes, KB, MB, or GB
  • -h human readable output (automatic unit scaling)
  • -l show detailed low and high memory statistics
  • -o use old format (no -/+buffers/cache line)
  • -t display total for RAM + swap
  • -s update every [delay] seconds
  • -c update [count] times
  • -a show available memory if exported by kernel (>80 characters per line)
  • -V display version information and exit

常用参数演示


复制代码
[root@ ~]# free -b   #以Byte为单位显示
             total       used       free     shared    buffers     cached
Mem:    1044611072  552603648  492007424      57344   39006208  124108800
-/+ buffers/cache:  389488640  655122432
Swap:   1572855808  245936128 1326919680
[root@ ~]# free -k   #以KB为单位显示
             total       used       free     shared    buffers     cached
Mem:       1020128     536520     483608         56      38108     121200
-/+ buffers/cache:     377212     642916
Swap:      1535992     240172    1295820
[root@ ~]# free -m   #以MB为单位显示
             total       used       free     shared    buffers     cached
Mem:           996        523        472          0         37        118
-/+ buffers/cache:        368        627
Swap:         1499        234       1265

[root@ ~]# free -h  #人性化输出显示
             total       used       free     shared    buffers     cached
Mem:          996M       521M       474M        56K        35M       118M
-/+ buffers/cache:       368M       628M
Swap:         1.5G       234M       1.2G


[root@ ~]# free -o  #不显示-/+buffers/cache line,不建议
             total       used       free     shared    buffers     cached
Mem:       1020128     536892     483236         56      38468     121284
Swap:      1535992     240172    1295820


[root@ ~]# free -th  #算上swap
             total       used       free     shared    buffers     cached
Mem:          996M       524M       471M        56K        37M       118M
-/+ buffers/cache:       368M       627M
Swap:         1.5G       234M       1.2G
Total:        2.4G       758M       1.7G


[root@ ~]# time free -s 1 -c 3   #表示持续每隔1s更新更新一次mem信息,更新3次
             total       used       free     shared    buffers     cached
Mem:       1020128     537512     482616         56      38868     121328
-/+ buffers/cache:     377316     642812
Swap:      1535992     240172    1295820

             total       used       free     shared    buffers     cached
Mem:       1020128     537512     482616         56      38868     121328
-/+ buffers/cache:     377316     642812
Swap:      1535992     240172    1295820

             total       used       free     shared    buffers     cached
Mem:       1020128     537512     482616         56      38868     121328
-/+ buffers/cache:     377316     642812
Swap:      1535992     240172    1295820


real    0m2.002s
user    0m0.000s
sys    0m0.001s
[root@ ~]#

复制代码

free 命令输出结果信息说明


                     total       used       free     shared    buffers     cached
Mem:                996M       525M       470M        56K        38M       118M
-/+ buffers/cache:            368M        627M
Swap:               1.5G       234M       1.2G

第一行


  • total: 内存总数
  • used: 已经使用内存数
  • free: 完全空闲内存
  • shared: 多个进程共享的内存
  • buffers: 用于块设备数据缓冲,记录文件系统metadata(目录,权限,属性等)
  • cached: 用于文件内容的缓冲

第一列


  • Mem: 物理内存
  • -/+ buffers/cache: 基于应用角度考虑(计算已使用内存时减去buffers/cache,计算可使用内存时加上buffers/cache)的内存情况,也可理解为真实的内存使用情况.
  • Swap: 交换分区

当我们获取系统内存用量的时候我们应该以“-/+ buffers/cached”行的used和free作为参考.因为第一行的buffers和cached被系统作为了缓存(这里包括缓冲了metadata数据和曾经打开过的内容,是为了加快我们系统处理的速度),而这部分缓存可以根据我们的应用内存使用情况随时释放掉(也可以手动释放).

这里的话我系统可用内存实际为:可用627M,已使用368M,而不是525M和470M.

buffers/cahed手动释放测试


释放前

复制代码
[root@ ~]# free -h
                       total       used       free         shared    buffers     cached
Mem:                  996M       531M       465M        56K        42M       119M
-/+ buffers/cache:               369M       626M
Swap:                  1.5G       234M       1.2G
[root@ ~]# 
复制代码

使用命令手动释放

复制代码
[root@ ~]# echo 3 > /proc/sys/vm/drop_caches
[root@ ~]# free -h
                     total       used       free     shared    buffers     cached
Mem:                996M       391M       604M        56K       420K        26M
-/+ buffers/cache:             364M       631M
Swap:               1.5G       234M       1.2G
[root@ ~]# 
复制代码

手动释放后我们看到 第一行Mem的used和free有了很大的提升,我们上述的观点得到了验证

使用find 命令让buffers增加

复制代码
[root@ backup]# free -h;find .>/dev/null;free -h
             total       used       free     shared    buffers     cached
Mem:          996M       397M       598M        56K       2.6M        32M
-/+ buffers/cache:       362M       633M
Swap:         1.5G       234M       1.2G
total used free shared buffers cached Mem: 996M 415M 581M 56K 17M 32M -/+ buffers/cache: 364M 631M Swap: 1.5G 234M 1.2G [root@ backup]#
复制代码

使用cat 命令让cached增加

复制代码
[root@zwj python]# free -h;find /mydata/backup/python/ -type f|xargs cat>/dev/null 2>&1;free -h
             total       used       free     shared    buffers     cached
Mem:          996M       434M       561M        56K        18M        50M
-/+ buffers/cache:       365M       630M
Swap:         1.5G       234M       1.2G
             total       used       free     shared    buffers     cached
Mem:          996M       767M       228M        56K        20M       367M
-/+ buffers/cache:       379M       617M
Swap:         1.5G       234M       1.2G
复制代码

centos7

https://www.cnblogs.com/ultranms/p/9254160.html

free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。

如果加上 -h 选项,输出的结果会友好很多:

有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:

$ free -h -s 3

上面的命令每隔 3 秒输出一次内存的使用情况,直到你按下 ctrl + c。

由于 free 命令本身比较简单,所以本文的重点会放在如何通过 free 命令了解系统当前的内存使用状况。

输出简介

下面先解释一下输出的内容:
Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。

我想只有在理解了一些基本概念之后,上面的输出才能帮助我们了解系统的内存状况。

buff/cache

先来提一个问题: buffer 和 cache 应该是两种类型的内存,但是 free 命令为什么会把它们放在一起呢?要回答这个问题需要我们做些准备工作。让我们先来搞清楚 buffer 与 cache 的含义。

buffer 在操作系统中指 buffer cache, 中文一般翻译为 "缓冲区"。要理解缓冲区,必须明确另外两个概念:"扇区" 和 "块"。扇区是设备的最小寻址单元,也叫 "硬扇区" 或 "设备块"。块是操作系统中文件系统的最小寻址单元,也叫 "文件块" 或 "I/O 块"。每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示(下图来自互联网):

注意,buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。

cache 在操作系统中指 page cache,中文一般翻译为 "页高速缓存"。页高速缓存是内核实现的磁盘缓存。它主要用来减少对磁盘的 I/O 操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页高速缓存缓存的是内存页面。缓存中的页来自对普通文件、块设备文件(这个指的就是 buffer cache 呀)和内存映射文件的读写
页高速缓存对普通文件的缓存我们可以这样理解:当内核要读一个文件(比如 /etc/hosts)时,它会先检查这个文件的数据是不是已经在页高速缓存中了。如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件(比如 /etc/hosts)。
页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cahce。因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。

到这里我们应该搞清楚了:无论是缓冲区还是页高速缓存,它们的实现方式都是一样的。缓冲区只不过是一种概念上比较特殊的页高速缓存罢了。
那么为什么 free 命令不直接称为 cache 而非要写成 buff/cache? 这是因为缓冲区和页高速缓存的实现并非天生就是统一的。在 linux 内核 2.4 中才将它们统一。更早的内核中有两个独立的磁盘缓存:页高速缓存和缓冲区高速缓存。前者缓存页面,后者缓存缓冲区。当你知道了这些故事之后,输出中列的名称可能已经不再重要了。

free 与 available

在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available  = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。

交换空间(swap space)

swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件。所以具体的实现可以是 swap 分区也可以是 swap 文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。

现在的机器一般都不太缺内存,如果系统默认还是使用了 swap 是不是会拖累系统的性能?理论上是的,但实际上可能性并不是很大。并且内核提供了一个叫做 swappiness 的参数,用于配置需要将内存中不常用的数据移到 swap 中去的紧迫程度。这个参数的取值范围是 0~100,0 告诉内核尽可能的不要将内存数据移到 swap 中,也即只有在迫不得已的情况下才这么做,而 100 告诉内核只要有可能,尽量的将内存中不常访问的数据移到 swap 中。在 ubuntu 系统中,swappiness 的默认值是 60。如果我们觉着内存充足,可以在 /etc/sysctl.conf 文件中设置 swappiness:

vm.swappiness=10

如果系统的内存不足,则需要根据物理内存的大小来设置交换空间的大小。具体的策略网上有很丰富的资料,这里笔者不再赘述。

/proc/meminfo 文件

其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:

$ cat /proc/meminfo

有兴趣的同学可以直接查看这个文件。

转载https://www.cnblogs.com/operationhome/p/10362776.html

centos6 free 和 centos 7的free 的差异与对比

 

  在实际的工作中,我们经常会用到free这个命令,但是我们对这个命令的实际含义又知道多少,它在centos6 和centos 7 的显示又有什么差异?让我们一起瞧一瞧,看一看。

一 centos6 free

  free 命令默认是使用 kb 作为单位的,free -m 则是以Mb作为单位的,free -g 是以gb作为单位的,gb-->mb-->kb 采用的是1024度量单位(而非1000)

常用参数和含义

-b  指定单位为bytes
-m  指定单位为mb
-k  指定单位为kb
-g  指定单位为gb
-o 显示老版本的输出格式也就是不显示-/+ buffers/cache 这行 -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计

centos6 free 命令示例

[djx@xiaoxiao ~]$ cat /etc/redhat-release
CentOS release 6.5 (Final)
[djx@xiaoxiao ~]$ free 
             total       used       free     shared    buffers     cached
Mem: 8061376 7730380 330996 0 178608 4884772 -/+ buffers/cache: 2667000 5394376 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -m total used free shared buffers cached Mem: 7872 7519 352 0 174 4737 -/+ buffers/cache: 2607 5264 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -g total used free shared buffers cached Mem: 7 7 0 0 0 4 -/+ buffers/cache: 2 5 Swap: 0 0 0

free 值讲解

  我们这里以free 的值来进行讲解(显得精确些)

[djx@xiaoxiao ~]$ free 
             total                used           free               shared    buffers            cached
Mem:       8061376(total)    7730380(used1)     330996(free1) 0 178608(buffers1) 4884772(cached1) -/+ buffers/cache: 2667000(used2) 5394376(free2) Swap: 0 0 0

Mem
  total代表总的内存大小, used 代表程序已经使用的内存大小,free代表的是空闲的内存大小, shared 代表的是共享内存,buffers 代表的是 buffers cache, cached 代表的是 Page cache.

-/+ buffers/cache

  used 代表的除去buffers和cached实际程序占用的内存, free代表的是 total - 第二行used, 也就是 第一行free + 第一行buffers + 第一行cached

Swap

  这行代表的是交换分区(虚拟内存)。

计算公式

total=used1 + free1 ,总的内存大小= 使用的(used1)+ 空闲的(free1)
used1 = used2(第二行的2667000) + buffers1(178608)  + cached1(4884772) used2 = total - free2 free2 = free1 + buffers1(178608) + cached1(4884772)

二 centos7 free

  centos7 的free 命令多了一个 -h 参数,它会自动根据内存的大小,自动转换成合适的单位,默认的计算倍数是 1024 。free 的显示信息来自于/proc/meminfo

常用的参数

-h   以人性化显示
--si 指定计算倍数为1000.
-b  指定单位为bytes
-m  指定单位为mb
-k 指定单位为kb -g 指定单位为gb -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计 -w 将buff和cacher 分开显示,默认是在一起显示的。

centos7 free 命令示例

[root@localhost ~]# cat  /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        197M        1.3G        9.4M        272M        1.4G
Swap:          2.0G          0B        2.0G

[root@localhost ~]# free -wh total used free shared buffers cache available Mem: 1.8G 197M 1.3G 9.4M 2.1M 270M 1.4G Swap: 2.0G 0B 2.0G 

以 free -h 的值为例,

Mem :

total 代表的总的内存 (对应/proc/meminfo 里的MemTotal)
used 代表的是 已经使用的内存
free 是代表空闲的内存(对应/proc/meminfo 里的MemFree) 
shared 代表的是共享的内存(对应/proc/meminfo 里的Shmem)
buff/cache 代表的是 buff(对应/proc/meminfo里的Buffers)和cache的内存(对应/proc/meminfo 里的Cached and Slab), 
available 代表的是 活跃的内存
(官方文档对于available这样写到:Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free) ) available 代表的是一个新的应用程序可以使用内存的估计值,它不等于 free + buff/cache ,,因为在centos 7.2与Ubuntu 16.04以上(包含)的系统使用了新的Linux内核,所以并不是所有的buffer/cache空间都可以被回收。 内核commit链接 :https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?spm=a2c4g.11186623.2.9.5e3113ceBi7J5X&id=34e431b0ae398fc54ea69ff85ec700722c9da773

计算公式

used  =  total - free - buffers - cache
buff/cache = buffers + cache

三 buffers 和cache 的 介绍

buffers

  buffers 指的是 Memory used by kernel buffers(磁盘等块设备的缓冲) ,buffers 的字面意思就是缓冲,缓冲存在的目的是为了解决从速度快的地方往速度慢的地方输出东西,缓冲经常用于像 内存写入数据到磁盘,寄存器数据写到内存等等。位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。

cached

  cached 指的是 Memory used by the page cache and slabs(文件系统层级的缓存),cache 的字面意思是缓存,缓存存在的目的是为了解决从速度慢的地方获取数据,比如我们读取硬盘里面的文件,硬盘的传输速度是比内存慢很多的,当我们读取完一个文件后,然后重新打开这个文件,如果有缓存,也就是将上次读取文件后将文件缓存在内存里面,我们会发现,我们打开文件会比第一次打开快很多。

针对于两者直接的关系,我在网上看到一张图,可以很清晰的说明
image

为什么要清除 buffers 和caches

  因为caches是缓存的一些数据,当我们实际的数据内容已经更新了的话,那么当我们需要获取最新的数据时候,我们就需要清除caches里面的内容。
或者当我们的内存的不足(将被耗尽)时,那么系统会自动清除buffers 和caches ,以满足程序对内存的需求。

如何清除 buffers 和caches

下图来自网络
image
注意

在清除buffers 前,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。
方式一 :
表示清除 pagecache 。

echo 1 > /proc/sys/vm/drop_caches

表示清除回收 slab
分配器中的对象(包括目录项缓存和 inode 缓存)。 slab 分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的 pagecache 。

echo 2 > /proc/sys/vm/drop_caches

表示清除 pagecache 和 slab 分配器中的缓存对象。

echo 3 > /proc/sys/vm/drop_caches

重启后会失效

方式二: sysctl 命令更改

sysctl  -w   vm.drop_caches=1

重启后会失效

方式三:
编辑配置文件 sysctl.conf

echo "vm.drop_caches = 1" >>  /etc/sysctl.conf
sysctl -p  /etc/sysctl.conf

重启后不失效。

最后附上一张cache和buffer的对比,

free命令可选参数


  • -b,-k,-m,-g show output in bytes, KB, MB, or GB
  • -h human readable output (automatic unit scaling)
  • -l show detailed low and high memory statistics
  • -o use old format (no -/+buffers/cache line)
  • -t display total for RAM + swap
  • -s update every [delay] seconds
  • -c update [count] times
  • -a show available memory if exported by kernel (>80 characters per line)
  • -V display version information and exit

常用参数演示


复制代码
[root@ ~]# free -b   #以Byte为单位显示
             total       used       free     shared    buffers     cached
Mem:    1044611072  552603648  492007424      57344   39006208  124108800
-/+ buffers/cache:  389488640  655122432
Swap:   1572855808  245936128 1326919680
[root@ ~]# free -k   #以KB为单位显示
             total       used       free     shared    buffers     cached
Mem:       1020128     536520     483608         56      38108     121200
-/+ buffers/cache:     377212     642916
Swap:      1535992     240172    1295820
[root@ ~]# free -m   #以MB为单位显示
             total       used       free     shared    buffers     cached
Mem:           996        523        472          0         37        118
-/+ buffers/cache:        368        627
Swap:         1499        234       1265

[root@ ~]# free -h  #人性化输出显示
             total       used       free     shared    buffers     cached
Mem:          996M       521M       474M        56K        35M       118M
-/+ buffers/cache:       368M       628M
Swap:         1.5G       234M       1.2G


[root@ ~]# free -o  #不显示-/+buffers/cache line,不建议
             total       used       free     shared    buffers     cached
Mem:       1020128     536892     483236         56      38468     121284
Swap:      1535992     240172    1295820


[root@ ~]# free -th  #算上swap
             total       used       free     shared    buffers     cached
Mem:          996M       524M       471M        56K        37M       118M
-/+ buffers/cache:       368M       627M
Swap:         1.5G       234M       1.2G
Total:        2.4G       758M       1.7G


[root@ ~]# time free -s 1 -c 3   #表示持续每隔1s更新更新一次mem信息,更新3次
             total       used       free     shared    buffers     cached
Mem:       1020128     537512     482616         56      38868     121328
-/+ buffers/cache:     377316     642812
Swap:      1535992     240172    1295820

             total       used       free     shared    buffers     cached
Mem:       1020128     537512     482616         56      38868     121328
-/+ buffers/cache:     377316     642812
Swap:      1535992     240172    1295820

             total       used       free     shared    buffers     cached
Mem:       1020128     537512     482616         56      38868     121328
-/+ buffers/cache:     377316     642812
Swap:      1535992     240172    1295820


real    0m2.002s
user    0m0.000s
sys    0m0.001s
[root@ ~]#

复制代码

free 命令输出结果信息说明


                     total       used       free     shared    buffers     cached
Mem:                996M       525M       470M        56K        38M       118M
-/+ buffers/cache:            368M        627M
Swap:               1.5G       234M       1.2G

第一行


  • total: 内存总数
  • used: 已经使用内存数
  • free: 完全空闲内存
  • shared: 多个进程共享的内存
  • buffers: 用于块设备数据缓冲,记录文件系统metadata(目录,权限,属性等)
  • cached: 用于文件内容的缓冲

第一列


  • Mem: 物理内存
  • -/+ buffers/cache: 基于应用角度考虑(计算已使用内存时减去buffers/cache,计算可使用内存时加上buffers/cache)的内存情况,也可理解为真实的内存使用情况.
  • Swap: 交换分区

当我们获取系统内存用量的时候我们应该以“-/+ buffers/cached”行的used和free作为参考.因为第一行的buffers和cached被系统作为了缓存(这里包括缓冲了metadata数据和曾经打开过的内容,是为了加快我们系统处理的速度),而这部分缓存可以根据我们的应用内存使用情况随时释放掉(也可以手动释放).

这里的话我系统可用内存实际为:可用627M,已使用368M,而不是525M和470M.

buffers/cahed手动释放测试


释放前

复制代码
[root@ ~]# free -h
                       total       used       free         shared    buffers     cached
Mem:                  996M       531M       465M        56K        42M       119M
-/+ buffers/cache:               369M       626M
Swap:                  1.5G       234M       1.2G
[root@ ~]# 
复制代码

使用命令手动释放

复制代码
[root@ ~]# echo 3 > /proc/sys/vm/drop_caches
[root@ ~]# free -h
                     total       used       free     shared    buffers     cached
Mem:                996M       391M       604M        56K       420K        26M
-/+ buffers/cache:             364M       631M
Swap:               1.5G       234M       1.2G
[root@ ~]# 
复制代码

手动释放后我们看到 第一行Mem的used和free有了很大的提升,我们上述的观点得到了验证

使用find 命令让buffers增加

复制代码
[root@ backup]# free -h;find .>/dev/null;free -h
             total       used       free     shared    buffers     cached
Mem:          996M       397M       598M        56K       2.6M        32M
-/+ buffers/cache:       362M       633M
Swap:         1.5G       234M       1.2G
total used free shared buffers cached Mem: 996M 415M 581M 56K 17M 32M -/+ buffers/cache: 364M 631M Swap: 1.5G 234M 1.2G [root@ backup]#
复制代码

使用cat 命令让cached增加

复制代码
[root@zwj python]# free -h;find /mydata/backup/python/ -type f|xargs cat>/dev/null 2>&1;free -h
             total       used       free     shared    buffers     cached
Mem:          996M       434M       561M        56K        18M        50M
-/+ buffers/cache:       365M       630M
Swap:         1.5G       234M       1.2G
             total       used       free     shared    buffers     cached
Mem:          996M       767M       228M        56K        20M       367M
-/+ buffers/cache:       379M       617M
Swap:         1.5G       234M       1.2G
复制代码

free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。

如果加上 -h 选项,输出的结果会友好很多:

有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:

$ free -h -s 3

上面的命令每隔 3 秒输出一次内存的使用情况,直到你按下 ctrl + c。

由于 free 命令本身比较简单,所以本文的重点会放在如何通过 free 命令了解系统当前的内存使用状况。

输出简介

下面先解释一下输出的内容:
Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。

我想只有在理解了一些基本概念之后,上面的输出才能帮助我们了解系统的内存状况。

buff/cache

先来提一个问题: buffer 和 cache 应该是两种类型的内存,但是 free 命令为什么会把它们放在一起呢?要回答这个问题需要我们做些准备工作。让我们先来搞清楚 buffer 与 cache 的含义。

buffer 在操作系统中指 buffer cache, 中文一般翻译为 "缓冲区"。要理解缓冲区,必须明确另外两个概念:"扇区" 和 "块"。扇区是设备的最小寻址单元,也叫 "硬扇区" 或 "设备块"。块是操作系统中文件系统的最小寻址单元,也叫 "文件块" 或 "I/O 块"。每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示(下图来自互联网):

注意,buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。

cache 在操作系统中指 page cache,中文一般翻译为 "页高速缓存"。页高速缓存是内核实现的磁盘缓存。它主要用来减少对磁盘的 I/O 操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页高速缓存缓存的是内存页面。缓存中的页来自对普通文件、块设备文件(这个指的就是 buffer cache 呀)和内存映射文件的读写
页高速缓存对普通文件的缓存我们可以这样理解:当内核要读一个文件(比如 /etc/hosts)时,它会先检查这个文件的数据是不是已经在页高速缓存中了。如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件(比如 /etc/hosts)。
页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cahce。因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。

到这里我们应该搞清楚了:无论是缓冲区还是页高速缓存,它们的实现方式都是一样的。缓冲区只不过是一种概念上比较特殊的页高速缓存罢了。
那么为什么 free 命令不直接称为 cache 而非要写成 buff/cache? 这是因为缓冲区和页高速缓存的实现并非天生就是统一的。在 linux 内核 2.4 中才将它们统一。更早的内核中有两个独立的磁盘缓存:页高速缓存和缓冲区高速缓存。前者缓存页面,后者缓存缓冲区。当你知道了这些故事之后,输出中列的名称可能已经不再重要了。

free 与 available

在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available  = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。

交换空间(swap space)

swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件。所以具体的实现可以是 swap 分区也可以是 swap 文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。

现在的机器一般都不太缺内存,如果系统默认还是使用了 swap 是不是会拖累系统的性能?理论上是的,但实际上可能性并不是很大。并且内核提供了一个叫做 swappiness 的参数,用于配置需要将内存中不常用的数据移到 swap 中去的紧迫程度。这个参数的取值范围是 0~100,0 告诉内核尽可能的不要将内存数据移到 swap 中,也即只有在迫不得已的情况下才这么做,而 100 告诉内核只要有可能,尽量的将内存中不常访问的数据移到 swap 中。在 ubuntu 系统中,swappiness 的默认值是 60。如果我们觉着内存充足,可以在 /etc/sysctl.conf 文件中设置 swappiness:

vm.swappiness=10

如果系统的内存不足,则需要根据物理内存的大小来设置交换空间的大小。具体的策略网上有很丰富的资料,这里笔者不再赘述。

/proc/meminfo 文件

其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:

$ cat /proc/meminfo

有兴趣的同学可以直接查看这个文件。

转载https://www.cnblogs.com/operationhome/p/10362776.html

centos6 free 和 centos 7的free 的差异与对比

 

  在实际的工作中,我们经常会用到free这个命令,但是我们对这个命令的实际含义又知道多少,它在centos6 和centos 7 的显示又有什么差异?让我们一起瞧一瞧,看一看。

一 centos6 free

  free 命令默认是使用 kb 作为单位的,free -m 则是以Mb作为单位的,free -g 是以gb作为单位的,gb-->mb-->kb 采用的是1024度量单位(而非1000)

常用参数和含义

-b  指定单位为bytes
-m  指定单位为mb
-k  指定单位为kb
-g  指定单位为gb
-o 显示老版本的输出格式也就是不显示-/+ buffers/cache 这行 -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计

centos6 free 命令示例

[djx@xiaoxiao ~]$ cat /etc/redhat-release
CentOS release 6.5 (Final)
[djx@xiaoxiao ~]$ free 
             total       used       free     shared    buffers     cached
Mem: 8061376 7730380 330996 0 178608 4884772 -/+ buffers/cache: 2667000 5394376 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -m total used free shared buffers cached Mem: 7872 7519 352 0 174 4737 -/+ buffers/cache: 2607 5264 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -g total used free shared buffers cached Mem: 7 7 0 0 0 4 -/+ buffers/cache: 2 5 Swap: 0 0 0

free 值讲解

  我们这里以free 的值来进行讲解(显得精确些)

[djx@xiaoxiao ~]$ free 
             total                used           free               shared    buffers            cached
Mem:       8061376(total)    7730380(used1)     330996(free1) 0 178608(buffers1) 4884772(cached1) -/+ buffers/cache: 2667000(used2) 5394376(free2) Swap: 0 0 0

Mem
  total代表总的内存大小, used 代表程序已经使用的内存大小,free代表的是空闲的内存大小, shared 代表的是共享内存,buffers 代表的是 buffers cache, cached 代表的是 Page cache.

-/+ buffers/cache

  used 代表的除去buffers和cached实际程序占用的内存, free代表的是 total - 第二行used, 也就是 第一行free + 第一行buffers + 第一行cached

Swap

  这行代表的是交换分区(虚拟内存)。

计算公式

total=used1 + free1 ,总的内存大小= 使用的(used1)+ 空闲的(free1)
used1 = used2(第二行的2667000) + buffers1(178608)  + cached1(4884772) used2 = total - free2 free2 = free1 + buffers1(178608) + cached1(4884772)

二 centos7 free

  centos7 的free 命令多了一个 -h 参数,它会自动根据内存的大小,自动转换成合适的单位,默认的计算倍数是 1024 。free 的显示信息来自于/proc/meminfo

常用的参数

-h   以人性化显示
--si 指定计算倍数为1000.
-b  指定单位为bytes
-m  指定单位为mb
-k 指定单位为kb -g 指定单位为gb -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计 -w 将buff和cacher 分开显示,默认是在一起显示的。

centos7 free 命令示例

[root@localhost ~]# cat  /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        197M        1.3G        9.4M        272M        1.4G
Swap:          2.0G          0B        2.0G

[root@localhost ~]# free -wh total used free shared buffers cache available Mem: 1.8G 197M 1.3G 9.4M 2.1M 270M 1.4G Swap: 2.0G 0B 2.0G 

以 free -h 的值为例,

Mem :

total 代表的总的内存 (对应/proc/meminfo 里的MemTotal)
used 代表的是 已经使用的内存
free 是代表空闲的内存(对应/proc/meminfo 里的MemFree) 
shared 代表的是共享的内存(对应/proc/meminfo 里的Shmem)
buff/cache 代表的是 buff(对应/proc/meminfo里的Buffers)和cache的内存(对应/proc/meminfo 里的Cached and Slab), 
available 代表的是 活跃的内存
(官方文档对于available这样写到:Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free) ) available 代表的是一个新的应用程序可以使用内存的估计值,它不等于 free + buff/cache ,,因为在centos 7.2与Ubuntu 16.04以上(包含)的系统使用了新的Linux内核,所以并不是所有的buffer/cache空间都可以被回收。 内核commit链接 :https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?spm=a2c4g.11186623.2.9.5e3113ceBi7J5X&id=34e431b0ae398fc54ea69ff85ec700722c9da773

计算公式

used  =  total - free - buffers - cache
buff/cache = buffers + cache

三 buffers 和cache 的 介绍

buffers

  buffers 指的是 Memory used by kernel buffers(磁盘等块设备的缓冲) ,buffers 的字面意思就是缓冲,缓冲存在的目的是为了解决从速度快的地方往速度慢的地方输出东西,缓冲经常用于像 内存写入数据到磁盘,寄存器数据写到内存等等。位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。

cached

  cached 指的是 Memory used by the page cache and slabs(文件系统层级的缓存),cache 的字面意思是缓存,缓存存在的目的是为了解决从速度慢的地方获取数据,比如我们读取硬盘里面的文件,硬盘的传输速度是比内存慢很多的,当我们读取完一个文件后,然后重新打开这个文件,如果有缓存,也就是将上次读取文件后将文件缓存在内存里面,我们会发现,我们打开文件会比第一次打开快很多。

针对于两者直接的关系,我在网上看到一张图,可以很清晰的说明
image

为什么要清除 buffers 和caches

  因为caches是缓存的一些数据,当我们实际的数据内容已经更新了的话,那么当我们需要获取最新的数据时候,我们就需要清除caches里面的内容。
或者当我们的内存的不足(将被耗尽)时,那么系统会自动清除buffers 和caches ,以满足程序对内存的需求。

如何清除 buffers 和caches

下图来自网络
image
注意

在清除buffers 前,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。
方式一 :
表示清除 pagecache 。

echo 1 > /proc/sys/vm/drop_caches

表示清除回收 slab
分配器中的对象(包括目录项缓存和 inode 缓存)。 slab 分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的 pagecache 。

echo 2 > /proc/sys/vm/drop_caches

表示清除 pagecache 和 slab 分配器中的缓存对象。

echo 3 > /proc/sys/vm/drop_caches

重启后会失效

方式二: sysctl 命令更改

sysctl  -w   vm.drop_caches=1

重启后会失效

方式三:
编辑配置文件 sysctl.conf

echo "vm.drop_caches = 1" >>  /etc/sysctl.conf
sysctl -p  /etc/sysctl.conf

重启后不失效。

最后附上一张cache和buffer的对比,

free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存。

如果加上 -h 选项,输出的结果会友好很多:

有时我们需要持续的观察内存的状况,此时可以使用 -s 选项并指定间隔的秒数:

$ free -h -s 3

上面的命令每隔 3 秒输出一次内存的使用情况,直到你按下 ctrl + c。

由于 free 命令本身比较简单,所以本文的重点会放在如何通过 free 命令了解系统当前的内存使用状况。

输出简介

下面先解释一下输出的内容:
Mem 行(第二行)是内存的使用情况。
Swap 行(第三行)是交换空间的使用情况。
total 列显示系统总的可用物理内存和交换空间大小。
used 列显示已经被使用的物理内存和交换空间。
free 列显示还有多少物理内存和交换空间可用使用。
shared 列显示被共享使用的物理内存大小。
buff/cache 列显示被 buffer 和 cache 使用的物理内存大小。
available 列显示还可以被应用程序使用的物理内存大小。

我想只有在理解了一些基本概念之后,上面的输出才能帮助我们了解系统的内存状况。

buff/cache

先来提一个问题: buffer 和 cache 应该是两种类型的内存,但是 free 命令为什么会把它们放在一起呢?要回答这个问题需要我们做些准备工作。让我们先来搞清楚 buffer 与 cache 的含义。

buffer 在操作系统中指 buffer cache, 中文一般翻译为 "缓冲区"。要理解缓冲区,必须明确另外两个概念:"扇区" 和 "块"。扇区是设备的最小寻址单元,也叫 "硬扇区" 或 "设备块"。块是操作系统中文件系统的最小寻址单元,也叫 "文件块" 或 "I/O 块"。每个块包含一个或多个扇区,但大小不能超过一个页面,所以一个页可以容纳一个或多个内存中的块。当一个块被调入内存时,它要存储在一个缓冲区中。每个缓冲区与一个块对应,它相当于是磁盘块在内存中的表示(下图来自互联网):

注意,buffer cache 只有块的概念而没有文件的概念,它只是把磁盘上的块直接搬到内存中而不关心块中究竟存放的是什么格式的文件。

cache 在操作系统中指 page cache,中文一般翻译为 "页高速缓存"。页高速缓存是内核实现的磁盘缓存。它主要用来减少对磁盘的 I/O 操作。具体地讲,是通过把磁盘中的数据缓存到物理内存中,把对磁盘的访问变为对物理内存的访问。页高速缓存缓存的是内存页面。缓存中的页来自对普通文件、块设备文件(这个指的就是 buffer cache 呀)和内存映射文件的读写
页高速缓存对普通文件的缓存我们可以这样理解:当内核要读一个文件(比如 /etc/hosts)时,它会先检查这个文件的数据是不是已经在页高速缓存中了。如果在,就放弃访问磁盘,直接从内存中读取。这个行为称为缓存命中。如果数据不在缓存中,就是未命中缓存,此时内核就要调度块 I/O 操作从磁盘去读取数据。然后内核将读来的数据放入页高速缓存中。这种缓存的目标是文件系统可以识别的文件(比如 /etc/hosts)。
页高速缓存对块设备文件的缓存就是我们在前面介绍的 buffer cahce。因为独立的磁盘块通过缓冲区也被存入了页高速缓存(缓冲区最终是由页高速缓存来承载的)。

到这里我们应该搞清楚了:无论是缓冲区还是页高速缓存,它们的实现方式都是一样的。缓冲区只不过是一种概念上比较特殊的页高速缓存罢了。
那么为什么 free 命令不直接称为 cache 而非要写成 buff/cache? 这是因为缓冲区和页高速缓存的实现并非天生就是统一的。在 linux 内核 2.4 中才将它们统一。更早的内核中有两个独立的磁盘缓存:页高速缓存和缓冲区高速缓存。前者缓存页面,后者缓存缓冲区。当你知道了这些故事之后,输出中列的名称可能已经不再重要了。

free 与 available

在 free 命令的输出中,有一个 free 列,同时还有一个 available 列。这二者到底有何区别?
free 是真正尚未被使用的物理内存数量。至于 available 就比较有意思了,它是从应用程序的角度看到的可用内存数量。Linux 内核为了提升磁盘操作的性能,会消耗一部分内存去缓存磁盘数据,就是我们介绍的 buffer 和 cache。所以对于内核来说,buffer 和 cache 都属于已经被使用的内存。当应用程序需要内存时,如果没有足够的 free 内存可以用,内核就会从 buffer 和 cache 中回收内存来满足应用程序的请求。所以从应用程序的角度来说,available  = free + buffer + cache。请注意,这只是一个很理想的计算方式,实际中的数据往往有较大的误差。

交换空间(swap space)

swap space 是磁盘上的一块区域,可以是一个分区,也可以是一个文件。所以具体的实现可以是 swap 分区也可以是 swap 文件。当系统物理内存吃紧时,Linux 会将内存中不常访问的数据保存到 swap 上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问 swap 上存储的内容时,再将 swap 上的数据加载到内存中,这就是常说的换出和换入。交换空间可以在一定程度上缓解内存不足的情况,但是它需要读写磁盘数据,所以性能不是很高。

现在的机器一般都不太缺内存,如果系统默认还是使用了 swap 是不是会拖累系统的性能?理论上是的,但实际上可能性并不是很大。并且内核提供了一个叫做 swappiness 的参数,用于配置需要将内存中不常用的数据移到 swap 中去的紧迫程度。这个参数的取值范围是 0~100,0 告诉内核尽可能的不要将内存数据移到 swap 中,也即只有在迫不得已的情况下才这么做,而 100 告诉内核只要有可能,尽量的将内存中不常访问的数据移到 swap 中。在 ubuntu 系统中,swappiness 的默认值是 60。如果我们觉着内存充足,可以在 /etc/sysctl.conf 文件中设置 swappiness:

vm.swappiness=10

如果系统的内存不足,则需要根据物理内存的大小来设置交换空间的大小。具体的策略网上有很丰富的资料,这里笔者不再赘述。

/proc/meminfo 文件

其实 free 命令中的信息都来自于 /proc/meminfo 文件。/proc/meminfo 文件包含了更多更原始的信息,只是看起来不太直观:

$ cat /proc/meminfo

有兴趣的同学可以直接查看这个文件。

转载https://www.cnblogs.com/operationhome/p/10362776.html

centos6 free 和 centos 7的free 的差异与对比

 

  在实际的工作中,我们经常会用到free这个命令,但是我们对这个命令的实际含义又知道多少,它在centos6 和centos 7 的显示又有什么差异?让我们一起瞧一瞧,看一看。

一 centos6 free

  free 命令默认是使用 kb 作为单位的,free -m 则是以Mb作为单位的,free -g 是以gb作为单位的,gb-->mb-->kb 采用的是1024度量单位(而非1000)

常用参数和含义

-b  指定单位为bytes
-m  指定单位为mb
-k  指定单位为kb
-g  指定单位为gb
-o 显示老版本的输出格式也就是不显示-/+ buffers/cache 这行 -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计

centos6 free 命令示例

[djx@xiaoxiao ~]$ cat /etc/redhat-release
CentOS release 6.5 (Final)
[djx@xiaoxiao ~]$ free 
             total       used       free     shared    buffers     cached
Mem: 8061376 7730380 330996 0 178608 4884772 -/+ buffers/cache: 2667000 5394376 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -m total used free shared buffers cached Mem: 7872 7519 352 0 174 4737 -/+ buffers/cache: 2607 5264 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -g total used free shared buffers cached Mem: 7 7 0 0 0 4 -/+ buffers/cache: 2 5 Swap: 0 0 0

free 值讲解

  我们这里以free 的值来进行讲解(显得精确些)

[djx@xiaoxiao ~]$ free 
             total                used           free               shared    buffers            cached
Mem:       8061376(total)    7730380(used1)     330996(free1) 0 178608(buffers1) 4884772(cached1) -/+ buffers/cache: 2667000(used2) 5394376(free2) Swap: 0 0 0

Mem
  total代表总的内存大小, used 代表程序已经使用的内存大小,free代表的是空闲的内存大小, shared 代表的是共享内存,buffers 代表的是 buffers cache, cached 代表的是 Page cache.

-/+ buffers/cache

  used 代表的除去buffers和cached实际程序占用的内存, free代表的是 total - 第二行used, 也就是 第一行free + 第一行buffers + 第一行cached

Swap

  这行代表的是交换分区(虚拟内存)。

计算公式

total=used1 + free1 ,总的内存大小= 使用的(used1)+ 空闲的(free1)
used1 = used2(第二行的2667000) + buffers1(178608)  + cached1(4884772) used2 = total - free2 free2 = free1 + buffers1(178608) + cached1(4884772)

二 centos7 free

  centos7 的free 命令多了一个 -h 参数,它会自动根据内存的大小,自动转换成合适的单位,默认的计算倍数是 1024 。free 的显示信息来自于/proc/meminfo

常用的参数

-h   以人性化显示
--si 指定计算倍数为1000.
-b  指定单位为bytes
-m  指定单位为mb
-k 指定单位为kb -g 指定单位为gb -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计 -w 将buff和cacher 分开显示,默认是在一起显示的。

centos7 free 命令示例

[root@localhost ~]# cat  /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        197M        1.3G        9.4M        272M        1.4G
Swap:          2.0G          0B        2.0G

[root@localhost ~]# free -wh total used free shared buffers cache available Mem: 1.8G 197M 1.3G 9.4M 2.1M 270M 1.4G Swap: 2.0G 0B 2.0G 

以 free -h 的值为例,

Mem :

total 代表的总的内存 (对应/proc/meminfo 里的MemTotal)
used 代表的是 已经使用的内存
free 是代表空闲的内存(对应/proc/meminfo 里的MemFree) 
shared 代表的是共享的内存(对应/proc/meminfo 里的Shmem)
buff/cache 代表的是 buff(对应/proc/meminfo里的Buffers)和cache的内存(对应/proc/meminfo 里的Cached and Slab), 
available 代表的是 活跃的内存
(官方文档对于available这样写到:Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free) ) available 代表的是一个新的应用程序可以使用内存的估计值,它不等于 free + buff/cache ,,因为在centos 7.2与Ubuntu 16.04以上(包含)的系统使用了新的Linux内核,所以并不是所有的buffer/cache空间都可以被回收。 内核commit链接 :https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?spm=a2c4g.11186623.2.9.5e3113ceBi7J5X&id=34e431b0ae398fc54ea69ff85ec700722c9da773

计算公式

used  =  total - free - buffers - cache
buff/cache = buffers + cache

三 buffers 和cache 的 介绍

buffers

  buffers 指的是 Memory used by kernel buffers(磁盘等块设备的缓冲) ,buffers 的字面意思就是缓冲,缓冲存在的目的是为了解决从速度快的地方往速度慢的地方输出东西,缓冲经常用于像 内存写入数据到磁盘,寄存器数据写到内存等等。位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。

cached

  cached 指的是 Memory used by the page cache and slabs(文件系统层级的缓存),cache 的字面意思是缓存,缓存存在的目的是为了解决从速度慢的地方获取数据,比如我们读取硬盘里面的文件,硬盘的传输速度是比内存慢很多的,当我们读取完一个文件后,然后重新打开这个文件,如果有缓存,也就是将上次读取文件后将文件缓存在内存里面,我们会发现,我们打开文件会比第一次打开快很多。

针对于两者直接的关系,我在网上看到一张图,可以很清晰的说明
image

为什么要清除 buffers 和caches

  因为caches是缓存的一些数据,当我们实际的数据内容已经更新了的话,那么当我们需要获取最新的数据时候,我们就需要清除caches里面的内容。
或者当我们的内存的不足(将被耗尽)时,那么系统会自动清除buffers 和caches ,以满足程序对内存的需求。

如何清除 buffers 和caches

下图来自网络
image
注意

在清除buffers 前,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。
方式一 :
表示清除 pagecache 。

echo 1 > /proc/sys/vm/drop_caches

表示清除回收 slab
分配器中的对象(包括目录项缓存和 inode 缓存)。 slab 分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的 pagecache 。

echo 2 > /proc/sys/vm/drop_caches

表示清除 pagecache 和 slab 分配器中的缓存对象。

echo 3 > /proc/sys/vm/drop_caches

重启后会失效

方式二: sysctl 命令更改

sysctl  -w   vm.drop_caches=1

重启后会失效

方式三:
编辑配置文件 sysctl.conf

echo "vm.drop_caches = 1" >>  /etc/sysctl.conf
sysctl -p  /etc/sysctl.conf

重启后不失效。

最后附上一张cache和buffer的对比,

  在实际的工作中,我们经常会用到free这个命令,但是我们对这个命令的实际含义又知道多少,它在centos6 和centos 7 的显示又有什么差异?让我们一起瞧一瞧,看一看。

一 centos6 free

  free 命令默认是使用 kb 作为单位的,free -m 则是以Mb作为单位的,free -g 是以gb作为单位的,gb-->mb-->kb 采用的是1024度量单位(而非1000)

常用参数和含义

-b  指定单位为bytes
-m  指定单位为mb
-k  指定单位为kb
-g  指定单位为gb
-o 显示老版本的输出格式也就是不显示-/+ buffers/cache 这行 -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计

centos6 free 命令示例

[djx@xiaoxiao ~]$ cat /etc/redhat-release
CentOS release 6.5 (Final)
[djx@xiaoxiao ~]$ free 
             total       used       free     shared    buffers     cached
Mem: 8061376 7730380 330996 0 178608 4884772 -/+ buffers/cache: 2667000 5394376 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -m total used free shared buffers cached Mem: 7872 7519 352 0 174 4737 -/+ buffers/cache: 2607 5264 Swap: 0 0 0 [djx@xiaoxiao ~]$ free -g total used free shared buffers cached Mem: 7 7 0 0 0 4 -/+ buffers/cache: 2 5 Swap: 0 0 0

free 值讲解

  我们这里以free 的值来进行讲解(显得精确些)

[djx@xiaoxiao ~]$ free 
             total                used           free               shared    buffers            cached
Mem:       8061376(total)    7730380(used1)     330996(free1) 0 178608(buffers1) 4884772(cached1) -/+ buffers/cache: 2667000(used2) 5394376(free2) Swap: 0 0 0

Mem
  total代表总的内存大小, used 代表程序已经使用的内存大小,free代表的是空闲的内存大小, shared 代表的是共享内存,buffers 代表的是 buffers cache, cached 代表的是 Page cache.

-/+ buffers/cache

  used 代表的除去buffers和cached实际程序占用的内存, free代表的是 total - 第二行used, 也就是 第一行free + 第一行buffers + 第一行cached

Swap

  这行代表的是交换分区(虚拟内存)。

计算公式

total=used1 + free1 ,总的内存大小= 使用的(used1)+ 空闲的(free1)
used1 = used2(第二行的2667000) + buffers1(178608)  + cached1(4884772) used2 = total - free2 free2 = free1 + buffers1(178608) + cached1(4884772)

二 centos7 free

  centos7 的free 命令多了一个 -h 参数,它会自动根据内存的大小,自动转换成合适的单位,默认的计算倍数是 1024 。free 的显示信息来自于/proc/meminfo

常用的参数

-h   以人性化显示
--si 指定计算倍数为1000.
-b  指定单位为bytes
-m  指定单位为mb
-k 指定单位为kb -g 指定单位为gb -t 显示物理内存和虚拟内存的总和 -s n 每隔n秒显示一次 -c 显示多少次 -V 显示free的版本信息并退出 -l 显示最低和最高的内存数据统计 -w 将buff和cacher 分开显示,默认是在一起显示的。

centos7 free 命令示例

[root@localhost ~]# cat  /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) 
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        197M        1.3G        9.4M        272M        1.4G
Swap:          2.0G          0B        2.0G

[root@localhost ~]# free -wh total used free shared buffers cache available Mem: 1.8G 197M 1.3G 9.4M 2.1M 270M 1.4G Swap: 2.0G 0B 2.0G 

以 free -h 的值为例,

Mem :

total 代表的总的内存 (对应/proc/meminfo 里的MemTotal)
used 代表的是 已经使用的内存
free 是代表空闲的内存(对应/proc/meminfo 里的MemFree) 
shared 代表的是共享的内存(对应/proc/meminfo 里的Shmem)
buff/cache 代表的是 buff(对应/proc/meminfo里的Buffers)和cache的内存(对应/proc/meminfo 里的Cached and Slab), 
available 代表的是 活跃的内存
(官方文档对于available这样写到:Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free) ) available 代表的是一个新的应用程序可以使用内存的估计值,它不等于 free + buff/cache ,,因为在centos 7.2与Ubuntu 16.04以上(包含)的系统使用了新的Linux内核,所以并不是所有的buffer/cache空间都可以被回收。 内核commit链接 :https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?spm=a2c4g.11186623.2.9.5e3113ceBi7J5X&id=34e431b0ae398fc54ea69ff85ec700722c9da773

计算公式

used  =  total - free - buffers - cache
buff/cache = buffers + cache

三 buffers 和cache 的 介绍

buffers

  buffers 指的是 Memory used by kernel buffers(磁盘等块设备的缓冲) ,buffers 的字面意思就是缓冲,缓冲存在的目的是为了解决从速度快的地方往速度慢的地方输出东西,缓冲经常用于像 内存写入数据到磁盘,寄存器数据写到内存等等。位于内存buffer中的数据不是即时写入磁盘,而是系统空闲或者buffer达到一定大小统一写到磁盘中,所以断电易失,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。

cached

  cached 指的是 Memory used by the page cache and slabs(文件系统层级的缓存),cache 的字面意思是缓存,缓存存在的目的是为了解决从速度慢的地方获取数据,比如我们读取硬盘里面的文件,硬盘的传输速度是比内存慢很多的,当我们读取完一个文件后,然后重新打开这个文件,如果有缓存,也就是将上次读取文件后将文件缓存在内存里面,我们会发现,我们打开文件会比第一次打开快很多。

针对于两者直接的关系,我在网上看到一张图,可以很清晰的说明
image

为什么要清除 buffers 和caches

  因为caches是缓存的一些数据,当我们实际的数据内容已经更新了的话,那么当我们需要获取最新的数据时候,我们就需要清除caches里面的内容。
或者当我们的内存的不足(将被耗尽)时,那么系统会自动清除buffers 和caches ,以满足程序对内存的需求。

如何清除 buffers 和caches

下图来自网络
image
注意

在清除buffers 前,为了防止数据丢失所以我们最好正常关机或者多执行几次sync命令,让位于buffer上的数据立刻写到磁盘里。
方式一 :
表示清除 pagecache 。

echo 1 > /proc/sys/vm/drop_caches

表示清除回收 slab
分配器中的对象(包括目录项缓存和 inode 缓存)。 slab 分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的 pagecache 。

echo 2 > /proc/sys/vm/drop_caches

表示清除 pagecache 和 slab 分配器中的缓存对象。

echo 3 > /proc/sys/vm/drop_caches

重启后会失效

方式二: sysctl 命令更改

sysctl  -w   vm.drop_caches=1

重启后会失效

方式三:
编辑配置文件 sysctl.conf

echo "vm.drop_caches = 1" >>  /etc/sysctl.conf
sysctl -p  /etc/sysctl.conf

重启后不失效。

最后附上一张cache和buffer的对比,

猜你喜欢

转载自www.cnblogs.com/saolv/p/12285442.html