项目中遇到的性能问题及解决方案

给carrefour作AMS。接手了一个印度人开发的项目,遇到太多坑。

环境:生产服务器两台。

1.首先遇到的是内存爆掉问题:

调查后得出的原因(其实没有找到exactly的原因):内存中存储太多的大对象(数据库没有分页,全是前台分页,有的sql一次性查出2万多条记录),且这些对象各种复制,内存回收不掉。

解决方法:(1.首先是内存调优,原先是8G内存,但是tomcat中配置的有效内存只有2G,后改参数为4G,8G,也没什么鸟用,最后将内存加到24G,最后的最后加到了48G,算是可以坚持的时间多了一点。(2.另外session原先是一个小时过期,后改为15分钟(页面其实存在心跳)感觉也有些效果。(3.服务器在每于凌晨六点重启。(4.观察两台服务器的tomcat控制台,发现两台服务器同时存在的session数量相差巨大,怀疑load balance不起作用,最后经IT协助调查得知现在的load balance是根据ip来分配的,后改为根据每台服务器的session数量来分配,改后有些效果,但两台服务器session数仍有较大差距,现在已开始着手用nginx来做load balance。

2.解决了内存爆掉的问题后,又出现了新的问题:性参奇差,用户load一个关联数据多的单品,花费五六分钟仍不能加载:

调查及解决:

(1.首先同事发现一些循环查询数据库的问题(有三四处这样的写法,其中一处如果数据多的话能消耗60多秒,这三四个sql就能花费两三分钟):且每次查询都花费不少时间,故将这些sql合并为一次查询。然后对于大单品,性能立马提80%,原先四五分钟加载不出来的,现在30-50秒可以加载出来。(2.根据优化sql的这个思路,又在java代码里打timmerlog,找到消耗时间长的java,发现大部分都与数据库查询有关,然后重写了这些sql,(原先的写法是查询出一个对象List<A>,然后循环将List<A>赋值为List<B>,若对象够大,list够长,则这个循环会耗时2秒以上),改了两个这样的sql,遇到大对象时,能提升4-5秒。(3.发现java代码中嵌套循环太多,外层200条,内层20000条,这样一次循环就有400万次,有边续两个循环都差不多,将两个合并为一个,即将800万次减为400万次。也减少了2秒以上。(4.由于本地调试是用的error级别的日志,服务器上是info级别(服务器上原应为error,由于调试被人改掉了吧),导致本人在本地调试时没有发现日志问题,同事在调试时发现在前面的那个循环中在打日志,很可怕,800万次循环,每次都打日志,CPU和IO都严重消耗,所以将java中打日志的地方很多都删掉了,领导删的,我个人觉得将info改为debug就可以了。(5.由于这个项目的重心50%在数据库,用了大量的procedure和package。发现一些procedure和package也非常耗时,然后领导发现数据库中用了大量的for update语句,据说这是数据库行级锁。领导调查对业务没影响,然后经DBA协助,将这些for update全删除了。发现性能有较大提升。(6.着手加redis缓存

3.通过excel上传数据时,如果数据条数超过200条,那么耗费时间相当长,用户受不了。

调查发现多线程根本没起作用,是个摆设,现在只能让用户 每50条上传一次。我没有调查过这个问题,AMS同事这边还没有什么解决办法,好像是给CR团队重做了吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值