在Linux/Unix 系统上,free是一个很受系统管理员欢迎的命令,它是一个功能强大的工具,他能以一种易读的方式把内存使用情况展示出来
free 展示了系统中空闲和已经使用了的物理内存、交换内存以及内核的缓冲区和页面缓存,所有展示的信息都是从 /proc/meminfo 文件解析出来的
语法
free命令的语法如下
free [options]
输出列说明
当只输入free
命令不带任何选项时,输出的内存和交换内存大小是以 KB(kbytes)为单位的,具体的输出如下所示(在旧版的Linux系统中,显示可能略有不同):
[root@ecs-centos-7 ~]# free
total used free shared buff/cache available
Mem: 1881544 325980 1307868 8712 247696 1406892
Swap: 0 0 0
total
总内存的大小,可以用于应用程序的内存
used
已经使用内存,计算方式是:used = total - free - buff/cache
free
还没有使用的内存
shared
进程之间的共享内存
buff/cache
内核缓冲区和页面缓存,如果应用程序需要的话,可以随时回收这部分缓存,通过 free -w
命令可以分别显示 buff 和 cache 占用的内存
available
可用内存的预估大小,可以用于启动新的应用程序,实际应用中,可以把 free 和 buff/cache 加起来看做 available 的近似值,即 free + buff/cache ≈ available
常用的选项
以下是一些常用的选项
以易读的方式显示
[root@ecs-centos-7 ~]# free -h
total used free shared buffers cache available
Mem: 1881544 353752 881684 8712 147960 498148 1370492
Swap: 0 0 0
显示物理内存和交换内存的总和
[root@ecs-centos-7 ~]# free -t
total used free shared buff/cache available
Mem: 1881544 354108 881328 8712 646108 1370136
Swap: 0 0 0
Total: 1881544 354108 881328
每隔N秒输出一次
[root@ecs-centos-7 ~]# free -s 2
total used free shared buff/cache available
Mem: 1881544 353960 881476 8712 646108 1370284
Swap: 0 0 0
total used free shared buff/cache available
Mem: 1881544 353984 881452 8712 646108 1370260
Swap: 0 0 0
total used free shared buff/cache available
Mem: 1881544 353984 881452 8712 646108 1370260
Swap: 0 0 0
例子中的命令是每隔2秒输出一次内存信息,直到按 Ctrl + Z
停止
重复输出N次
[root@ecs-centos-7 ~]# free -c 3
total used free shared buff/cache available
Mem: 1881544 353960 881476 8712 646108 1370284
Swap: 0 0 0
total used free shared buff/cache available
Mem: 1881544 353984 881452 8712 646108 1370260
Swap: 0 0 0
total used free shared buff/cache available
Mem: 1881544 353984 881452 8712 646108 1370260
Swap: 0 0 0
上面的例子是重复输出内存信息3次,每次间隔默认是1秒,如果要修改默认输出间隔可以加上 -s 秒数
,下面的命令是:重复输出3次,每次输出间隔2秒
free -c 3 -s 2
buff 和 cache 分开显示
[root@ecs-centos-7 ~]# free -w
total used free shared buffers cache available
Mem: 1881544 354100 881328 8712 147968 498148 1370144
Swap: 0 0 0
以 Bytes、KB、MB、GB 为单位输出
[root@ecs-centos-7 ~]# free -b
total used free shared buff/cache available
Mem: 1926701056 362446848 902631424 8921088 661622784 1403179008
Swap: 0 0 0
[root@ecs-centos-7 ~]# free -k
total used free shared buff/cache available
Mem: 1881544 354100 881328 8712 646116 1370144
Swap: 0 0 0
[root@ecs-centos-7 ~]# free -m
total used free shared buff/cache available
Mem: 1837 345 860 8 630 1338
Swap: 0 0 0
[root@ecs-centos-7 ~]# free -g
total used free shared buff/cache available
Mem: 1 0 0 0 0 1
Swap: 0 0 0
上面的例子中,分别以 Bytes、KB、MB、GB 为单位输出内存信息,会自动忽略小于对应单位的数值,比如 free -g
命令,只有 total 和 available 列的值大于 1GB ( 1024 * 1024 * 1024 Bytes ), 其他列的值都是小于 1GB,所以 total 和 available 列显示 1,其他列都显示 0
实际还有多少可用内存
[root@ecs-centos-7 ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 534M 100M 8.5M 1.3G 1.5G
Swap: 0B 0B 0B
在上面的示例中,如果只是看 used 以及 free 的话,会以为系统可用内存已经不足100M,也即可使用内存不足 1%了
实际上,已经被应用程序使用的只有 27%左右(534M / 1.8G), 应用程序可用内存是 availabe 或者 free + buff/cache ,也就是说例子中实际可用于应用程序的内存有 1.5G 之多
内存什么时候告急
在平常的服务器监控内存的过程中,有以下几个信号是需要引起注意的
availabe 或者 free + buff/cache 接近于0了
availabe 或者 free + buff/cache 表示实际应用程序的可用内存,如果它接近于0的话,表示应用程序可用内存不足,需要尽快处理
已使用交换内存一直在增长
已使用交换内存一直增长的话,有可能是物理内存不足的先兆,当物理内存长时间不足的时候,才会频繁的使用交换内存,导致已使用交换内存一直增长
出现 Out of memory
为了防止系统物理内存不够用的时候系统崩溃,当检测到内存不足时,系统会 kill 掉最占用内存的进程,/var/log/message 中会记录 Out of memory
的日志