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.​
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

所以它是一个统计数据 
参考: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




文章转自:http://blog.csdn.net/cmdssd1/article/details/51841255

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值