系统性能调优之我见

我们项目最先的架构方案由redhat顾问搭建,采用的都是redhat jboss的中间件,例如JBoss EAP, Fuse等等,但是由于网上对这些系统的介绍比较少,一旦出现问题我们自己解决不了就必须订阅redhat的服务请他们的顾问来帮忙解决,于是项目经理决定采用我们自己熟悉的工具及容器来搭建一个开源的架构方案,不再采用redhat的建议,当然滴,这个锅轻飘飘地甩给了我:)

JBoss EAP是一个全功能的JavaEE容器,意味着它可以部署EJB,而在我们的项目里面并不需要EJB这么重量级的组件,于是我决定使用轻量级的Tomcat作为web容器并组建一个集群,而前端使用Apache + mod_jk 模块来做反向代理达到负载均衡的效果,该架构的拓扑图如下:

 项目经理要求该架构要能够承受500用户的并发并且响应时间达到100毫秒,经过loadrunner多次压力测试及各个方面的调优,积累了一些关于性能调优的经验,现在记录下来以备不时之需。

Tomcat性能调优参考:

  • Tomcat集群的性能会优于单节点的性能。
  • 应用Tomcat的线程连接池可以提高性能。

为了给tomcat应用线程连接池,需要修改{tomcat.base}/conf/server.xml文件,增加如下定义:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="100" acceptCount="500" enableLookups="false" connectionTimeout="3000" />

参数解释:

maxThreads:tomcat启动的最大线程数,即同时处理的任务个数,默认值为200

acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100

minSpareThreads:tomcat应该始终打开的最小不活跃线程数,默认值为25

enableLookups:是否反查域名,取值为:true或false。为了提高处理能力,应设置为false

connectionTimeout:网络连接超时,单位:毫秒。设置为0表示永不超时,这样设置有隐患的。通常可设置为30000毫秒。

在协议http/1.1和ajp/1.3(由于使用了HTTPD,而HTTPD跟tomcat是基于ajp/1.3协议通信的)的连接器上面应用此线程池,具体配置如下:

<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" redirectPort="8443" />
  • 关闭不必要的日志来减少I/O吞吐量,从而提高性能。
  • 关闭localhost_access_log, 参考:http://www.cnblogs.com/stonefeng/p/6138879.html
  • 修改Tomcat启动的JVM参数来优化,例如修改catalina.sh文件,增加JAVA_OPTS="-Xms4096m -Xmx4096m"来强制为Tomcat分配4G内存

Apache HTTPD性能调优参考:

  • 增加HTTPD MPM模块prefork的初始进程数StartServers
  • 增加prefork的最小空闲进程数MinSpareServers
  • 增加prefork的最大空闲进程数MaxSpareServers
  • 增加prefork的服务进程数限制ServerLimit
  • 增加prefork的最大客户端MaxClient
  • 增加prefork的每个子进程管理的连接数MaxRequestsPerChild

应用级别:

  • 提高应用的log4j日志级别至ERROR级别来减少日志的打印量。
  • 使用EnCache来缓存一些数据,避免频繁命中数据库。
  • 在性能测试进行的时候,遇到响应时间出现波峰的时候,使用kill -3 PID命令来抓取应用的堆栈信息,再对堆栈信息进行分析来定位应用级别的性能瓶颈。

更多性能调优经验增加中...

原文地址:https://www.cnblogs.com/stonefeng/p/6142570.html