linux下,一个运行中的程序,究竟占用了多少内存?-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 426635
  • 博文数量: 168
  • 博客积分: 320
  • 博客等级: 二等列兵
  • 技术积分: 955
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-21 08:40
个人简介

知足却不乏追求

文章分类

全部博文(168)

文章存档

2017年(1)

2016年(6)

2015年(36)

2014年(5)

2013年(6)

2012年(114)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2016-04-08 14:27:47

原文地址: 作者:

1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有

   (1). ps aux:


     其中  vsz(或vss)列 表示,程序占用了多少虚拟内存。

           rss列 表示, 程序占用了多少物理内存。

           虚拟内存可以不用考虑,它并不占用实际物理内存。

   (2). top 命令也可以

     其中  virt(或vss)列  表示,程序占用了多少虚拟内存。 同 ps aux 中的 vsz列

           res列 表示, 程序占用了多少物理内存。同 ps aux 中的rss列

           

2.在linux下, 查看当前系统占用了多少内存, 一般的命令是  free

其中, free就是系统还有多少内存可以使用。

但由于 linux 系统对内存使用有一个原则, 就是, 内存是宝贵的, 能使用多少就使用多少。 所以, linux会把已经调用过的包缓存起来,放在内存里。

这样,实际上,可以使用的内存,就可以理解为, free buffers cached


3.当你了解完这些命令以后, 再去使用ps aux 命令去查看的时候, 会发现一个奇怪的现象。

 所有的  rss 列的数据,加起来, 比物理内存的数要大很多。

 比如, 物理内存为2g, 而rss列的数据加起来,可能有5个g之多, 这是怎么回事了?

 

 这是因为rss列的值骗了我们。 

 

 linux的内存机制是这样的:

 在运行一个程序时, linux会调用该程序依赖的链接库, 如lib.xx.so。 首先看该链接库是否被映射进内存中,如果没有被映射,则将代码段与数据段映射到内存中,否则只是将其加入进程的地址空间。

 

 这样,当n个程序,依赖到lib.xx.so的时候, 实际上,内存中只有一个lib.xx.so ,而不是n个。 

 

 而rss在显示一个程序占用的实际物理内存时, 将lib.xx.so也算了进来。

 

 比如, x程序, 本身占用内存为5m, lib.xx.so 占用内存2m,lib.xx.so被n个程序共享依赖。 则rss显示为,x程序运行,占用内存为7m。 实际上, x程序占用了5m空间。 多余的2m被讨入到rss中了。

 

 当你在用ps aux显示内存占用情况时, n个共享依赖lib.xx.so的n个程序,都把这2m空间,算在自己的rss中了, 这样rss的sum值,就比实际物理内存多了。

 

 当然, linux的内存使用机制很复杂, 不是一句两句能说清楚的。这里只是简单的说明了一下, ps aux中的rss值, 并不能真实反映物理内存的使用情况。

 

4. 如果查看更详细的内存使用情况, 可用以下几种方法, 或者几种方法结合使用:

这几种方法,都需要root账户的权限


(1). pmap -d $pid 

$pid 是正在运行的程序的pid


(2). cat /proc/$pid/smaps

  smaps的数据比较详细,可简单的归纳一下,归纳的命令如下:

  cat /proc/$pid/smaps  | awk '/size|rss|pss|shared|private|referenced|swap/{val_name=gensub(/([a-za-z_]*).*/,"\\1",1,$1); list[val_name] =$2; }end{for(val in list)print val,list[val];}'                     

(3). cat /proc/$pid/maps


(4). cat /proc/$pid/statm

输出解释

第一列  size:任务虚拟地址空间大小
第二列  resident:正在使用的物理内存大小
第三列  shared:共享页数
第四列  trs:程序所拥有的可执行虚拟内存大小
第五列  lrs:被映像倒任务的虚拟内存空间的库的大小
第六列  drs:程序数据段和用户态的栈的大小
第七列 dt:脏页数量

(5). vmstat

这个命令据说也可以提供一些参考信息,具体还未研究

 

5.作为phper,尝试过使用php的函数memory_get_usage(), 该函数也不能得到php当前运行的程序,实际的,真正占用的内存数量。

  如果真想得到,php真正占用的内存, 大概只能在, 程序运行的开始,执行一次memory_get_usage().

  在程序运行结束,执行一次memory_get_usage()。 将两者的值相减,得到的值, 应该是一个相对比较准确的,内存占用数量了。

  这个方法还没有测试, 考虑到, 得到这个数量,也没有实际意义, 加上平时又比较忙,懒得试了。

  

  也许php还有一个方法, 是使用shm_* 系列函数, 这也我也未深入研究,详见这篇文章()

  

 6.另外还有一些文章可以参考,如下:

 (1)一个c程序员, 眼中的,写的比较详细,比较细致,也比较专业。

 (2)对 

 (3)

 (4)

 (5)

 (6),这篇文章似乎是对一个产品的广告,但里面对uss,pss,rss 这几个概念有详细的解释

 (7) 跟(6)一样,是对同一个产品的广告,文章里有一些东西可以参考

(8) ,文章对 free, vmstat,top , gnome-system-monitor等命令有一些介绍

(9),对top,free,uptime,pmap,smartctl,iostat,strace等命令有所介绍,并且介绍的比较详细,目前只是粗略的看了一下,有时间还要再看看。 

(10),比较详细的介绍了pmap的应用,不过是基于solaris 9的

阅读(1440) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图