问题现象
客户假期反馈,无多人操作,系统突然宕机,需要排查原因。
问题分析
通过IBM的宕机分析工具分析宕机日志,发现相关占用内存多的都为PfxxLog,日志交换平台相关。
为了印证猜想,单独操作相关业务【打开节点-交换平台日志】,在NMC中能看到内存明显飙升。
查看了线程监控发现,耗时在中间件层面,并且只是简单的从某个表中查询某个字段出来,需要查询3600w的结果。结果集巨大。
详细信息(人员信息和IP等相关信息已加密,体会方法即可)
<record>
<callid>1734773361674-1834</callid>
<服务>server</服务>
<线程名称>ajp-bio-XXX-exec-1</线程名称>
<业务动作>打开节点-交换平台日志</业务动作>
<线程状态>RUNNABLE</线程状态>
<当前事件>Serialize Object</当前事件>
<远程调用方法>nc.itf.pfxx.xlog.IXLogService.queryXlogPks</远程调用方法>
<耗时>487670</耗时>
<mwcosttime>145194</mwcosttime>
<sqlnum>1</sqlnum>
<sqlcosttime>0</sqlcosttime>
<readresulttime>342476</readresulttime>
<readrownum>36212588</readrownum>
<readfromclienttime>0</readfromclienttime>
<writetoclienttime>0</writetoclienttime>
<writetoclientbytes>0</writetoclientbytes>
<readfromclientbytes>357</readfromclientbytes>
<notclosedconnectioncount>0</notclosedconnectioncount>
<cc>1</cc>
<cmc>0</cmc>
<totalconn>1</totalconn>
<客户端地址>XXX:XXX</客户端地址>
<操作员>XXX</操作员>
<调试模式>是</调试模式>
<操作员编码>n/a</操作员编码>
<操作员姓名>n/a</操作员姓名>
</record>
堆栈信息
##相关信息已加密为XXX
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1171)
java.io.ObjectOutputStream.writeArray(ObjectOutputStream.java:1416)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1202)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:368)
nc.bs.xxx.comn.Result.xxx(Result.java:53)
java.io.ObjectOutputStream.writeExternalData(ObjectOutputStream.java:1497)
java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1468)
java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1206)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:368)
nc.bs.framework.comn.NetObjectOutputStream.writeObjectOverride(NetObjectOutputStream.java:273)
java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:364)
nc.bs.xxx.rmi.server.xxx.serilaizeObject(RMIHandlerImpl.java:447)
nc.bs.xxx.rmi.server.xxx.writeResult(RMIHandlerImpl.java:369)
nc.bs.xxx.rmi.server.xxx.doHandle(RMIHandlerImpl.java:212)
nc.bs.xxx.rmi.server.xxx.handle(RMIHandlerImpl.java:99)
nc.bs.xxx.comn.serv.CommonServletDispatcher.doPost(CommonServletDispatcher.java:45)
... ...
javax.security.auth.Subject.doAsPrivileged(Subject.java:726)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:309)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:169)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:299)
... ...
java.security.AccessController.doPrivileged(AccessController.java:452)
javax.security.auth.Subject.doAsPrivileged(Subject.java:726)
org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:309)
org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:249)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
... ...
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1157)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:627)
java.lang.Thread.run(Thread.java:809)
经过沟通发现客户有大量的外部系统在传数据到NC系统中,所以是产生了大量的日志记录。
解决方案
1、可以删除XX_XLOG表下面的数据,此表数据仅为日志记录,删除数据后不影响业务。如果数据量过大可以是用 TRUNCATE TABLE XX_XLOG。
2、可以让研发出具相关补丁,限制读取结果集的大小,降低内存消耗。如:交换平台日志超30W问题补丁。