【案例85】读取结果集过大导致系统宕机问题分析

问题现象

客户假期反馈,无多人操作,系统突然宕机,需要排查原因。

问题分析

通过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问题补丁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值