【Linux学习】Linux free 命令学习

一、学习这个命令的背景

因为最近Gitlab服务器占用内存很多,也在下面的这篇博客里面写了怎么减少Gitlab占用的内存问题。
+【Git学习】解决GitLab内存消耗大的问题

但是一开始并没有很清楚的明白free命令的每一个数据到底代表的什么意思,导致一直以为优化没有效果。后面认真学习了下free命令,先看看

操作系统版本是 Ubuntu 14.04
linux的内核版本号是 3.13.0-24-generic

在这里插入图片描述

root@ubuntu116:~# uname -r 
3.13.0-24-generic
您在 /var/mail/root 中有新邮件
root@ubuntu116:~# uname -a
Linux ubuntu116 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
您在 /var/mail/root 中有新邮件
root@ubuntu116:~# cat /proc/version 
Linux version 3.13.0-24-generic (buildd@panlong) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014
root@ubuntu116:~#  lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04 LTS
Release:	14.04
Codename:	trusty
root@ubuntu116:~# 

二、free命令使用

首先是要 free --help命令,来查看下free命令的用法。
在这里插入图片描述

root@ubuntu116:~# free --help

Usage:
 free [options]

Options:
 -b, --bytes         show output in bytes
 -k, --kilo          show output in kilobytes
 -m, --mega          show output in megabytes
 -g, --giga          show output in gigabytes
     --tera          show output in terabytes
 -h, --human         show human-readable output
     --si            use powers of 1000 not 1024
 -l, --lohi          show detailed low and high memory statistics
 -o, --old           use old format (without -/+buffers/cache line)
 -t, --total         show total for RAM + swap
 -s N, --seconds N   repeat printing every N seconds
 -c N, --count N     repeat printing N times, then exit

     --help     display this help and exit
 -V, --version  output version information and exit

For more details see free(1).

下面我们来测试下几个常用的options

2.1 free -b

在这里插入图片描述

root@ubuntu116:~# free -b
             total       used       free     shared    buffers     cached
Mem:    67529682944 64533520384 2996162560  213880832  351289344 58317025280
-/+ buffers/cache: 5865205760 61664477184
Swap:   68690112512    7532544 68682579968
您在 /var/mail/root 中有新邮件
root@ubuntu116:~# 

2.2 free -k

在这里插入图片描述

root@ubuntu116:~# free -k
             total       used       free     shared    buffers     cached
Mem:      65946956   63518300    2428656     208900     343148   56952900
-/+ buffers/cache:    6222252   59724704
Swap:     67080188       7356   67072832
您在 /var/mail/root 中有新邮件
root@ubuntu116:~# 

2.3 free -m

在这里插入图片描述

root@ubuntu116:~# free -m
             total       used       free     shared    buffers     cached
Mem:         64401      62458       1942        204        335      55618
-/+ buffers/cache:       6505      57895
Swap:        65507          7      65500
root@ubuntu116:~# 

2.4 free -g

在这里插入图片描述

root@ubuntu116:~# free -g
             total       used       free     shared    buffers     cached
Mem:            62         60          1          0          0         54
-/+ buffers/cache:          6         56
Swap:           63          0         63
root@ubuntu116:~# 

2.5 free -h

在这里插入图片描述

root@ubuntu116:~# free -h
             total       used       free     shared    buffers     cached
Mem:           62G        60G       2.2G       204M       336M        54G
-/+ buffers/cache:       6.1G        56G
Swap:          63G       7.2M        63G
root@ubuntu116:~# 

2.6 free -l

显示详细的低内存和高内存统计信息
在这里插入图片描述

root@ubuntu116:~# free -l 
             total       used       free     shared    buffers     cached
Mem:      65946956   63396736    2550220     209228     344632   56953528
Low:      65946956   63396736    2550220
High:            0          0          0
-/+ buffers/cache:    6098576   59848380
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

2.7 free -o

使用旧格式(没有 -/+buffers/cache 这一行)

在这里插入图片描述

root@ubuntu116:~# free -o
             total       used       free     shared    buffers     cached
Mem:      65946956   64045184    1901772     209256     344760   56969912
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

2.8 free -t

展示RAM和swap的合计
在这里插入图片描述

root@ubuntu116:~# free -t
             total       used       free     shared    buffers     cached
Mem:      65946956   64118724    1828232     209616     345348   56973588
-/+ buffers/cache:    6799788   59147168
Swap:     67080188       7356   67072832
Total:   133027144   64126080   68901064
root@ubuntu116:~# 

2.9 free -s N

每相隔N秒重复打印一次内存信息,直到你按下 Ctrl + c

在这里插入图片描述

root@ubuntu116:~# free -s 3
             total       used       free     shared    buffers     cached
