项目性能优化经验--ZY项目

标签: 项目 性能优化 经验 | 发表时间:2014-11-10 22:00 | 作者:patrick002
出处:http://www.iteye.com

最近负责给公司某个ZY项目进行性能优化的一些经验分析

碰到问题:

1. 压力测试到100并发,任何一个场景CPU暴高,接近100%

查询jstack日志,发现大部分的线程block在tomcat 的 http11.connect 的poll方法上 或者是c3p0连接池的获取上

同时发现该项目数据库连接池配置了2000+,仍然不够用,100并发

 

分析原因: 数据库连接有问题

打开hibernate日志,关于transcation的

<logger name="org.hibernate.transaction" level="DEBUG"/>

<logger name="org.hibernate.cache" level="DEBUG"/>

<logger name="org.hibernate.type" level="DEBUG"/>

在logback.xml 中配置

然后本地运行代码,发现成百的下面日志

DEBUG org.hibernate.transaction.JDBCTransaction - begin

DEBUG org.hibernate.transaction.JDBCTransaction - current autocommit status: true

DEBUG org.hibernate.transaction.JDBCTransaction - disabling autocommit

DEBUG org.hibernate.transaction.JDBCTransaction - commit

这里显而易见出了问题,整个流程中怎么可能打开和关闭如此多的事务,要知道每次commit的时候都会去数据库连接池申请并释放连接,不要说2000,加个0都不够用

仔细查看代码,在整个系统DaoImpl的Base类上,被加了@Transcational 注释,同时几乎大部分的方法加了次注释

要知道,spring看到这个注释就会打开事物的,方法结束关闭事物

所以首先要做的就是,去掉多余的事物

 

将显而易见的事物去掉之后,系统性能显著提高,至少压倒500并发,CPU也只有在60-70%

 

2. 数据库连接依旧不够用

经过上面的调优,发现数据库连接池依旧不够用, 500并发以上,出现大量BLOCK 线程在等待数据库连接资源

需要继续调休代码

继续review日志

发现仍旧很多事物操作,特别是空事物操作(即打开关闭之间什么数据库操作都没有)

发现系统db操作框架仍旧有问题:

举例一:

@Transcational

public void delete(String ids...)

{

    if( ids != null){

      for(String id : ids){

        delete(id);

      }

   }

}

这个方法有两个严重的问题:

1. 如果ids 为空 那么就会有一个空事物操作

2. 循环的一个个delete

第一个问题,可以通过提供一个统一的入口来判断,然后非空在进入到事物操作中

第二个问题,代码框架的不完整性,作为一个合适的base框架至少要对于delete要提供一套根据ID删,根据ID组删(用delete in list(ids)), delete 对象方法等,而不是简单的一个delete方法,任何其他delete都使用这个

 

再次清掉很多空数据库连接之后,系统数据库连接仍旧不够用

 

3. 继续找问题

轮到业务逻辑调整:

1. 连接数太多的问题

因为系统采用了 freemarker的框架, 在ftl的模板中涉及到了header和footer

这两个模板文件中,加入了对用户信息的查询请求,导致这个流程中对于/member/info.jhtml的调用多次出现,同时还有其他很多的请求,一个产品列表的页面,会导致8次jthml的连接请求,整个测试流程更是多达几十次的连接

所以,需要优化连接数量,减少连接,对于重复不必要的连接,将信息缓存在session中, 对于一些连接尽量能合并的合并

减少连接,能够连接建立和释放连接的开销(提高整体响应速度)

2. 查询太多

整个流程中,光是涉及到产品的查询及其级联查询多达5,6百条,不可忍受,绝对需要缓存,必须缓存

这样既可以提高每个线程db连接使用的时间,间接就提高了连接池连接释放的概率,降低了连接等待的可能

 

经过以上的代码调优,目前整个系统已经达到客户要求

 

整个系统代码框架为

html5(jquery) ----------freemarker ---------spring MVC  --------memcached --------- hibernate  ---------MYSQL

 

然后系统搭建

最外层 使用 nagix (主备) 转发请求 

