excel导出大数据量时服务器cpu过高解决方式

       最近服务器时不时的会卡死,后来通过日志分析,发现在卡死的时候有进行excel导出的操作,于是kill掉进程重启后自己手动尝试了下,发现导出的数据量超过三万条时cpu的使用率竟然高达600%(服务器8核8G,tomcat原始配置的环境),然后这种状况持续个一分钟左右后tomcat就会卡死。

       问题已经明确了就是导出的问题,后来就上网查各种解决方式,有说大数据量换成csv的,但是为了方便财务的使用,还是坚持了导出excel,根据我们现在的业务量,一周也就将近3万条订单数据,导出excel正常来说应该是完全没有问题的,于是接着找解决方式。

       首先查找cpu过高的原因,通过使用jvisualvm监控工具查看cpu的实时动态,发现在堆内存骤然上升后,发生jvm垃圾回收的时候cpu会陡然上升,稍后会稍微下降,一会儿又会进行垃圾回收,导致cpu再次飙高。通过分析,基本上问题锁定在堆内存高使用量且频繁GC的原因导致的,于是开始对导出代码进行优化,导出excel引入的是poi-3.10的jar包,因为涉及到for循环操作,之前头脑中有个印象就是变量的声明最后是放到循环外,但又不是很确定,就上网查了下,结合http://www.iteye.com/problems/16385和http://blog.csdn.net/virtualman2000/article/details/1138496两篇博文,我个人还是比较认可在循环外进行变量的声明的,因为在循环内声明变量,如果数据量大的话会不断的在stack中分配新的内存,还是会有一定的影响的,所以第一步优化就是把循环内的变量提出到循环体外进行声明;

       第一步的优化相对来说影响是不那么大的,接下来才是重点,对jvm进行优化,通过设置jvm参数:

      JAVA_OPTS="-Xms4096m -Xmx4096m -XX:PermSize=256M -XX:MaxNewSize=1024m"

第二步优化完之后重启tomcat再次进行测试,发现cpu最高也就到200%多,平时的cpu都15%以内,

第二步属于最关键的,接着又对前端导出按钮和导出条数做了相应的限制,对于我们的业务目前限制是只能导出一周以内的数据,按钮点击后置灰不可重复点击,以及导出的最大条数限制到了45000。

       目前的优化就先做了这部分,后期随着业务的变化可能还会进行调整,调整后再和大家分享。

猜你喜欢

转载自sky-xin.iteye.com/blog/2400439