关于free命令的各参数网上有好多的资料,我们来看看正确的解读方式是怎样的。
现在linux上面的free命令有两个版本,比如centos 6 用的是旧版本,centos 7 用的是新版本,如下
centos 6 :
[root@centos-6-2 ~]# uname -r
2.6.32-573.22.1.el6.x86_64
[root@centos-6-2 ~]# free
total used free shared buffers cached
Mem: 1906904 168440 1738464 3280 6916 47040
-/+ buffers/cache: 114484 1792420
Swap: 1048572 0 1048572
centos 7 :
root:~/ # uname -r
3.10.0-514.26.2.el7.x86_64
root:~/ # free
total used free shared buff/cache available
Mem: 999948 168956 451588 31848 379404 618400
Swap: 4063228 0 4063228
旧版free
旧版的free命令(centos6)有三行内容:Mem,-/+ buffers/cache,Swap,代表的内容如下:
名称 | 代表的内容 |
---|---|
Mem | 物理内存 |
-/+ buffers/cache | 表示物理内存已用多少,可用多少 |
Swap | 交换空间 |
列的内容是total,used,free,shared,buffers,cached,代表的内容如下:
名称 | 代表的内容 |
---|---|
total | 总量 |
used | 已使用的 |
free | 空闲的 |
shared | 共享的,在linux里面有很多共享内存,比如一个libc库,很多程序调用,但实际只存一份 |
buffers | 缓存,可回收 |
cached | 缓存,可回收 |
这里有个地方要注意,关于buffers和cached的区别。cached和buffers都可以读写,它们唯一的区别就是一个以裸设备或分区为背景,一个以文件系统里的文件为背景。比如你cat /dev/sda1 > /dev/null,那/dev/sda1的内容进入buffers,如果你cat /opt/test.py > /dev/null,则/opt/test.py的内容进入cached。
看下Mem和Swap的total的计算公式
total = used + free
比如本例中,Mem的used是168440,free是1738464,加起来刚好是total的1906904
接下来看下中间-/+ buffers/cache的used和free是怎么计算的。
-/+ buffers/cache的used = 第一行的used - 第一行的buffers - 第一行的cached
比如本例中,-/+ buffers/cache的used是114484,这个值是由第一行的used 168440,减去第一行的buffers 6916 ,再减去第一行的cached 47040
-/+ buffers/cache的free = 第一行的free + 第一行的buffers + 第一行的cached
比如本例中,-/+ buffers/cache的free 是1792420,这个值是由第一行的free 1738464,加上第一行的buffers 6916 ,再加上第一行的cached 47040
估算空闲的物理内存时可参考-/+ buffers/cache的free的值,但实际的可用内存要小于这个值,因为不能所有的buffers和cached都释放。
新版free
新版free相比旧版,删除了-/+ buffers/cache这行内容,把buffers和cached放一起了,增加了available值。
通过刚才的分析可以看下这样更改更合理,因为buffe和cache本质是一样的,没必要区分出来。
查看可用内存时,直接看available即可,不需要再计算。
available = free + (buff/cache通过一个算法后产生的值)
详细可以看内核的commit
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773