后台 tomcat 6 个集群

使用 mysql 中间件 Amoeba

mysql 做 读写分离 + 主备 (2 台 读 , 2台写)

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [项目 性能优化 经验] 推荐:

项目性能优化经验--ZY(三)

- - 行业应用 - ITeye博客
读写分离,不是想做就做的,说分就分的,随便找个中间件把请求一转发就OK的. 比如,在项目中有个模块是购物车(现在的电子商务一般都需要存储购物车内容,因为存在PC,MOBILE等不同的终端),客户先点击添加购物车,然后结算(这时候会做个判断购物车是否有商品),在大并发情况下,mysql的读库和写库的同步(beanlog)严重的delay,导致购物车一直判断为空,订单无法下.

项目性能优化经验--ZY(二)

- - 行业应用 - ITeye博客
项目中,用了很多的LAZY级联,在页面用到的时候再去load,这样就使用Open Session In View的功能,在大并发且网络不好的情况下,会导致session迟迟不能释放(session要等页面request请求完全结束之后才close),即connection也没法释放. 之前项目都是使用EAGER,JSON数据传递的方式来处理,整个连接池太小不过100就能顶住1000+的并发下单.

项目性能优化经验--ZY项目

- - 行业应用 - ITeye博客
最近负责给公司某个ZY项目进行性能优化的一些经验分析. 压力测试到100并发,任何一个场景CPU暴高,接近100%. 查询jstack日志,发现大部分的线程block在tomcat 的 http11.connect 的poll方法上 或者是c3p0连接池的获取上. 同时发现该项目数据库连接池配置了2000+,仍然不够用,100并发.

PHP项目性能优化

- - SegmentFault 最新的文章
PHP项目性能优化的三个层次. PHP周边(服务器,数据库,webserver). 尽量使用PHP原生函数和常量,类. 如果要实现的功能有原生PHP函数,则不要自己用PHP实现. 尽量使用性能更高的内置函数. 比如isset和array_key_exists都可以使用,则使用isset. 尽量不要使用错误抑制符@.

SQL性能优化十条经验

- - CSDN博客推荐文章
尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用.. 其实只需要对该脚本略做改进,查询速度便会提高近百倍. a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了.

MySQL性能优化的最佳20+套经验

- - CSDN博客推荐文章
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显. 关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能. 这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.

高手详解SQL性能优化十条经验

- - SQL - 编程语言 - ITeye博客
尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 其实只需要对该脚本略做改进,查询速度便会提高近百倍. a、修改前台程序——把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了.

一些项目管理经验(1)

- - 曉生
要尽早的参与到产品的需求当中,在讨论过程中给出自己的专业建议. 设计是整个团队的一部分,考虑的不只限于我应该做什么,而是可以为整个产品做什么. 设计与产品不可避免会有意见上的冲突,设计抱怨产品策略没有想清楚,强调流程上产品给出明确的文档之后设计再开始参与. 如前期能帮助制定产品策略,会扩大设计的影响力.

MySQL性能优化

- sun - IT程序员面试网
在笔试面试中,尤其是像百度,淘宝这些数据量非常大,而且用LAMP架构的公司,数据库优化方面就显得特别重要了. 此外,除了数据库索引之外,在LAMP结果如此流行的今天,数据库(尤其是MySQL)性能优化也是海量数据处理的一个热点. 下面就结合自己的经验,聊一聊MySQL数据库优化的几个方面. 首先,在数据库设计的时候,要能够充分的利用索引带来的性能提升,至于如何建立索引,建立什么样的索引,在哪些字段上建立索引,上面已经讲的很清楚了,这里不在赘述.

Hebernate 性能优化

- - 企业架构 - ITeye博客
文章分为十三个小块儿对Hibernate性能优化技巧进行总结性分析,分析如下:. 一、在处理大数据量时,会有大量的数据缓冲保存在Session的一级缓存中,这缓存大太时会严重显示性能,所以在使用Hibernate处理大数 据量的,可以使用session. clear()或者session. evict(Object) 在处理过程中,清除全部的缓存或者清除某个对象.