您的位置:首页 > 其它

性能指标之资源指标-内存-内存是否泄漏

2017-03-21 09:11 260 查看


在稳定性测试(也叫持久测试或疲劳测试)中,需要观察内存是否有泄露。然而使用内存的进程千千万,整个服务器的内存增长似乎也不能判断某个进程的内存有泄露。因此在稳定性测试过程中往往需要全程关注指定进程的内存消耗,比如运行3天、7天。

查看内存使用情况的命令有ps、sar、svmon、vmstat等等,但本文并不从工具使用的角度来介绍,而是从性能测试中关注指标的角度来介绍。如果采用其他命令查看内存,需注意,相似的名字在不同命令当中的含义是不一样的,一定要搞清楚这个字段的真正含义。

例1:Virtual这个词,有时候在内存里面指Paging Space(换页空间),有时指进程空间里面占用的所有分页(包括物理内存和Paging Space中的分页)。

例2:Nmon中的PgIn/PgOut、topas中的PageIn/PageOut是指对文件系统的换页,而vmstat中的pi/po是对Paging Space的换页,而topas P中进程的PAGE SPACE是指进程的Data Segment。下面就来介绍这个Data Segment。

Data Segment

1、获取来源

ps gv 进程号:SIZE(单位为KB)

svmon –P 进程号:work process private +work shared library data (根据具体情况,可能单位为4KB)

topas P中进程的PAGE SPACE(根据具体情况,可能单位为4KB)

2、指标说明

内存泄露指进程自己申请分配、使用了内存但没有在使用完毕后释放,大量的泄露会导致物理内存用满,降低系统效率。

如何判断一个进程有没有内存泄露?AIX中使用ps gv命令观察特定进程的SIZE指标,如果SIZE经过长时间测试后,不断增长,则可能有内存泄露的嫌疑,这里说的是嫌疑,而不是一定。如果是java程序由于涉及到JVM的内存管理,问题就更难判断的,我们先放下java程序不表,单说C的程序。

SIZE在ps命令当中的解释是The virtual size of the data section of the process (in 1KB units)。为什么看这个指标,则需要从进程空间开始说。



进程空间的内存可以分为三种类型:

1)数据段:Data Segment (Data + BSS + Heap)

2)栈:Stack

3)代码段:Code Segment

 

栈(Stack):包括返回地址、自动分配的变量,都是一会儿有一会儿没的,系统自动回收,不会造成内存泄露。

代码段:进程跑起来肯定要有代码,代码基本上可以说是固定大小的,不会造成内存泄露。当然如果代码太大,装不进内存,那就另当别论了。

剩下的数据段就是进程自己分配、使用的分页,数据段包括Data + BSS + Heap。

  Data是已经初始化的全局和静态变量。

  BSS是未初始化的全局和静态变量,比如static int i。

  Heap(堆)是进程中malloc, realloc等函数申请的,需要free等函数释放。

1、举例

ps gv命令中SIZE就是该进程数据段的virtual size(1KB为单位),这些分页可能在物理内存中也可能在Paging Space中。

检查SIZE列在长期的测试过程中是否有明显的持续增长,如有,说明可能有内存泄露。



长期的抓取和后期的图形化处理,可以写脚本或代码来实现。

其他命令也可以看到这个值,例如“svmon –P 进程号”以看work process private的virtual大小+work shared library data的virtual大小。二者的单位是4K的分页。(169+85)*4=254*4=1016,与ps v得到的SIZE值相同。



也可以Topas,敲击P,看指定进程的PAGE SPACE,也是254,254*4=1016,与ps v得到的SIZE值相同。



有人会问,为什么不从nmon里面取值?nmon的TOP Sheet里面的进程也有SIZE等内存的指标,但nmon的TOP Sheet中只列出占CPU比较多的N个进程,如果被监控的进程占CPU很低,就不会出现在TOP Sheet中。或者一开始被监控进程占CPU较多,后来由于它占用的CPU减少而从TOP sheet中移除了,那么我们并不知道这个进程是销毁了还是CPU利用率太低了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: