在单数据库,单计算机服务下随着用户的增加,随之而来的会出现很多问题,诸如连接、jvm空间不足等等,这些问题带来的后果就是性能大打折扣,客户投诉。当然处理办法有多种,比如添加服务,做负载均衡,添加缓存服务,动静分离等等。这里我们只谈谈对服务器(tomcat)和数据库(mysql)的优化。
我们在做大数据测试时常常会碰到这样一类错误:outofmemoryerror:java heap space
这类问题出现的原因就是jvm的堆内存已满,导致内存溢出。解决这类问题首先要查的还是程序,看是否有死循环之类的bug问题,还有就是增加jvm的堆内存。这个配置需要在tomcat的bin目录下的catalina.bat文件中设置。编辑这个文件,在文件的rem -----------------------------------------------------------------和rem Guess CATALINA_HOME if not defined之间插入:set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m,这里做下介绍 -Xms(JVM初始化堆的大小 不要超过物理内存的80% ),-Xmx(JVM堆的最大值 不要超过物理内存的80% ),-XX:PermSize(jvm非堆内存初始值 默认是物理内存的1/64),XX:MaxPermSize(jvm非堆内存最大值 默认是物理内存的1/4)
熟悉IO与NIO的都知道,他们的区别和对性能的影响,这里就不多说了,其实tomcat是支持java NIO特性的,只不过默认情况下并未开启该功能,比如我们在未配置过的tomcat中常常会发现如下的配置
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="UTF-8" redirectPort="8443" />
而且启动时你会发现如下信息
2012-10-26 18:14:07 org.apache.coyote.http11.Http11Protocol init 信息: Initializing Coyote HTTP/1.1 on http-8080 2012-10-26 18:14:07 org.apache.catalina.startup.Catalina load
以下便是开启tomcatNIO特性
<Connector URIEncoding="UTF-8" acceptCount="1000" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
在tomcat启动时创建线程池,解决tomcat在获取请求时候创建线程的压力消耗,从而提升tomcat处理能力
在tomcat的server.xml文件中添加如下线程池声明
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="300" />
相关参数说明
name:线程池的名称
namePrefix:线程池的前缀
maxThread:最大线程数
minSpareThreads:初始化线程数
声明完线程池后,接着就使用该线程池,在tomcat的server.xml的连接器中配置该线程池,效果如下
<Connector executor="tomcatThreadPool" URIEncoding="UTF-8" acceptCount="1000" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>