Mem:      65946956   64138880    1808076     209708     345616   56957708
-/+ buffers/cache:    6835556   59111400
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64073124    1873832     209716     345616   56957720
-/+ buffers/cache:    6769788   59177168
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64167628    1779328     209720     345616   56957732
-/+ buffers/cache:    6864280   59082676
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64159796    1787160     209720     345620   56957728
-/+ buffers/cache:    6856448   59090508
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64166776    1780180     209724     345628   56957740
-/+ buffers/cache:    6863408   59083548
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   63093948    2853008     209724     345632   56957756
-/+ buffers/cache:    5790560   60156396
Swap:     67080188       7356   67072832

2.10 free -c N

重复打印N次内存信息,然后退出

在这里插入图片描述

root@ubuntu116:~# free -c 3
             total       used       free     shared    buffers     cached
Mem:      65946956   64199120    1747836     209780     345744   56974404
-/+ buffers/cache:    6878972   59067984
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   63949560    1997396     209780     345744   56974404
-/+ buffers/cache:    6629412   59317544
Swap:     67080188       7356   67072832

             total       used       free     shared    buffers     cached
Mem:      65946956   64093104    1853852     209780     345744   56974408
-/+ buffers/cache:    6772952   59174004
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

2.11 free -V

显示版本号信息

在这里插入图片描述

root@ubuntu116:~# free -V
free from procps-ng 3.3.9
root@ubuntu116:~# 

三、free命令输出内容名词解释

在这里插入图片描述

root@ubuntu116:~# free
             total       used       free     shared    buffers     cached
Mem:      65946956   64255040    1691916     213840     356892   56805760
-/+ buffers/cache:    7092388   58854568
Swap:     67080188       7356   67072832
root@ubuntu116:~# 

3.1 Mem,-/+ buffers/cache,Swap 解释

我们看到free命令有三行内容:Mem,-/+ buffers/cache,Swap,代表的内容如下:

名称代表的内容
Mem内存的使用情况
-/+ buffers/cache表示物理内存已用多少,可用多少
Swap交换空间的使用情况

3.2 total,used,free,shared,buffers,cached 解释

列的内容是total,used,free,shared,buffers,cached,代表的内容如下:

