美文网首页
再聊linux free命令

再聊linux free命令

作者: jerrik | 来源:发表于2019-07-23 15:34 被阅读0次

    网上关于linux free的文章已经非常多了,但是自己每当要用时总觉得不能得心应手,所以有必要再整理一下;也结合线上近期出现的一个由于内存占用导致ssh失败的问题来分析,进一步加深理解;

    一、linux free命令介绍

    命  令: free
    功能说明:显示内存状态。
    语  法: free [-bkmotV][-s <间隔秒数>]
    补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
    参数:

     -b  以Byte为单位显示内存使用情况。 
     -k  以KB为单位显示内存使用情况。 
     -m  以MB为单位显示内存使用情况。 
     -o  不显示缓冲区调节列。 
     -s<间隔秒数>  持续观察内存使用状况。 
     -t  显示内存总和列。 
     -V  显示版本信息。
    

    用得最多的还数free -gfree -m:

    二、使用示例
    [root@TENCENT64 ~]# free -m
                        total       used       free     shared    buffers     cached
    第一行: Mem:         64178      30590      33587          0         51       1264
    第二行: -/+ buffers/cache:      29274      34903
    第三行: Swap:         2039          0       2039
    

    Mem:表示物理内存统计
    -/+ buffers/cached:表示物理内存的缓存统计
    Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
    系统的总物理内存:64178M,但系统当前真正可用的内存并不是第一行free 标记的 33587M,它仅代表未被分配的内存。
    【第1行 Mem】:
    total:表示物理内存总量。
    used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
    free:未被分配的内存。
    shared:共享内存,一般系统不会用到,这里也不讨论。
    buffers:系统分配但未被使用的buffers 数量。
    cached:系统分配但未被使用的cache 数量。
    buffer 与cache 的区别见后面。
    total = used + free
    【第2行 -/+ buffers/cached】:
    used:也就是第一行中的used - buffers-cached 也是实际使用的内存总量。
    free:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
    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

    三、疑点问答
    • 第一行中的used参数对应的是系统真实的内存吗?
      是的,不过该部分包含了系统cachedbuffers内存;
    • 第二行中-/+是啥意思?
      顾名思义就是做加减法,具体的含义分别就是第一行中的used数值减掉第一行中的cachedbuffers后系统所使用的内存和第一行中的free加上第一行中的cachedbuffers后总共使用的内存大小;
      即:
    30590 - 51 - 1264 = 29274(基本相等,因为这里的单位是M)
    33587 + 51 + 1264 = 34903
    

    由于total = used + free; 根据上面的加减法可得知,第二行【-/+buffers/cache行】也同样满足total = used + free;

    • 怎么看系统内存占用的?
      如果第一行中的【free】比较大,则可认为系统内存占用非常少,说明内存还很充足; 反之,如果系统【free】比较小,但是第一行中的【buffers】和【cached】比较大,则认为操作系统自身分配的内存比较多,一般不用过多关注,操作系统会自身调整内存; 只要不用【swap】的交换空间,就不用担心自己的内存太少;
    四、案例分享(未完待续)

    昨天登录线上IDC机器,报错信息如下:

    ssh_exchange_identification: Connection closed by remote host
    

    通过公司机器健康度采集平台内存占用情况如下:


    image.png

    在20:00左右内存确实被打满了,导致登录失败,只能重启IDC机器; 幸运的是,部署同样服务的机器还能连接上去,机器used总内存在55g左右,其中应用内存占用28g左右,剩下20多g的内存全被cached+buffers占用;确实有点奇怪,该机器上并没有部署操作文件的服务,为啥cached+buffers不释放呢?
    带着这个疑问,我先把服务的堆内存由8g调整到4g,然后再手动清空掉linux分配的缓存:

    echo 1 > /proc/sys/vm/drop_caches
    echo 2 > /proc/sys/vm/drop_caches
    echo 3 > /proc/sys/vm/drop_caches
    

    然后等服务运行几天我再持续观察内存的变化,后续有结果了再来补充。。。

    相关文章

      网友评论

          本文标题:再聊linux free命令

          本文链接:https://www.haomeiwen.com/subject/klwolctx.html