Tuxedo典型问题

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

注意:在编译代码时,用-g选项,不要用-O和其他优化选项
©2004 BEA Customer Support
第 13 页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
调试内存泄露---dbx
• 理解内存泄露报告 location:泄露的内存块在那里申请的 addr:泄露的内存块的地址 size: 泄露的内存块的大小 stack:调用堆栈的位置 • 能够监测的内存泄露错误 mel(Memory Leak),air(Adress in Register),aib(Address in Block)
在操作系统中会产生Core文件 前提是操作系统对Core 文件大小无限制(用ulimit –a查看)
©2004 BEA Customer Support
第 19 页
Tuxedo®应用核心转储( Core Dump )
原因分析
Tuxedo应用核心转储是由于进程内存访问越界造成的。
▪ 内存访问越界是指在对数组或者是指针操作时,访问的地址超
©2004 BEA Customer Support
第 9页
Tuxedo®应用内存泄露(Memory Leak)
Solaris的pmap的输出
$ pmap 2345 102905: 00010000 00040000 00042000 FF180000 FF236000 FF23C000 FF250000 …….. FF3B0000 FF3C0000 FF3F6000 FFBFC000 total 8K rwx-[ anon ] 152K r-x-- /usr/lib/ld.so.1 8K rwx-- /usr/lib/ld.so.1 16K rw--[ stack ] test 192K r-x-- /usr/bin/ksh 8K rwx-- /usr/bin/ksh 40K rwx-[ heap ] 664K r-x-- /usr/lib/libc.so.1 24K rwx-- /usr/lib/libc.so.1 8K rwx-- /usr/lib/libc.so.1 8K rwx-[ anon ]
BEA Tuxedo 典型问题
®
BEA 客户服务部
BEA Tuxedo 典型问题
Tuxedo®应用内存泄露 ( Memory Leak ) Tuxedo®应用核心转储 ( Core Dump ) Tuxedo®应用阻塞 Tuxedo®应用挂起
®
©2004 BEA Customer Support
第 2页
采用相应的工具软件分析代码
▪ 现在有很多的查找内存泄露的工具。如dbx、Rational的Purify等
将数据库、中间件和操作系统地相应补丁及时更新
©2004 BEA Customer Support
第 7页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
是否存在内存泄露
▪ 通过系统工具top查看系统的可用内存是否持续减少 ▪ 通过系统工具ps –elf查看进程的内存空间是否超常,如超过100M
第 3页
Tuxedo®应用内存泄露(Memory Leak)
原因分析
内存泄露是指程序对于一块动态申请的内存失去了参照指针,造成内 存块无法释放的现象
内存泄露是由于在程序中调用malloc或者类似功能的函数申请内存, 却没有在程序中调用free或者类似功能的函数释放内存引起的
©2004 BEA Customer Support
在AIX下,可以用errpt –a来做查看进程堆栈
©2004 BEA Customer Support
第 21 页
Tuxedo®应用核心转储( Core Dump )
解决方案
检查系统对于Core文件的设置
检查系统和用户对Core文件的限制
ulimit -c
对于Solaris,在文件 /etc/system中,检查 core dump 大小的设置,
在Windows上,带上“/Zi /Od”选项编译程序
buildserver –f “/Zi /Od” –f simpserv.c –o simpserv –s TOUPPER 最终调用CL
编译时设置“-k”选项,保留Tuxedo应用的main()函数
buildserver –k –f “-g” –f simpserv.c –o simpserv –s TOUPPER
©2004 BEA Customer Support
第 14 页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
调试内存泄露---Rational Purify
▪ 自动化的测试工具 ▪ 可以测试C/C++, VB, Java等语言开发的程序 ▪ 可作无源码调试
©2004 BEA Customer Support
Tuxedo®应用内存泄露(Memory Leak)
问题现象
从整个系统的角度看,存在内存泄露会造成系统的空闲内存不断减小, 最终将造成系统宕机;
从进程角度来看,存在内存泄露的进程,它的进程空间会不断增加 (通过”ps –elf”、AIX的”svmon”查看进程)
©2004 BEA Customer Support
▪ 调试步骤 %export LD_PRLOAD=/opt/SUNWspro/lib/librtc.so %dbx –c filename (dbx) check –access (dbx) check –memuse (dbx) run (dbx) cont //对程序进行调试 //打开内存访问调试检查标志 //打开内存使用和内存泄露检查标志 //运行程序 //继续运行程序,将给出内存报告
set sys:coredumpsize=0
对于Linux, core dumps 缺省时被取消的, 检查 /etc/security/limits.conf文件 对于HPUX, 检查用户进程的数据段的大小, set maxdsiz 为 134M 检查系统对于用户的磁盘空间的限制
测试是否能够产生core文件:gcore pid
1880K
第 10 页
©2004 BEA Customer Support
Tuxedo®应用内存泄露(Memory Leak)
AIX的svmon的输出
# svmon -P 19556 Pid 19556 Pid: 19556 Command: pacman Segid Type Description 9c8 pers /dev/hd2:53289 aaf work lib data 909 work shared library text 1eba work private Inuse 1 12 1502 2 Pin Pgspace Address Range 0 0 0 0 6 7 0 0..0 0..1081 0..65535 0 0..1 Command pacman Inuse 3085 Pin 1 Pgspace 1580
©2004 BEA Customer Support
第 16 页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
调试内存泄露---Rational Purify
©2004 BEA Customer Support
第 17 页
Hale Waihona Puke Baidu BEA Tuxedo 典型问题
Tuxedo®应用内存泄露 ( Memory Leak ) Tuxedo®应用核心转储 ( Core Dump ) Tuxedo®应用阻塞 Tuxedo®应用挂起
®
©2004 BEA Customer Support
第 18 页
Tuxedo®应用核心转储( Core Dump )
问题现象
在Tuxedo的ULOG中会有如下的信息:
LIBTUX_CAT:541: WARN: Server GROUP_XX/30001 terminated LIBTUX_CAT:557: INFO: Server GROUP_XX/30001 being restarted
▪ 将程序代码逐步减少,缩小问题的范围; ▪ 在隔离时,不要替换代码; ▪ 在隔离时,注意代码的完整;
©2004 BEA Customer Support
第 12 页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
调试内存泄露---dbx 在Solaris下,用dbx可以对内存泄露的运行程序进行调试
©2004 BEA Customer Support
第 22 页
Tuxedo®应用核心转储( Core Dump )
调试方法
编译阶段
在UNIX上,带上“-g”选项编译程序
buildserver –f “-g” –f simpserv.c –o simpserv –s TOUPPER 最终调用CC 可以设置CFLAGS变量
©2004 BEA Customer Support
第 5页
Tuxedo®应用内存泄露(Memory Leak)
原因分析
数据库 在客户的项目中,出现过数据库提供的函数存在内存泄露,如: Oracle的OCI连接库 Sybase的Open Client的连接库 Tuxedo 操作系统
©2004 BEA Customer Support
第 4页
Tuxedo®应用内存泄露(Memory Leak)
原因分析
应用代码 从经验来看,这是内存泄露问题的主要原因。包括的形式:
▪ 忽略对申请的内作释放。比如在代码开始时申请了一块空间,但是在程序借 宿时却忽略了去释放此块内存; ▪ 指针使用不当。在做指针赋值时,没有释放已有的内存空间,就将它指向另 一个内存空间; ▪ 数据库游标的使用不当。在程序中,如果使用了数据库的游标,需要在程序 返回时,将游标关闭; ▪ 在采用C++编程时,没有正确的调用析构函数
出了分配的数据段。造成这种问题的主要函数如strcpy, sprintf,memcpy,strcat等等;
▪ 操作未初始化的空间,比如指针变量没有初始化,就对指针赋

