目标
- 配置Tomcat的jvm的响应时间较短
- 配置Tomcat的连接池尽可能的高效
jvm启动参数
沿用文章tomcat中配置文件之setenv.sh提到的setenv.sh
配置文件,配置如下:
# 使用的jdk目录
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
# 使用的Tomcat目录
export CATALINA_HOME=/Users/zhangyalin/Documents/tomcat8
# JAVA_OPTS参数需要CATALINA_PID参数
export CATALINA_PID="$CATALINA_HOME/tomcat.pid"
# Tomcat的JVM参数设置
export JAVA_OPTS="-server -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+AggressiveOpts -Xms8g -Xmx8g"
增加的参数作用:
-XX:+UseG1GC
:优先启用G1垃圾回收器。它是一种服务器式垃圾回收器,针对具有大量RAM的多处理器机器。它以高概率满足GC暂停时间为目标,同时保持良好的吞吐量。G1垃圾回收器推荐用于需要大内存(大小约6 GB或更大)的应用,并要求有限的GC延迟要求(稳定和可预测的暂停时间低于0.5秒)。
-XX:MaxGCPauseMillis=500
:设置最大GC暂停时间的目标值(以毫秒为单位)。这是一个柔和的目标,JVM将尽其最大努力来实现它。默认情况下,没有最大暂停时间值。
-XX:+AggressiveOpts
:允许使用积极的性能优化功能,预计这些功能将在即将发布的版本中成为默认功能。默认情况下,此选项被禁用,并且不使用这些带实验性的性能优化功能。
Tomcat连接池
Executor
conf/server.xml
文件中找到:
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
取消掉注释修改为:
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<Executor
name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="100"
prestartminSpareThreads="true"
maxQueueSize="100"/>
name
:连接池名称;namePrefix
:连接池创建的每个线程的名称前缀。单个线程的线程名称将为namePrefix + threadNumber
;maxThreads
:此池中活动线程的最大数量,默认值为200;minSpareThreads
:此池中始终保持活动状态的线程最小数量,默认值为25;prestartminSpareThreads
:启动连接池是是否让最小活跃线程minSpareThreads
也同时生效,也就是Tomcat启动时初始化这些线程,而不是等到需要的时候再启动线程;maxQueueSize
:最大的队列长度,默认值是Integer.MAX_VALUE。
Connector
conf/server.xml
文件中找到:
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改为:
<!-- A "Connector" represents an endpoint by which requests are received and responses are returned. Documentation at : Java HTTP Connector: /docs/config/http.html Java AJP Connector: /docs/config/ajp.html APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080 -->
<Connector
port="80"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
maxConnections="10000"
acceptCount="100"
acceptorThreadCount="2"
enableLookups="false"
executor="tomcatThreadPool"
redirectPort="8443"/>
port
:使用的端口;protocol
:默认是HTTP/1.1
,这个会在让tomcat自动选择NIO,NIO2,APR/native:org.apache.coyote.http11.Http11NioProtocol
- non blocking Java NIO connectororg.apache.coyote.http11.Http11Nio2Protocol
- non blocking Java NIO2 connectororg.apache.coyote.http11.Http11AprProtocol
- the APR/native connector.
connectionTimeout
:连接超时时间,单位是毫秒;maxConnections
:服务器在任何给定时间接受和处理的最大连接数。请注意,一旦达到限制,操作系统仍然可以接受基于acceptCount设置的连接。默认值因连接器类型而异。对于NIO和NIO2,默认值为10000.对于APR /本机,默认值为8192;acceptCount
:所有可能的请求处理线程正在使用时传入连接请求的最大队列长度。队列满时收到的任何请求都将被拒绝。默认值是100;acceptorThreadCount
:用于接受连接的线程数。在多CPU机器上使用这个值,不要超过2个;enableLookups
:如果代码里面没有request.getRemoteHost()
可以使用禁止DNS查询;executor
:连接池的名字;redirectPort
:重定向端口。
**Note:**如果org.apache.coyote.http11.Http11Nio2Protocol
在控制台有警告,就改为org.apache.coyote.http11.Http11NioProtocol
尝试一下。
感受
还有关于Tomcat的压缩算法配置,这里没有使用。以后有机会遇到,再去配置。这里使用G1垃圾回收器,这个G1垃圾回收会根据程序需要自动配比伊甸园代,老年代和old代内存空间之配比,所以,不需要手动再去配置了。
参考:
Tomcat 8 安装和配置、优化
Apache Tomcat 8 Configuration Reference