top free命令真的能得到实际内存使用状况吗?

一.关于Virtual Memory
参考:http://serverfault.com/questions/138427/top-what-does-virtual-memory-size-mean-linux-ubuntu
这里写图片描述
虚拟内存往往是在线程在内存中映射了一个很大的文件,而这个文件存储在磁盘上,也需要占用一个很大的地址空间,交换区的问题撇开不谈。
这里写图片描述
而RES内存才是线程真正占用的内存*
这里写图片描述
最准确的,首先要排除其他线程的内存动态大幅变化的前提下,启动线程,记录free memory掉的情况,vmstat和free命令都可以
VIRT字段的man page:

o: VIRT  --  Virtual Image (kb)
      The  total  amount  of  virtual  memory  used  by the task.  It
      includes all code, data and shared libraries  plus  pages  that
      have been swapped out.

      VIRT = SWAP + RES.​

所以它是一个统计数据
参考:http://serverfault.com/questions/122810/apache-heavy-load-virt-vs-res-memory
VIRT在实时内存的衡量上,几乎是不需要考虑的
二.关于Used Memory
案例:
参考http://stackoverflow.com/questions/4802481/how-to-see-top-processes-by-actual-memory-usage

这里写图片描述
这里存在一个问题,free命令或者top标题部分显示的used统计数据,和top标题下面的部分的详细进程的RES的累加,
差别很大,used远大于RES的累加和
还有一个问题,就是进城的真实占用内存,top命令显示的是不是偏少?
三.尝试
我们将之前消耗内存很严重的协处理器程序,让他跑起来,监控86机器(87,88,89的free memory太少,数据变化很快稳定,不易观察),在运行脚本前后,通过free -m命令和top命令监控内存变化情况:
这里写图片描述
||
||
\/
这里写图片描述
可见,脚本运行16分钟后,86机器:
free memory: 37.4G —> 29.3G
HRegionserver:RES 2.1G —> 2.1G VIRT 3428m —> 3455m
关闭脚本一段时间:
这里写图片描述
86机器:
free memory: 37.4g —> 29.3g —> 29.2g
HRegionserver:RES 2.1g —> 2.1g —> 2.2g VIRT 3428m —> 3455m —> 3610m
可见,free memory掉了8个G,但是top命令得到的HRegionserver等process的RES并没有明显增加!
仔细观察top结果(按照m排序)中,各个process的RES都没有大的变化,其实top下面的关于process的各项指标几乎都变化不大!
但是,我们观察到; swap部分:
swap cached:21.7g —> 29.8g —> 29.8g
正好cache占用增加了8个G
然后,我们参考:
这里写图片描述
总结来说,就是Linux系统并不是简单的将内存分配给各个process,它还进行了一层内存管理
第一.访问文件的文件数据,系统会缓存起来,以便以后访问,就是所说的命中内存页类似的原理,
这部分的文件缓存的处理,直接体现在swap cached统计数据里面,也体现在VIRT Memory里面,两个都是统计数据,只增不减,跟process实际占用的内存不直接相关
我们再使用smem工具分析内存的消耗:
这里写图片描述
=====||||||||=====
====\\\//====
这里写图片描述
SMEM工具的右边三列是USS PSS RSS
free memory: 29.0g —> 20.2g
而smem显示的habse 114605 process占用的USS稳定而且还下降了,VIRT内存不变,swap cache上涨了8个g
可见我们的process做了很多文件方面的读写活动,导致系统将内存分配出去缓存这些内容,成为了“被浪费”的used memory,这部分内存需要Linux系统去回收
四.问题的进一步解答
top命令显示的线程实际内存占用是RES这一指标,但是所有线程的RES数之和与used memeory差别很大(至少是两倍多)?
参考:http://serverfault.com/questions/377617/how-to-interpret-output-from-linux-top-command
这里写图片描述
这里写图片描述
这里写图片描述
总结就是 :
(一):used这个统计量,并不是用户线程占用内存之和,而是Linux系统总共消耗的内存,用户线程是“寄生”于Linux OS之上的;
(二):对于free统计量,是“干净的”可以直接分配的内存,但是cached和buffered这两种状态的内存,主要是映射到磁盘的缓冲,也能够被继续分配
(三):真正被使用的内存real free memory = used - buffers - cached;真正可用的内存real free memory = total - real free memory

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值