▪ 内存访问越界的结果会造成应用进程异常中止,并在进程的执
行目录产生core文件。
©2004 BEA Customer Support
第 6页
Tuxedo®应用内存泄露(Memory Leak)
解决方案
检查应用代码。
▪ 检查内存的申请和释放是否匹配 ▪ 检查指针在赋值时,是否释放已有内存空间; ▪ 检查游标的打开和关闭是否匹配 ▪ 检查析构函数是否被调用
采用隔离的方法分析代码
▪ 对于存在内存泄露的代码可以采用将代码分段隔离的方法来查找
第 15 页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
调试内存泄露---Rational Purify
设置参数 Settings->Default setting->Error and Leaks, 选择memory leaks 和memory in use选项 ▪ 调试步骤
• 选择调试的程序 • 运行程序,产生结果数据 • 通过结果数据,找到源代码
查找内存泄露的进程
▪ 在一段时间内,定期收集系统中进程的内存状况; ▪ 将收集的结果在Excel中对比,找到那个进程在增长
©2004 BEA Customer Support
第 8页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
确认进程内存泄露
▪ 在Solaris下 用pmap监控内存不断增长的进程。如果[heap]的大小不断增加,说明这个 进程有内存泄露。 ▪ 在AIX下 用svmon监控内存不断增长的进程。注意[private]的大小
1568 1
1567 0..1562:65313..65535
16f3 pers code,/dev/lv01:12302
©2004 BEA Customer Support
第 11 页
Tuxedo®应用内存泄露(Memory Leak)
解决办法
调试内存泄露---隔离法 这是最原始的方法,但是比较容易入手。在隔离时应该:
第 20 页
Tuxedo®应用核心转储( Core Dump )
解决方案
缓解问题
可以在UBB中配置Restart来暂时缓解 S1 GRACE=3600 RESTART=Y MAXGEN=10
解决问题
用调试工具如dbx或者dbxtra调试core文件 file core dbx file_name core trace #找到产生core的文件 #产生堆栈信息 #列出Core的时候的堆栈状况
相关文档
最新文档