名称代表的内容
total总量
used已使用的
free空闲的
shared共享的,在linux里面有很多共享内存,比如一个libc库,很多程序调用,但实际只存一份
buffers缓存,可回收
cached缓存,可回收
  • 关于buffers和cached的区别
    这里有个地方要注意,关于buffers和cached的区别。
    关于free命令里面的cached、buffers的区别,下面一幅图可以表达:
    (图片引用自 https://blog.csdn.net/juS3Ve/article/details/79191634 宋宝华老师的博客)
    在这里插入图片描述

cached和buffers都可以读写,它们唯一的区别就是:buffers以裸设备或分区为背景,cached以文件系统里的文件为背景。

比如 cat /dev/sda1 > /dev/null,那**/dev/sda1的内容进入buffers**,
如果cat /opt/test.py > /dev/null,则**/opt/test.py的内容进入cached**。

在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:

  • A buffer is something that has yet to be “written” to disk.
  • A cache is something that has been “read” from the disk and stored for later use.
    也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么Mem这一行cached 比较大,而Mem这一行free 比较小的原因。

四、free命令输出内容计算公司

下面我们来计算一下free命令各个参数是怎么计算出来的,参考下面的图片
(图片引用自 https://blog.csdn.net/juS3Ve/article/details/79191634 宋宝华老师的博客)
在这里插入图片描述

4.1 关于Mem这一行的total的计算公式

计算公式为 : total = used + free

在这里插入图片描述

total (65946956) = used (64255040) + free (1691916)

比如本例中,Mem的used是64255040,free是1691916,加起来刚好是total的65946956.

4.2 关于 -/+ buffers/cache这一行的used的计算公式

free输出的第二行是从一个应用程序的角度看系统内存的使用情况。

-/+ buffers/cache这一行的used,即 -buffers/cache ,表示一个应用程序认为系统被用掉多少内存,实实在在吃掉的内存

计算公式为: -/+ buffers/cache的used = Mem这一行的used - Mem这一行的buffers - Mem这一行的cached

在这里插入图片描述

`-/+ buffers/cache的used (7092388) = Mem这一行的used (64255040) - Mem这一行的buffers (356892)- 去Mem这一行的cached (56805760)

比如本例中,-/+ buffers/cache的used是7092388,这个值是由Mem这一行的used 64255040,减去Mem这一行的buffers 356892,再减去Mem这一行的cached 56805760。

4.3 关于 -/+ buffers/cache这一行的free的计算公式

-/+ buffers/cache这一行的free,即 +buffers/cache ,表示一个应用程序认为系统还有多少内存,可以挪用的内存总数

计算公式为: -/+ buffers/cache的free = Mem这一行的free + Mem这一行的buffers + Mem这一行的cached

在这里插入图片描述

-/+ buffers/cache的free (58854568) = Mem这一行的free (1691916) + Mem这一行的buffers (356892) + Mem这一行的cached (56805760)

比如本例中,-/+ buffers/cache的free 是58854568,这个值是由Mem这一行的free 1691916,加上Mem这一行的buffers 356892,再加上Mem这一行的cached 56805760

因为被系统cache和buffer占用的内存可以被快速回收,所以通常**-/+ buffers/cache这一行的free会比Mem这一行的free**大很多。

4.4 关于Swap这一行的total的计算公式

计算公式为 : total = used + free

在这里插入图片描述

total (67080188) = used (7356) + free (67072832)

比如本例中,Swap的used是7356,free是67072832,加起来刚好是total的67080188.

4.5 关于估算空闲的物理内存

估算空闲的物理内存时可参考-/+ buffers/cache的free的值,但实际的可用内存要小于这个值,因为不能所有的buffers和cached都释放。

我想大家看了上面,还是很晕.第一部分(Mem)与第二部分(-/+ buffers/cache)的结果中有关usedfree为什么这么奇怪?

其实我们可以从二个方面来解释.

操作系统来讲是Mem这一行的buffers/cached 都是属于被使用,所以它认为free只有1691916

应用程序来讲是**-/+ buffers/cach。 buffers/cached 是等同可用的**,因为buffer/cached是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。

五 关于 buffer和cache

5.1 什么是buffer/cache?

buffer 和 cache 是两个在计算机技术中被用滥的名词,放在不通语境下会有不同的意义。

在 Linux 的内存管理中,这里的 buffer 指 Linux 内存的: Buffer cache 。这里的 cache 指 Linux 内存中的: Page cache 。翻译成中文可以叫做缓冲区缓存页面缓存
在历史上,它们一个( buffer )被用来当成对 io 设备写的缓存,而另一个( cache )被用来当作对 io 设备的读缓存,这里的 io 设备,主要指的是块设备文件和文件系统上的普通文件。
但是现在,它们的意义已经不一样了。
在当前的内核中, page cache 顾名思义就是针对内存页的缓存,说白了就是,如果有内存是以 page 进行分配管理的,都可以使用 page cache 作为其缓存来管理使用。
当然,不是所有的内存都是以页( page )进行管理的,也有很多是针对块( block )进行管理的,这部分内存使用如果要用到 cache 功能,则都集中到 buffer cache 中来使用。(从这个角度出发,是不是 buffer cache 改名叫做 block cache 更好?)然而,也不是所有块( block )都有固定长度,系统上块的长度主要是根据所使用的块设备决定的,而页长度在 X86 上无论是 32 位还是 64 位都是 4k 。

明白了这两套缓存系统的区别,就可以理解它们究竟都可以用来做什么了。

5.2 什么是 page cache

Page cache 主要用来作为文件系统上的文件数据的缓存来用,尤其是针对当进程对文件有 read / write 操作的时候。如果你仔细想想的话,作为可以映射文件到内存的系统调用: mmap 是不是很自然的也应该用到 page cache ?在当前的系统实现里, page cache 也被作为其它文件类型的缓存设备来用,所以事实上 page cache 也负责了大部分的块设备文件的缓存工作。

5.3 什么是 buffer cache

Buffer cache 则主要是设计用来在系统对块设备进行读写的时候,对块进行数据缓存的系统来使用。这意味着某些对块的操作会使用 buffer cache 进行缓存,比如我们在格式化文件系统的时候。一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候, page cache 的内容会被改变,而 buffer cache 则可以用来将 page 标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写( writeback )时,就不用将整个 page 写回,而只需要写回修改的部分即可。

5.4 如何回收 cache ?

Linux 内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般情况下,这个操作中主要的内存释放都来自于对 buffer / cache 的释放。尤其是被使用更多的 cache 空间。既然它主要用来做缓存,只是在内存够用的时候加快进程对文件的读写速度,那么在内存压力较大的情况下,当然有必要清空释放 cache ,作为 free 空间分给相关进程使用。所以一般情况下,我们认为 buffer/cache 空间可以被释放,这个理解是正确的。

但是这种清缓存的工作也并不是没有成本。理解 cache 是干什么的就可以明白清缓存必须保证 cache 中的数据跟对应文件中的数据一致,才能对 cache 进行释放。所以伴随着 cache 清除的行为的,一般都是系统 IO 飙高。因为内核要对比 cache 中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。

  • 人工触发缓存清除

在系统中除了内存将被耗尽的时候可以清缓存以外,我们还可以使用下面这个文件来人工触发缓存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches

方法是:

echo 1 > /proc/sys/vm/drop_caches

当然,这个文件可以设置的值分别为 1 、 2 、 3 。它们所表示的含义为:

echo 1 > /proc/sys/vm/drop_caches

表示清除 pagecache 。

echo 2 > /proc/sys/vm/drop_caches

表示清除回收 slab 分配器中的对象(包括目录项缓存和 inode 缓存)。 slab 分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的 pagecache 。

echo 3 > /proc/sys/vm/drop_caches
表示清除 pagecache 和 slab 分配器中的缓存对象。

六、参考链接


作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:https://blog.csdn.net/qq446282412/article/details/84292776
如果本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行打赏。

  • 15
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字节卷动

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值