在Linux系统监控的工具中,free命令是最为常用的命令之一。free命令用于显示Linux系统内存的使用情况,包括物理内存(Mem)、交换内存(swap)和内核缓冲区内存(buffer/cache)。针对不同类型不同版本操作系统,free命令所展示的内存使用情况有所差异,我们这里以centos6.5和centos7.2系统为例对命令的输出内容展开说明。
1、centos7.2下free 命令现实内存使用情况
free -m 其中-m的是用MB来显示输出的内容
Mem
: 内存的使用信息
Swap
: 交换空间的使用信息
第一行说明:
total
: 系统总的物理内存大小
used
: 系统已使用物理内存大小
free
: 系统还剩余的物理内存大小
shared
: 被共享使用的物理内存大小
buff/cache
: buffer/cache使用的物理内存大小
buffers
Memory used by kernel buffers (Buffers in /proc/meminfo)
cached
Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)
available
从应用程序角度来看,还可以被 应用程序 使用的物理内存大小
计算方式:
total = used + free + buff/cache
buff/cache = buffers + cache
available = free + buff/cache - 不可释放部分
对于buffer和cache到底是什么,二者之间有什么区别?底层实现原理到底是什么?什么时候该用buffer?什么时候该用cache?我相信很多人与我一样都是一头雾水,没有完全搞明白。
剑桥大学的计算机科学家大卫·惠勒 (David Wheeler)曾经说过一句很有哲理的话:
“Any problem in computer science can be solved by anther layer of indirection.”
翻译过来就是“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决” 。
大道至简,这句话真的是无与伦比的精辟,一句话从顶层设计上概括了整个计算机体系结构无论是软件系统还是硬件系统的分层结构思想。个人认为buffer和cache也是基于上诉分层体系思想而实现的。从字面上看,buffer的含义是缓存,cache的含义是缓存。我们知道硬件由于制作工艺不同,不同硬件读写速率有差距是非常悬殊的。比如,一般来说,内存访问的速度是硬盘读写速度的10倍以上。
假设有两个需要通信的硬件设备A和B,A的读写速率为100M/S,B的读写速率为50M,那么A与B相互访问时会存在两种相似场景:
-
一是A向B写入100M文件内容,由于A的读写速率是B的两倍,B每秒钟只能读取50M,剩下50M还需要1秒钟,A白白浪费了1秒钟;
-
二A从B读取100M文件内容,B每秒钟只能写入50M,A读取剩下50M还需要1秒钟,因此也白白浪费了1秒钟。
那有什么办法让A设备向B设备读/写的时候可以不浪费时间在1秒钟中内完成呢?我们知道A白白浪费了1秒钟而不能去处理其他任务,根本原因是两个设备读写速率不一致产生的延迟等待。因此,聪明的小伙伴可能会想到刚才大神说得那句至理名言:
“Any problem in computer science can be solved by anther layer of indirection.”
没错,我们可以在A设备与B设备之间嫁接一个中间层(middle layer),让中间层能够抹平双方的读写速率差异。计算机系统不同硬件之间的读写协议不同,因此需要通过接口进行交互。在middle layer靠近A处提供接口IA,IA读写速率与A近乎相同;靠近B处提供接口IB,IB读写速率与B近乎相同,A与B读写文件必须通过中间层的IA和IB接口。
-
对于第一种场景:A向B写入100M文件内容,A知道只要通过middle layer就可以向B写入文件,因此通过IA接口将100M文件内容写入到middle layer。A从自身角度来看,已经将文件完整发送给B了,然后就可以开心得去处理其他工作了。一般情况下middle layer不会马上将文件写入到B中,middle layer相当于充当了buffer缓冲区的作用。缓冲区的使用场景是读写速率高的设备流向读写速率低的设备区域。例如,CPU寄存器写数据到内存,内存写数据到磁盘。
-
对于第二种场景:A从B读取100M文件内容,第一次读取的时候由于受B的速率所拖累,还是白白等待浪费了水岸。但是在第二次读取的时候,middle layer将提早读取B的文件内容并进行缓存,A要读取B文件内容时直接是从middle layer缓存区读取,middle layer相当于一个cache缓存区。这时另外的设备C、D、E等要读取B的文件内容,也可以直接从缓存区读取,这些操作简直不要太酸爽了。当然如果cache不同步,可以清理掉cache。
Page cache实际上是针对文件系统的缓存,从磁盘读取的内容会写入到这里,因此应用程序读取时速度会非常快。比如grep等命令第一次查找时会慢很多,后面再重复执行就会快好多。
Buffer cache是针对磁盘块的缓存,缓冲的这一部分内存数据最终是要写入到磁盘中。缓冲的数据不是实时写入到磁盘的,防止数据丢失可以在计算机断电前多执行几次sync命令。
那么最后来看下如何清理Buffer/Cache。Buffer/Cache释放前最好sync一下,防止丢失数据,但是一般情况下没有必要手动释放内存。
- Clear PageCache only
$sync; echo 1 > /proc/sys/vm/drop_caches
- Clear dentries and inodes.
$sync; echo 2 > /proc/sys/vm/drop_caches
- Clear PageCache, dentries and inodes.
$sync; echo 3 > /proc/sys/vm/drop_caches
2、centos6.5下free 命令现实内存使用情况
Mem
: 内存的使用信息,从操作系统角度分析内存使用情况
-/+ buffers/cache
:从应用程序角度分析内存使用情况
-buffers/cache:也就是used-buffers-cache,表示当前系统中实际被应用程序吃掉的内存;
+buffers/cache:也就是free+buffers+cache,表示当前系统中还可以挪用分配给应用程序的实际内存总数;
愿你也能走出你的信息茧房