前言
free查看当前系统的内存及交换分区使用情况。(写这篇文档是因为一次面试中,面试官问道buff cache你了解吗? 两个月不碰系统突然有些懵。。。你了解什么叫buff/cache吗?)
语法格式
free [options]
选项
-b:以Byte为单位显示内存使用情况 -k:以KB为单位显示内存使用情况 -m:以MB为单位显示内存使用情况 -g:以GB为单位显示内存使用情况 -h:以合适的单位显示内存使用情况,最大为三位数,自动计算对应的单位值。单位有: B = bytes K = kilos M = megas G = gigas T = teras -o:不显示缓冲区调节列 -s<间隔秒数>:持续观察内存使用状况 -t:显示内存总和列 -V:显示版本信息
实例
查看当前系统内存使用状况
sh-4.2# free -m total used free shared buff/cache available Mem: 32105 8401 21728 9 1975 23296 Swap: 65535 0 65535 # Mem(第二行):物理内存描述信息 # Swap(第三行):交换内存描述信息 # total(第二列):系统总的可用物理内存大小 # used(第三列):已被使用的物理内存大小 # free(第四列):还有多少物理内存可用 # shared(第五列):多个进程共享的内存总额;如oracle的共享内存 # buff/cache(第六列):这里是两个内容的描述;buff表示I/O缓存、cache表示高速缓存。 # available(第七列):还可以被应用程序使用的物理内存大小
PS:free 与 available 的区别
free
是真正尚未被使用的物理内存数量。available
是应用程序认为可用内存数量,available = free + buffer + cache
(注:只是大概的计算方法)
Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。这就是稍后要说明的 buffer 和 cache。
PS:buffer和cache
- buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
- cache(Page Cache)是一种高速缓存,用于CPU和内存之间的缓冲 ,是文件系统的cache。把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
动态查看内存使用情况
sh-4.2# free -m -s 1 total used free shared buff/cache available Mem: 32105 8402 21726 9 1975 23294 Swap: 65535 0 65535 total used free shared buff/cache available Mem: 32105 8402 21726 9 1975 23294 Swap: 65535 0 65535 total used free shared buff/cache available Mem: 32105 8402 21726 9 1975 23294 Swap: 65535 0 65535 total used free shared buff/cache available Mem: 32105 8402 21726 9 1975 23294 Swap: 65535 0 65535 total used free shared buff/cache available Mem: 32105 8402 21726 9 1975 23294 Swap: 65535 0 65535 total used free shared buff/cache available Mem: 32105 8402 21726 9 1975 23294 Swap: 65535 0 65535 total used free shared buff/cache available Mem: 32105 8402 21726 9 1975 23294 Swap: 65535 0 65535 # 每隔1S就会动态查看/proc/meminfo里面的内容
释放内存
echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches # 1表示清除page cache数据 # 2表示清除slab分配器中的对象(包括目录项缓存和inode缓存) # 3表示清除pagecache和slab分配器中的缓存对象 # /proc/sys/vm/drop_caches的默认值是0.
# 清除数据以前记得sync,先同步缓存中的数据至硬盘,以免数据丢失。
参考文档
https://www.cnblogs.com/M18-BlankBox/p/5326484.html
https://www.jianshu.com/p/2ffeb3a3aa90
https://focusss.github.io/2019/02/10/Linux%E4%B8%ADbuff-cache%E5%8D%A0%E7%94%A8%E8%BF%87%E9%AB%98%E8%A7%A3%E5%86%B3%E6%89%8B%E6%AE%B5/