EASCloud实例Java进程CPU持续高消耗问题分析金蝶中国大企业技术支持部林珊珊2①课程收益了解EASCloud实例Java进程CPU持续高消耗问题的原因学习掌握分析此类问题的工具和方法3①EASCloud实例Java进程CPU持续高消耗问题分析问题现象:应用服务器实例Java进程CPU持续高消耗4①EASCloud实例Java进程CPU持续高消耗问题分析资源不足通过检测CPU资源情况和系统并发用户情况进行评估。线程异常(复杂计算、死循环、线程死锁、线程阻塞等)通过收集服务器线程堆栈信息来分析定位。jvm内存紧张通常jvm内存参数设置过低、GC参数设置不当或者应用存在内存泄漏,可能引发频繁FUllGC,会出现实例CPU持续高消耗的情况。需要通过收集实例的gc日志和dump日志进行分析定位。可能原因:5①EASCloud实例Java进程CPU持续高消耗问题分析思路执行top命令,31037进程消耗cpu最高根据进程号在管理控制台定位到具体实例检查应用服务器CPU资源情况,评估资源配置合理性收集对应实例的线程堆栈、GC日志、手工生成宕机日志等进行问题定位6①PART1:资源不足7①CPU资源查看检查项建议Linux检查命令AIX检查命令HP-UX检查命令windows检查CPU利用率间隔5秒收集一次,收集2小时共1440次vmstat51440top查看顶级活动vmstat51440topas查看顶级活动vmstat51440top查看顶级活动任务管理器--性能--资源监视器8①CPU资源查看9①CPU资源建议通常1个EASCloud实例按1~1.5核CPU、3~6G内存规划,而实例个数取决于用户并发量。当然,还需要预留一定资源给到操作系统,举例如下:应用服务器配置EASCloud群集配置8核CPU、64G内存部署EASCloud群集,最大6个EASCloud实例(JAVA_HEAP_SIZE=4096M)通常4个实例可以满足应用详细配置推荐可参考每个版本对应的《金蝶EASCloud系统部署方案》。EASCloud常见版本的安装部署资料(包括系统管理员手册、发版说明、部署方案等)可参考链接:https://club.kingdee.com/forum.php?mod=viewthread&tid=1500698&page=1&extra=#pid420973910①PART2:线程异常11①线程堆栈分析工具线程堆栈记录操作过程中客户端与应用服务器、应用服务器与数据库服务器之间的线程信息。常用线程堆栈分析工具如下1、threaddump.jsp2、dump.jsp和kill-3命令(ibmjdk)3、jstack命令(oraclejdk)4、Linux命令查看5、jconsole工具6、jvisualvm工具7、Arthas工具如何确认当前使用的是什么jdkeas\server\bin\set-server-env.sh(.bat)JAVA_HOME参数Linux命令查ps–ef|grepjava|grepserver1|more12①线程堆栈分析工具IbmjdkOraclejdk1.5Oraclejdk1.6和1.7Oraclejdk1.8windowsThreaddump.jspjconsole工具dump.jspKill-3进程号Threaddump.jspjconsole工具Jstack命令Threaddump.jspjconsole工具Jstack命令jvisualvm工具Arthas工具Threaddump.jspjconsole工具Jstack命令Arthas工具LinuxThreaddump.jspjconsole工具dump.jspKill-3进程号Linux命令查看Threaddump.jspjconsole工具Jstack命令Linux命令查看Threaddump.jspjconsole工具Jstack命令Linux命令查看jvisualvm工具Arthas工具Threaddump.jspjconsole工具Jstack命令Linux命令查看Arthas工具13①服务端线程堆栈收集方法—threaddump.jsp•Threaddump.jsp(查看单个实例):http://serverIP:http端口号/easportal/tools/threaddump.jsp日志需手动保存为网页html格式需选择allthread、livingrpcthread、livinghttpthread分别保存需间隔一定时间(比如30秒),多次保存,保存3份•Threaddump_mi.jsp(查看所有实例):http://serverIP:http端口号/easportal/tools/threaddump_mi.jsp日志需手动保存为网页html格式需选择allthread、livingrpcthread、livinghttpthread分别保存需间隔一定时间(比如30秒),多次保存,保存3份14①服务端线程堆栈分析—threaddump.jsp15①服务端线程堆栈分析—threaddump.jsp16①服务端线程堆栈分析-线程阻塞案例script端口开放受攻击导致线程阻塞引发实例cpu高:PT117590(适用于8.0版本),PT117592(适用于8.1版本),PT117591(适用于8.2版本)17①服务端线程堆栈收集方法—dump.jsp和kill-3命令(ibmjdk)Ibmjdk:http://IP:httpPort/easportal/tools/dump.jsp?type=javadump日志生成在..\server\profiles\server*\bin\目录下,命名为javacore打头Kill-3进程号(其中进程号需设置为实际CPU高的Java进程的进程号,Linux和Unix适用)举例:Kill-317418会生成一个javacore打头的文件18①服务端线程堆栈收集方法—jstack命令(oraclejdk)Oraclejdk:cd进入到jdk/bin目录下执行./jstack进程号>javacore.txt日志生成在jdk/bin目录下若执行出现如下提示,则需要添加参数-F举例:cd/kingdee/eas/oracle-jdk1.7/bin./jstack-F31230>javacore31230.txt此时在/kingdee/eas/oracle-jdk1.7/bin下会产生一个文件javacore31230.txt19①服务端线程堆栈分析-jstack收集的线程死锁案例20①Javacore日志分析工具—jca工具线程堆栈分析工具:jca下载地址:ftp://ftpdev.kingdee.com/工具/分析工具/线程堆栈分析工具/jca.rar21①Javacore日志分析工具—jca工具22①Javacore日志分析工具—jca工具23①Javacore日志分析工具—jca工具24①Javacore日志分析工具—jca工具25①Javacore日志分析工具—jca工具RPC-182线程,用户监控中要updateLastOperate更新信息,已锁定forcedLog去写日志,此时正在等待获取session信息;而与此同时,RPC-185线程正在removeSession,需要等待锁定forcedLog去写日志,因此两个线程就发生死锁。引擎补丁PT120468已修复此bug。26①服务端线程堆栈收集方法—Linux命令查看干货学堂|EAS应用服务器进程占用CPU高排查分析大法:https://mp.weixin.qq.com/s/D70BBE97mZ8YTGlwNPVHOg1、根据top命令,发现PID为28555的Java进程占用CPU高达200%2、执行ps-mp28555-oTHREAD,tid,time找到耗CPU最大的线程号28802(PID为进程号,THREAD为线程,tid为线程号,time为线程所使用总时间)3、执行printf"%x\n"28802转换线程号为16进制格式,转换结果为70824、执行jstack28555|grep7082-A60>thread.txt可打印出耗用cpu最高的线程信息到thread.txt文档中。(若是ibmjdk则无法使用jstack命令,需结合javacore.txt文件进行分析)27①服务端线程堆栈收集方法—Linux命令查看28①服务端线程堆栈收集方法—Linux命令查看29①服务端线程堆栈收集方法—Linux命令查看30①服务端线程堆栈收集方法—jconsole工具31①服务端线程堆栈收集方法—jconsole工具32①服务端线程堆栈收集方法—jconsole工具33①服务端线程堆栈收集方法—jconsole工具34①服务端线程堆栈收集方法—jconsole工具35①服务端线程堆栈收集方法—jvisualvm工具在eas\oracle-jdk1.7\bin下运行jvisualvm.exe启动Linux下是运行./jvisualvm启动选择CPU高的Java进程36①服务端线程堆栈收集方法—jvisualvm工具37①服务端线程堆栈收集方法—jvisualvm工具38①服务端线程堆栈收集方法—jvisualvm工具39①服务端线程堆栈收集方法—jvisualvm工具40①服务端线程堆栈收集方法—jvisualvm工具41①服务端线程堆栈收集方法—Arthas工具Arthas工具使用方法:1、下载arthas工具,arthas工具下载地址:http://note.youdao.com/noteshare?id=5e1d2457e9e81b11df3a24a624bf2da4完整包放在:ftp://ftpdev.kingdee.com/工具/分析工具/线程堆栈分析工具/arthas-packaging-3.4.6-bin.zip2、执行cparthas-boot.jar/kingdee/eas/eas/oracle-jdk1.8/bin/把包放入到jdk的bin目录下(支持1.7及以上oraclejdk)3、cd进入到jdk的bin目录下,执行./java-jararthas-boot.jar启动脚本(能联网环境首次启动会自动安装依赖包,无法联网的环境,需要放入上述完整包arthas-packaging-3.4.6-bin.zip放哪个目录没限制,比如放/home下,则执行命令为./java-jar/home/arthas-boot.jar)4、选择要监控的进程对应的数字(1,2,3等,在进程号前面的数字),使用完毕或要切换实例监控,需要先执行stop命令退出当前监控,再启动新的监控42①服务端线程堆栈收集方法—Arthas工具43①服务端线程堆栈收集方法—Arthas工具44①服务端线程堆栈收集方法—Arthas工具45①服务端线程堆栈收集方法—Arthas工具thread:查看线程名、线程对应的CPU占比、线程持续时间46①服务端线程堆栈收集方法—Arthas工具thread-n5:查看前5个占CPU高的线程完整信息47①服务端线程堆栈收集方法—Arthas工具dashboard:查看实时整体数据,按ctrl+c退出48①服务端线程堆栈收集方法—Arthas工具stop:退出当前实例监控如需继续监控其它实例,需要再重新执行./java-jararthas-boot.jar启动更多命令参考:https://blog.csdn.net/u013735734/article/details/10293030749①空闲线程50①空闲线程51①空闲线程52①常驻线程使用threaddump.jsp方式收集时,以下线程是jsp本身消耗的线程,会一直存在53①线程异常导致CPU持续高消耗案例分析一大量线程都在等待创建临时表(createTempTable)54①线程异常导致CPU持续高消耗案例分析一收集javacore信息,若存在线程阻塞或死锁现象,则分析对应代码检查数据库,若发现存在有阻塞或死锁现象,则分析对应sql若都不存在,且数据库是sqlserver数据库,则设置实例下\eas\server\profiles\server1~n\config\bosconfig.xml文件
重启实例生效55①java.util.zip.GZIPOutputStream相关线程CPU消耗高ps–mp31769–OTHREAD,tid,time命令查看线程异常导致CPU持续高消耗案例分析二56①java.util.zip.GZIPOutputStream相关线程CPU消耗高---需更新apusic.jar线程异常导致CPU持续高消耗案例分析二57①线程异常导致CPU持续高消耗案例分析三58①线程异常导致CPU持续高消耗案例分析三触发hashmap破坏导致实例CPU持续高消耗(800、820和850都已在bos运行引擎模块补丁中修复过,建议打上最新补丁即可)1、com.kingdee.bos.Context.get触发hashmap破坏2、com.kingdee.bos.sql.shell.KDStatement.executeQuery触发hashmap破坏3、com.kingdee.bos.Context.toString(Context.java:424(CompiledCode))多语言上下文加载StringBuilder调用abstractmap.toString触发hashmap破坏4、com.kingdee.bos.dao.xml.impl.MetaDataPK2触发hashmap破坏打印与套打触发hashmap破坏com.kingdee.bos.ctrl.reportone.kdrs.engine.server.ServerSideSessionManager800:PT158563820:PT15999459①PART3:JVM内存紧张60①如何判断JVM内存是否紧张GC日志:记录每次GC触发的原因和时间、GC类型、GC前后的不同内存区域的大小、每次GC耗时等内容,可反映内存的总体使用情况。GC日志打开开关GC日志生成路径修改文件:..\server\profiles\server(N)\bin\set-server-env.bat(sh)默认是开启状态SETJVM_VERBOSE_GC=true..\server\profiles\server(N)\logs\jvm_gc_*Gc日志是以实例启动时间进行命名,查看当前Gc情况需以日志修改日期为准。注意:Gc日志是以实例启动时间进行命名查看当前Gc情况需以日志修改日期为准61①Ibmjdk分析工具:ga下载地址:ftp://ftpdev.kingdee.com/工具/分析工具/gc日志分析工具/ga.rarOracle(hp)jdk分析工具:Hpjmeter下载地址:ftp://ftpdev.kingdee.com/工具/分析工具/gc日志分析工具/hpjmeter.rarOracle(hp)jdk分析工具:GC_Viewer下载地址:ftp://ftpdev.kingdee.com/工具/分析工具/gc日志分析工具/GC_Viewer.7zGceasy访问网址:https://gceasy.io/GC日志分析工具62①JVM内存溢出需要宕机日志进行定位java内存溢出:指程序运行要用到的内存大于虚拟机能提供的最大内存内存溢出类型java.lang.OutOfMemoryError:PermGenspace(非堆内存溢出)加载的class太多MaxPermSize设置过小java.lang.OutOfMemoryError:Javaheapspace(堆内存溢出)内存泄露,GC无法回收内存(程序问题)一次性申请大量内存(业务逻辑、程序问题)最大堆内存(Xmx)设置过小宕机日志:记录宕机时刻的实例对应java进程的内存使用情况,包含各业务功能调用到的类或方法占用内存的大小等内容,可反映内存的明细使用情况。63①IBMjdk手动产生宕机日志格式:core*.dmp存放路径:..\server\profiles\server#\bincore*.dmp日志:执行kill-6
其中为实例java进程号,可从应用服务器页签获取。AIX系统下需要做如下压缩处理:进入到$JAVA_HOME/jre/bin目录,执行./jextract$EAS_HOME/eas/server/profiles/server*/bin/core*.dmp命令等待处理,并会产生一个core*.zip文件。其中$JAVA_HOME替换成JDK实际路径,$EAS_HOME替换成eas实际路径,可查看eas/server/bin/set-server-env.sh中JAVA_HOME和EAS_HOME变量。OOM宕机日志手动收集方法(IBMjdk)64①Oraclejdk手动产生宕机日志格式:heap*.bin存放路径:oraclejdk的bin目录下Windows系统:jmap–dump:format=b,file=Linux系统:jmap–heap:format=b需先进入oraclejdk的bin目录下再执行上述命令,其中为实例进程号,可在管理控制台应用服务器页签获取,是即将产生的日志文件命名。OOM宕机日志手动收集方法(Oraclejdk)1.7版本jdk需添加-F参数,举例如下:./jmap-F-dump:live,format=b,file=heap.hprof6769765①OOM宕机日志手动收集方法(Oraclejdk)eas\oracle-jdk*\bin\jvisualvm.exeOraclejdk使用jvisualvm工具手动生成宕机日志66①OOM宕机日志分析工具—MAT工具MAT工具介绍:MAT(MemoryAnalyzerTool)工具是eclipse的一个插件,也可以单独使用;该工具可直观看到各个对象在堆空间中所占用的内存大小、类实例数量、对象引用关系,能够快速生成内存泄露报表,方便定位和分析问题。分析的对象为heapdump*,javaheap*,core*等类型的宕机日志文件。工具下载地址:http://pan.baidu.com/s/1kUPmo2V密码:edruMAT工具使用方法(视频):https://vip.kingdee.com/school/7496应用服务器实例宕机分析方法(视频):https://vip.kingdee.com/school/liveCourse/67767①实例Java进程CPU持续高消耗案例宕机日志显示3万多个ScheduledFutureTask类相关的对象,每个都跟ehcache相关68①解决方法:820版本的ehcache缓存框架bug导致,已在补丁PT117591中解决。实例Java进程CPU持续高消耗案例69①Ehcache外部缓存的Java进程CPU持续高消耗案例70①Ehcache外部缓存的Java进程CPU持续高消耗案例查看ehcache外部缓存日志eas\server\ehcache\logs发现存在OOM报错java.lang.OutOfMemoryError:Javaheapspace71①Ehcache外部缓存的Java进程CPU持续高消耗案例V850版本先安装管理控制台补丁PT150369再安装依赖补丁PTM155096最后安装bos_rtePT157884、bos_basPT155622和bos_publicPT157033V860版本先安装管理控制台补丁PT157000再安装bos_rtePT155593和bos_publicPT155594V861版本安装补丁PTM158682Thanksterimakasih感謝谢谢ありがとうขอบคุณ