1. 背景:公司需要进行数次资产清理。这要求总公司的各下级单位每隔一段时间,将资产清理数据提交到总公司。因此建立一个专门用于提交数据的内部网站。2. 拓扑结构:约30个下级单位,分别以2M带宽的专线与总公司连接,形成公司内网环境;3. 业务流程:在资产清理过程中,下级单位在Excel中填写各单位的相关资料。最后的数据量为:每个单位大约10个Excel文件,每个文件平均约1万记录行、300列、20M。汇总大约是300个Excel文件,300万记录行、300列。根据业务要求,每次资产清理完成后,数据需要在4天内完成全部提交入库工作;4. 服务器配置:一台服务器(8CPU,4G内存,双硬盘RAID 1镜像),安装Windows 2003 Server,SQL Server 2005开发版,Apache网页服务器。4台PC机(2CPU,2G内存,IDE硬盘),每一个PC上安装一个Tomcat,共同组成应用服务器集群,用于解析提交的Excel文件并将解析后的数据插入数据库。5. 数据库设计:数据库中只有一张大表,以唯一的资产编号为主键,其它299列均为描述信息。保存数据时,要求是更新每一个资产编号对应的描述信息,而不是简单的追加插入。目前采取的方式是:
i. 读进一个Excel文件并将数据保存到一张临时表 (INSERT INTO);
ii. 将临时表中的数据追加插入到目标数据表的尾部 (INSERT INTO);
iii. 将临时表与目标数据表按唯一的资产编号进行INNER JOIN,把查询结果中保存时间早于最近一次保存时间的所有记录删除 (DELETE FROM BIG_TABLE INNER JOIN TMP_TABLE ON BIG_TABLE.编号=TMP_TABLE.编号 WHERE UPDATE_TIME<RECENT_TIME)。6. 目前的现状:
i. 在单人访问、服务器没有任何其它任务的情况下,提交保存一个数据文件的时间也比较慢,约10分钟左右;
ii. 最多能支撑5-6个人并发提交,超过这个数量,整个系统就完全瘫痪无响应;
iii. 即使在瘫痪无响应情况下,服务器的CPU、内存都仍然有大量空闲(CPU使用量从未超过10%,内存也剩余1G),但硬盘一直处于100%占用率;
iv. 在某些情况下(无法重现),通过Activity Monitor查看发现,数据库进程出现严重死锁。7. 问题:服务器的瓶颈在哪里(或者有什么办法可以检测出瓶颈)?如何改善?

解决方案 »

  1.   

    你可以把10个excel文件 分成10个表
    这样一个表就只有30个字段了 
    用的时候在连接
      

  2.   

    因为是插入,所以会加排它锁.又只有一个大表,并发操作自然会死锁.可以建立每个单位对应的小表,再通过JOB作业来完成对大表的更新..
      

  3.   

    每个excel的格式都是一样的,均为300列。所以按字段来拆成多表好像意义不大,就没有那么去拆。
    按单位来拆成多表没想到过,回头可以测一下。
    倒是不知道RAID 1镜像,会不会导致磁盘I/O的负荷太重、性能下降呢?
      

  4.   

    RAID 1 肯定会降低 因为要写两次
    还不如用RAID 5 增加并行速度