12_TUXEDO_典型问题

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Tuxedo 典型问题

Tuxedo应用内存泄漏(Memory Leak) Tuxedo应用核心转储(Core Dump) Tuxedo应用阻塞

Tuxedo应用挂起

Tuxedo优化策略

Tuxedo应用内存泄漏(Memory Leak)✓问题现象

✓原因分析

✓解决方法

Tuxedo应用核心转储(Core Dump) Tuxedo应用阻塞

Tuxedo应用挂起

Tuxedo优化策略

问题现象

•从整个系统的角度看,存在内存泄漏会造成系统的空闲内存不断减小,极端情况下有可能造成操作系统运行缓慢或宕机

•从进程角度来看,存在内存泄漏的进程,它的进程空间会不断增加(通过”ps –elf”、AIX的”svmon”查看进程)

原因分析

•内存泄漏是指程序对于一块动态申请的内存失去了参照指针,造成内存块无法释放的现象

•内存泄漏是由于在程序中调用malloc或者类似功能函数申请内存,却没有在程序中调用free或者类似功能函数释放引起的

原因分析

•应用代码

从经验来看,这是内存泄漏问题经常出现的地方。包括的形式:–忽略对申请的内存释放。比如在代码开始时申请了一块空间,但是在程序结束时却忽略了去释放此块内存。

–指针使用不当。在做指针赋值时,没有释放已有的内存空间,就将它指向另一个内存空间。

–数据库游标的使用不当。在程序中,如果使用了数据库的游

标,需要在程序返回时,将游标关闭。

–采用C++编程时,没有正确的调用析构函数

原因分析

•数据库

在客户的项目中,出现过数据库提供的函数存在内存泄漏,如:–Oracle的OCI链接库

–Sybase的Open Client的链接库

•Tuxedo

–C++编写服务端service时,tpreturn跳出析构函数的执行

–tpalloc和tprealloc内存的释放不正确

•操作系统

–C的lib库存在内存泄漏问题

解决方法

•检查应用代码。

–检查内存的申请和释放是否匹配

–检查指针在赋值时,是否释放已有内存空间

–检查游标的打开和关闭是否匹配

–检查析构函数是否被调用

•采用隔离的方法分析代码

–对于存在内存泄漏的代码可以采用将代码分段隔离的方法来查找

•采用相应的工具软件分析代码

–现在有很多的查找内存泄漏的工具。如dbx、Rational的

Purify等

•将数据库、中间件和操作系统地相应补丁及时更新

解决方法

•观察是否存在内存泄漏

–通过系统工具top查看系统的可用内存是否持续减少

–通过系统工具ps –elf查看进程的内存空间是否超常,如超过100M

•查找内存泄漏的进程

–在一段时间内,定期收集系统中进程的内存状况;

–将收集的结果在Excel中对比,找到哪个进程不断地增长

解决方法

•确认进程内存泄漏

–在Solaris下

用pmap监控内存不断增长的进程。如果[heap]的大小不断增加,说明这个进程有内存泄漏。

–在AIX下

用svmon监控内存不断增长的进程。注意[private]的大小

Solaris的pmap的输出

$ pmap 2345

102905: test

00010000 192K r-x--/usr/bin/ksh

00040000 8K rwx--/usr/bin/ksh

00042000 40K rwx--[ heap ]

FF180000 664K r-x--/usr/lib/libc.so.1 FF236000 24K rwx--/usr/lib/libc.so.1 FF23C000 8K rwx--/usr/lib/libc.so.1

FF250000 8K rwx--[ anon ]

……..

FFBFC000 16K rw---[ stack ]

total 1880K

AIX的svmon的输出

# svmon -P 19556

Pid Command Inuse Pin Pgspace

19556 pacman 3085 1 1580

Pid: 19556

Command: pacman

Segid Type Description Inuse Pin Pgspace Address Range 9c8 pers /dev/hd2:53289 1 0 0 0..0

aaf work lib data 12 0 6 0..1081

909 work shared library text 1502 0 7 0..65535

1eba work private 1568 1 1567 0..1562:65313..65535 16f3 pers code,/dev/lv01:12302 2 0 0 0..1

解决方法

•调试内存泄漏---隔离法

这是最原始的方法,但是比较容易入手。在隔离时应该:–将程序代码逐步减少,缩小问题的范围

–在隔离时,不要替换代码

–在隔离时,注意代码的完整

解决方法

•调试内存泄漏---dbx

在Solaris下,用dbx可以对内存泄漏的运行程序进行调试

–调试步骤

%export LD_PRLOAD=/opt/SUNWspro/lib/librtc.so

%dbx –c filename //对程序进行调试

(dbx) check –access //打开内存访问调试检查标志

(dbx) check –memuse //打开内存使用和内存泄漏检查标志(dbx) run //运行程序

(dbx) cont //继续运行程序,将给出内存报告注意:在编译代码时,用-g选项,不要用-O和其他优化选项

相关文档
最新文档