如何高效玩转Tomcat实战
Tomcat性能优化从以下几个方面开展,具体如下:
Tomcat配置层面
优化配置参数(conf/server.xml)
<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" disableUploadTimeout="true" enableLookups="false" URIEncoding="UTF-8" />
增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads)
• protocol协议 运行模式默认BIO
• maxThreads:tomcat可用于请求处理的最大线程数,默认是200• minSpareThreads:tomcat初始线程数,即最小空闲线程数
• maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
• acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理.默认100
• URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里还有搞个mod_encoding,还要手工编译
• enableLookups="false"关闭DNS扫描 是否反查域名
• disableUploadTimeout:容许Servlet容器,正在执行使用一个较长的链接超时值,以使Servlet有较长的时间来完成它的执行,默认值为false
配置内存大小(bin/catalina.bat/sh)
JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:MaxPermSize=256m -XX:PermSize=128M -XX:MaxPermSize=256M"
• -server:启用jdk的server版本。
• -Xms:虚拟机初始化时的最小堆内存。
• -Xmx:虚拟机可使用的最大堆内存。#-Xms与-Xmx设成一样的值,避免JVM因为频繁的GC导致性能大起大落
• -XX:PermSize:设置非堆内存初始值,默认是物理内存的1/64。
• -XX:MaxNewSize:新生代占整个堆内存的最大值。
• -XX:MaxPermSize:Perm(俗称方法区)占整个堆内存的最大值,也称内存最大永久保留区域。
使用线程池(conf/server.xml)
<Executor name="tomcatThreadPool" namePrefix="req-exec-" maxThreads="1000" minSpareThreads="50" maxIdleTime="60000"/>
<Connector port="8080" protocol="HTTP/1.1" executor="tomcatThreadPool"/>
• namePrefix:线程池中线程的命名前缀
• maxThreads:线程池的最大线程数
• minSpareThreads:线程池的最小空闲线程数
• maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
• threadPriority:线程优先级
运行模式BIO, NIO, APR调整(conf/server.xml)
1)BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。
2)NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件):
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>
3)APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。
Tomcat 部署层面
物理机实施部署
增加服务器CPU和内存等配置提高性能
虚拟化集群方案nginx+tomcat1+tomcat2
云集群方案WAF+SLB+tomcat1+tomcat2