linux命令free

free 命令是一个显示系统中空闲和已用内存大小的工具。free 命令的输出和 top 命令相似。大多数Linux发行版已经含有 free 命令。

想要运行,只需在控制台输入free 即可。不带选项运行会显示一个以KB为单位的默认输出。

1
2
3
4
5
$ free
free
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 263893792 99222360 146860540 4450868 17810892 155716084
交换: 142029816 35339728 106690088
  • total 系统总的可用物理内存大小
  • used 已被使用的物理内存大小
  • free 还有多少物理内存可用
  • shared 被共享使用的物理内存大小
  • buff/cache 被 buffer 和 cache 使用的物理内存大小
  • available 还可以被 应用程序 使用的物理内存大小

free 与 available是不同的:

  • free 是真正尚未被使用的物理内存数量。
  • available 是应用程序认为可用内存数量。available = free + buffer + cache

free = total - buffer -cache - used; available = free + buffer + cache; 注:只是大概的计算方法

Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,对于内核来说,buffer 和 cache 其实都属于已经被使用的内存。但当应用程序申请内存时,如果 free 内存不够,内核就会回收 buffer 和 cache 的内存来满足应用程序的请求。

buffer & cache

cache是 Linux page缓存的大小,减去swap缓存(SwapCached)的内存(总页面缓存大小为 Cached+ SwapCached)。Linux 通过page cache执行所有文件I/O。

  • 写入被简单地实现为将page cache中的相应page标记为脏;然后,异步刷新程序线程会定期将任何脏页写回磁盘。
  • 读取是通过从page cache返回数据来实现的;如果数据尚未在缓存中,则首先填充该数据。

在现代 Linux 系统上,缓存很容易达到几千兆字节。它只会在响应内存压力时收缩。系统将清除页面缓存,同时将数据交换到磁盘,以便根据需要提供更多内存。

bugger 是内存中块 I/O 缓冲区。它们的寿命相对较短。缓冲区是原始磁盘块,不在页面缓存中表示,即不是文件数据。缓冲区指标的重要性最低。在大多数系统上,缓冲区通常只有几十兆字节。

在 Linux 内核版本 2.4 之前,Linux 具有单独的页面和缓冲区缓存。从 2.4 开始,页面和缓冲区缓存是统一的.

参数

free 支持通过参数控制内存单位.

1
2
3
4
5
6
7
8
# 以bytes为单位来显示内存的信息。
free -b
# 以kb为单位来显示内存的信息。
free -k
# 以mb为单位来显示内存的信息。
free -m
# 以gb为单位来显示内存的信息。
free -g

以适于人类可读方式显示内存信息。-h与其他命令最大不同是-h选项会在数字后面加上适于人类可读的单位

1
2
3
4
$ free -h
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 251Gi 94Gi 139Gi 4.3Gi 17Gi 148Gi
交换: 135Gi 33Gi 101Gi

可以每隔N秒打印一次内存信息,直到用ctrl+c结束

1
$ free -s N

可以重复打印内存信息N次

1
$ free -c N

/proc/meminfo

free 命令本质上是读取文件/proc/meminfo的信息。这也会带来一些问题。例如docker中的free命令通常是不准确的。