12_TUXEDO_典型问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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和其他优化选项