free命令使用(内存计算)

3 阅读5分钟

最近在看服务器性能的参数,free命令总是用得很晕。
之所以晕,是因为不同版本的free打印的数据项目不一样,数据也不一样。
之前看了v3.2.8的,查查资料,弄明白了。后来看v3.3.10,又不一样了,这次就专门整理记录下。

一、先熟悉下free 的命令参数

free --help

出来结果:

free: invalid option -- '-'  
usage: free [-b|-k|-m|-g|-h] [-l] [-o] [-t] [-s delay] [-c count] [-V]  
-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

1)-b,-k,-m,-g show output in bytes, KB, MB, or GB
按照bytes, KB, MB, or GB作为单位来输出,
例如:

free -m
             total       used       free     shared    buffers     cached
Mem:         16080      15858        222          1        322      13278
-/+ buffers/cache:       2258      13822
Swap:         8191        381       7810
free -g
             total       used       free     shared    buffers     cached
Mem:            15         15          0          0          0         12
-/+ buffers/cache:          2         13
Swap:            7          0          7

2)-h human readable output (automatic unit scaling)
人性化输出,例如:

free -h
             total       used       free     shared    buffers     cached
Mem:           15G        15G       228M       1.9M       322M        12G
-/+ buffers/cache:       2.2G        13G
Swap:         8.0G       381M       7.6G

3)-l show detailed low and high memory statistics
不知道啥意思..

4) use old format (no -/+buffers/cache line)
不显示-/+buffers/cache 这一行。v3.3.10没有这个参数选项。

5)-t display total for RAM + swap
显示内存+交换空间的总内存,t是total的意思吧。例:

free -ht
             total       used       free     shared    buffers     cached
Mem:           15G        15G       225M       1.9M       322M        12G
-/+ buffers/cache:       2.2G        13G
Swap:         8.0G       381M       7.6G
Total:         23G        15G       7.8G

感觉也没多大意义

6)-s update every [delay] seconds
不断输出,指定间隔秒数。不过这里不一定是整数,0.5也可以! 
比如 free -h -s 10 ,就是10秒输出一次。

7)-c update [count] times
不断输出,指定输出次数。
比如  free -h -c 10,就是输出10次。

但是在版本 v3.2.8,就是 输出一次!需要配合 -s 食用。
在版本 v3.3.10,不加-s,就默认1秒输出一次。其他版本怎么样,不清楚。
比如free -h -s 2 -c 10,每隔2秒输出一回,输出10次。

8)-a show available memory if exported by kernel (>80 characters per line)
不知道啥意思..,不过
在版本3.3.10,有一个参数是

-w, --wide          wide output。

就是把buffers 和cache 分开显示,因为在3.3.10中,默认打印的是(buffers + cache)的值。

9)-V display version information and exit
查看版本号。

 

二、数据查看

举例:
v3.2.8

free -h
             total       used       free     shared    buffers     cached
Mem:           15G        15G       263M       1.9M       322M        12G
-/+ buffers/cache:       2.2G        13G
Swap:         8.0G       381M       7.6G

v3.3.10

 free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        5.9G        626M        1.2G        9.1G        8.0G
Swap:           29G         28M         29G
free -wh
              total        used        free      shared     buffers       cache   available
Mem:            15G        5.9G        610M        1.2G        2.8G        6.3G        8.0G
Swap:           29G         28M         29G

1.total:总可用物理内存。一般是总物理内存除去一些预留的和操作系统本身的内存占用,是操作系统可以支配的内存大小。这个在v3.2.8和v3.3.10一样。这个值是/proc/meminfo中MemTotal的值。

2.used:已使用的物理内存。 在v3.2.8,这个值是(total - free)得出来的。可以说是系统已经被系统分配,但是实际并不一定正在被真正的使用,其空间可以被回收再分配的。 在v3.3.10,这个值是(total - free - cache - buffers)得出来的,是真正目前正在被使用的内存。

3.free:系统还未使用的物理内存。这个值是/proc/meminfo中MemFree的值。

4.shared:共享内存的空间。这个值是/proc/meminfo中Shmem的值。

5.buffers:用来给块设备做缓存的大小。这个值是/proc/meminfo中Buffers的值。

6.cached:v3.2.8中的项。这个值是/proc/meminfo中Cached的值。
cache:v3.3.10中的项。这个值是/proc/meminfo中(Cached + Slab)的值。
在buff/cache是(buffers+cache)的值。free -w可以分开显示。

7.available:v3.3.10中的项。看起来这个值是可以使用的内存,不过(available + used) < total,也就是available < (free + cache + buffers)。
而在v3.2.8中(free + cache + buffers)是一般认为的可用内存,既然在新版本中有这个available数据,应该是更准确的吧。毕竟并不是所有的未使用的内存就一定是可用的。
这个值是取的/proc/meminfo中MemAvailable的值,如果meminfo中没有这个值,会依据meminfo中的Active(file),Inactive(file),MemFree,SReclaimable等值计算一个。

-/+ buffers/cache

v3.2.8有这一行,v3.3.10 没有。
其中,used 这一项是(used - buffers - cached)的值,即(total - free - buffers - cached)的值,是真正在使用的内存的值。
free 这一项是(free + buffers + cached)的值,是真正未使用的内存的值。

个人觉得有 -/+ buffers/cache,这一栏看的挺习惯。。不过新版本v3.3.10的used更明确。相信有不少人和我一样,刚看到v3.2.8里面的used占了这么多内存的时候,有点摸不着头脑。

总结一下:
(1) 使用 free v3.2.8,看内存占用,两个办法:
1.看 -/+ buffers/cache 这一行。used 是已使用的内存;free 是未使用的内存。
2.看 Mem 这一行。(used - buffers - cached) 是已使用的内存;(free + buffers + cached) 是未使用的内存。

(2) 使用 free v3.3.10,看内存占用:
看 Mem 这一行。used 是已使用的内存;(free + buff/cache),即(total - used)是未使用的内存;available 是剩余可以使用的内存。未使用的内存不代表都可用,所以 available <(total - used)。

2019-10-29 18:32:53