如何发现客户端软件中的内存泄漏?

上一篇 / 下一篇  2008-06-12 20:29:26 / 个人分类:发表个人意见

   对于题目中的问题,我今儿个发表下个人见解,有不正确之处还请大侠们多多指点.

   为了定位客户端内存泄露我们首先先判定客户端操作系统是什么?windows还是Unix(Linux)?

   无论是windows还是Unix(Linux),我们都可以通过两种方式进行监控和定位:
   方式一:

   若是windows操作系统,可以通过手动查看性能计数器的状态进行问题定位,近而确认是否是内存泄漏,操作步骤如下:

   选择开始-〉控制面板-〉性能和维护-〉管理工具-〉性能查看系统各种资源的使用情况,我们还可以通过图表上面的"+"来选择要查看的计数器信息;
   若是unix或者linux系统,可以通过命令行的方式察看系统资源,操作步骤如下:

   输入vmstat(-f|-s)命令来监控系统内存使用统计,包括进程信息、memory信息、page信息、错误信息、cpu信息;输入top命令用于显示进程对系统资源的利用程度,包括cpu占用百分比信息,内存资源使用情况;还可以通过free命令察看内存信息;
   例如:输入vmstat命令后显示的信息如下:
    procs    memory             page                        faults       cpu
    r  b  w  avm   free    re  at  pi  po   fr  de   sr   in   sy   cs  us  sy id
    1  0  0 925137 928837  535 2   0   0    0   0    0   1001  2271 136  1   1 98 
    输入top命令后信息显示如下:
System:****                                     Thu Jun 12 17:43:58 2008
Load averages: 0.02, 0.02, 0.02
178 processes: 166 sleeping, 11 running, 1 zombie
Cpu states:
CPU   LOAD   USER   NICE    SYS   IDLE  BLOCK  SWAIT   INTR   SSYS
 0    0.05   0.8%   0.0%   2.0%  97.2%   0.0%   0.0%   0.0%   0.0%
 1    0.01   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0%
 2    0.01   1.4%   0.0%   1.2%  97.4%   0.0%   0.0%   0.0%   0.0%
 3    0.02   0.0%   0.0%   0.2%  99.8%   0.0%   0.0%   0.0%   0.0%
---   ----  -----  -----  -----  -----  -----  -----  -----  -----
avg   0.02   0.6%   0.0%   0.8%  98.6%   0.0%   0.0%   0.0%   0.0%

Memory: 2898688K (1078576K) real, 9436116K (3305252K) virtual, 3714620K free Page# 1/6

CPU TTY     PID USERNAME PRI NI   SIZE    RES STATE    TIME %WCPU  %CPU COMMAND
 0   ?    11015 root     152 20  1314M   480M run      5:55  0.80  0.79 java
 1   ?       39 root     152 20  9632K  9632K run      8:18  0.76  0.76 vxfsd
 3 pts/ta  5673 fism     178 20  7328K  5372K run      0:00  0.38  0.21 top
 0   ?    26606 1001     152 20   147M 14468K run      0:00  0.12  0.12 db2fmp
 0   ?     5656 dasusr1  168 20 12104K  1392K sleep    0:00  0.14  0.11 db2admin
 1   ?     1624 root     152 20 26128K  4044K run      0:10  0.10  0.10 vxsvc
 1   ?     1898 root     152 10  6296K  1008K run      0:00  0.10  0.10 memlogd
 3   ?     1748 root     168 20  7876K   888K sleep    5:03  0.08  0.08 db2fmcd
 0   ?      517 root     152 20  2276K   332K run      1:05  0.08  0.08 syncer
 0   ?    15888 db2inst1 154 20  5849M 14148K sleep    0:03  0.06  0.06 db2agent
 1   ?    15841 db2inst1 152 20   253M 32596K run      1:38  0.06  0.06 db2hmon
 1   ?      647 root     127 20  5132K   500K sleep    0:16  0.05  0.05 netfmt
 0   ?    15859 db2inst1 156 20  5720M 10436K sleep    0:08  0.05  0.04 db2loggr
 0   ?    11061 db2inst1 154 20  5848M 14204K sleep    8:19  0.04  0.04 db2agent
 3   ?        3 root     128 20    32K    32K sleep    1:06  0.04  0.04 statdaemon
 3   ?    29602 1001     152 20   142M  9172K run      0:00  0.04  0.04 db2fmp
 0   ?     1319 root     154 20  2752K   376K sleep    1:55  0.04  0.04 pwgrd
 0   ?     1165 root     154 20  3900K   732K sleep    0:50  0.03  0.03 sendmail:
 1   ?        0 root     127 20    32K     0K sleep    0:12  0.02  0.02 swapper
 2   ?        1 root     168 20   496K   204K sleep    0:28  0.02  0.02 init
 1   ?        2 root     128 20    32K    32K sleep    0:00  0.02  0.02 vhand
 2   ?        4 root     128 20    32K    32K sleep    0:04  0.02  0.02 unhashdaemon
 2   ?       19 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
 3   ?       20 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
 2   ?       21 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
 3   ?       22 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
 0   ?       23 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
 0   ?       24 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
 1   ?       32 root     148 20    32K    32K sleep    0:01  0.02  0.02 lvmdevd
 2   ?       67 root     148 20    32K    32K sleep    0:02  0.02  0.02 lvmdevd
 0   ?       69 root     148 20    32K    32K sleep    0:02  0.02  0.02 lvmdevd
 3   ?      533 root     153 20    32K    32K sleep    0:00  0.02  0.02 dmprestored
   上面的数值应该很明确了,就不用多说了吧.

   方法二:我们也可以通过比较流行的性能测试工具loadRunner进行监控客户端的内存情况:
   具体怎样通过LR工具进行设置就不详述了.要添加的监控指标包括:

   Memory\Available Mbytes;

   Pages/sec、Pages Read/sec和Page Faults/sec;

   Physical Disk


   下面主要说一说通过监控这些指标,来确定内存问题的步骤:
    1.首先查看可用内存(Memory\Available Mbytes)计数器指标。若值较小则可能有内存问题,需进一步分析。
    2.注意Pages/sec、Pages Read/sec和Page Faults/sec计数器的值。 Pages/sec和Page Faults/sec的值持续很高,很可能内存问题,若Pages Read/sec的值超过5,则可判断存在内存问题。
    3.根据Physical Disk计数器的值分析性能瓶颈。如果磁盘的Average Disk Queue Length计数器增加的同时Pages Read/sec并未降低,则可判断内存有问题。

   上面是个人拙见,还请大侠多替宝贵意见!


TAG: 发表个人意见

 

评分:0

我来说两句

Open Toolbar