zoukankan      html  css  js  c++  java
  • 记录一下我的性能优化过程

     09年的时候给当时公司上供应链系统,公司在全国各地大概有180个门店,加上总部操作的人数,一般在线的都有300-400人,每天的单据量相对来说还是比较大(当然不能和电信比了),实施完成后,将该客户在旧系统中
    前两年的销售数据一起纳入到新系统里面.
         公司应用的情况是:门店做销售,总部10多人做一些正常的单据(采购,调货),绝大多数的人是在做分析,监控.所以,客户对报表的要求非常高,除了数据准确之外,还要求实时,还有一点就是:它们的报表都是
    很复杂的,执行时间比较长,很耗资源,数据导入到excel里面,经常是超过了excel的最大行数65535,最大列数256.
         系统的情况是:J2EE架构,B/S结构,JDK6.0,使用开源的tomcat,做为Web服务器.有一点说明一下,tomcat在32位的系统里,最大内存只能是1.5G.
        刚开始的时候,系统试用了15天左右,我们使用了一台服务器,数据库服务器和web服务器都在同一个机器.发现tomcat常常死掉,原因是out of memory,刚开始还以为是,代码哪儿写的不严谨,容易有内存泄露.经仔细
    检查后,发现这种情况基本不可能,排除到这个以后,我基本可以肯定问题是出在报表里面,因为报表中心是我们自已开发的,所以从哪儿着手还是比较方便,我们先分析每次报表查询后,产生的报表数据,将这些报表数据写成临时文件,真的应了一句话,不看不知道,一看吓一跳。有的报表数据有200多M,只需要不到10个人,如果查这个报表的话,系统就要die掉.(超过了1.5G),没办法,只能进行优化了:
       第一步:将服务器一分为二:报表服务器,开单服务器.。。这样可以保证正常日常开单.虽然物理上是分开,但是界面不分开,对客户操作基本不影响,也不需要登录两次.
       第二步:对excel超行,超列的处理,以前我们是如果超行,分sheet,超列也分sheet,但是这样有的还是不行,java里面的excel操作api jxl不支持,数据超过4w行后,除了速度变慢,还经常out of memory.没有办法,参考

    了一下国内报表软件的做法,改成超行,分文件,超列分sheet.
       第三步:以前是直接导一个excel文件给客户的,现在改成导一个压缩文件.这样的好处是:响应给用户的生成文件体积大大缩小,降低了多用户并发访问时服务器下载文件的负担,有效减少多个用户导出下载时服务器端

    的流量,从而达到进一步减轻服务器负载的效果.
       第四步:通过上面三步以后,系统性能明显好转,但是报表服务器,每天还是会死一两次。。终究原因和上面一样,使用jdbc查询到的原始数据占用的内存太多.tomcat吃不消。另外还发现一点,如果一旦出现大量报表
    查询的话。数据库又吃不消,这就间接造成有时候开单服务器性能下降太快.
       第五步:使用报表计划,所谓计划就是,客户设定好的条件.系统利用晚上空闲时间自动生成.对于有一些不需要强调实时性的报表来说,这样显然是可以的。但是对于一些实时性的来说,客户是不能接受的。所以我们的计划必须支持手工生成.但这里手工生成不再走正常的报表查询思路(只要请求了就进行查询),而是使用队列,谁先请求,谁先生成。如果计划请求多的话,每次只会是一个计划在执行.
       第六步:建历史数据表,将一些已完成的数据分离.基本上,很多的软件都是这个思路.有的是用分区表,大概也差不多.

       注:第五步,我们才刚开发好,具体使用情况还有待观察。目前我们只做了这么多,如果以后还出现性能危机,只能是具体情况具体分析。关于性能问题,欢迎大家讨论
    本博客均为原创,转载请注明出处.
  • 相关阅读:
    MongoDB的简单操作
    MongoDB下载安装
    enctype="multipart/form-data" form表单提交值为null
    shiro
    json简单介绍
    Sql Server 安装
    MySQL面试常问的查询操作
    关于分页
    Vuex
    Vue基础安装(精华)
  • 原文地址:https://www.cnblogs.com/mzhanker/p/2066062.html
Copyright © 2011-2022 走看看