基于某项目因OOM宕机的问题分析排查及解决--EXCEL导入
背景
该项目自2021年6月23日下午15:40起突然内存告警,后迅速宕机。基于系统自愈机制,先后拉起4次均宕机。后续扩容内存后发现内存实际占用超过合理值,影响用户部分业务,后协调跟进分析。


现象
内存占用快速走高,且会持续占满分配的堆内存空间,导致FULL GC,但因资源不足引起系统挂起。
起初的异常是OOM
后面扩容内存后,不再触发OOM,但是异常发生时内存占用直接跑满
监控NMC发现有疑似导入类操作,同步生成系统DUMP分析,并引导项目暂停HR数据导入类操作。
与项目协调沟通后确认的确部分业务在做工资导入,但现场顾问使用客户导入文件进行了实操未复现问题。故继续跟进DUMP分析。
分析dump发现,有1个线程占用了94%的内存,应该是导致系统宕机的线程
逐级展开问题线程后发现,存在大量的
org.apache.xmlbeans.impl.store.Xobj$AttrXobj
org.apache.xmlbeans.impl.store.Xobj$ElementXobj
线程,根据查询到的类似方法功能,为excel导入时的操作,且大概率为操作poi
参考网络上的经验,很可能是是在处理表格空行时引发的问题。类似其他问题场景涉及代码如下:
据经验,上述代码的本意是将excel中的所有空行过滤掉,对于一个正常的excel是没有任何问题,但是如果是excel文件中存在大量空行,就可能会出现问题。
根据这一线索,再次与项目组沟通确认,要求提供对方导入的文件及让用户自行操作配合复现后发现,在某一用户做工资导入计算时触发问题。获取其导入的文件后发现:该文件本为处理147个人的工资信息,但实际文件体积41.5MB,包含excel行数1048576行(为excel支持的最大行)。即excel中存在海量的空行。
源文件:
修改后:
基于上述问题引导用户修正文件后,文件体积回归到111KB,导入顺利完成。至于此前反馈导入无误,经顾问确认,该用户的导入文件有2个,提供给顾问验证的是一个历史版本的小文件。
解决该问题后,经过24小时的用户全业务常态运行监控,系统整体负载等保持正常水平,用户业务恢复正常,可以确认本次系统异常的诱因为异常的文档导入导致。
小结:在文件导入场景,业务侧从设计角度,考虑到正常的业务场景,不会出现类似海量数据。故没有过多的限制用户的导入文件大小行数等。故而在遇到这种异常数据内容的文件时,引发类似问题。 从业务使用场景建议用户注意查看文件大小和内容的合理性,同时产品侧要增加类似场景的兼容性,避免某个问题影响整个系统使用。
没有找到相关结果
0 个回复