Tomcat可以从内存、并发、缓存等方面进行优化
1、Tomcat内存优化:
在tomcat的启动脚本catalina.sh中设置java_OPTS参数
JAVA_OPTS=’-Xms2048m-Xmx2048m -XX:PermSize=512M -XX:MaxPermSize=1024m’
参数说明:
-server启用jdk的server版;
-XmsJava虚拟机初始化时的最小内存;
-Xmx Java虚拟机可使用的最大内存;
-XX:PermSize内存永久保留区域
-XX:MaxPermSize内存最大永久保留区域
验证:
设置成功后我们可以利用JDK自带的工具进行验证,这些工具都在JAVA_HOME/bin目录下:
1)jps:用来显示本地的java进程,以及进程号,进程启动的路径等。
2)jmap:观察运行中的JVM物理内存的占用情况,包括Heapsize , Perm size下载地址等。
进入JAVA_HOME/bin目录下或者使用软链接等方式,然后输入jps和jmap命令。
2、Tomcat并发优化:
Connector优化
Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以Connector的优化是重要部分。默认情况下Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们需要提高这方面的处理能力。
Tomcat官网Connector参数属性:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html,参数非常多,我们这里只介绍一些常用的
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
connectionTimeout="20000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>
参数说明:
port代表Tomcat监听端口,也就是网站的访问端口,默认为8080,可以根据需要改成其他
protocol代表协议类型,可选类型有四种,分别为BIO(阻塞型IO),NIO,NIO2和APR
maxHttpHeaderSize请求和响应的HTTP头的最大大小,以字节为单位指定。如果没有指定,这个属性被设置为8192(8 KB)。
maxThreads客户请求最大线程数,也就是可以处理的同时请求的最大数目,如果未指定,默认为200
minSpareThreads Tomcat初始化时创建的socket线程数,线程的最小运行数目,这些始终保持运行,如果未指定,默认值为10
maxSpareThreads Tomcat连接器的最大空闲socket线程数
connectionTimeout代表连接超时时间,单位为毫秒,默认值为60000。通常情况下设置为30000
minProcessors服务器创建时的最小处理线程数
maxProcessors服务器同时最大处理线程数
enableLookups关闭DNS反向查询,若设为true,则支持域名解析,可把ip地址解析为主机名
URIEncoding URL统一编码
acceptCount监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads),如果未指定,默认值为100
redirectPort在需要基于安全通道的场合,把客户请求转发到基于SSL的redirectPort端口
disableUploadTimeout这个标志允许servletContainer在一个servlet执行的时候,使用一个不同的,更长的连接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。如果没有指定,设为false。
参数详解:
1)protocol
a)BIO:BIO(BlockingI/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的JavaI/O操作(即java.io包及其子包)。Tomcat在默认情况下,是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。BIO配置采用默认即可。
b)NIO:NIO(NewI/O),是Java SE1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Javanio是一个基于缓冲区、并能提供非阻塞I/O操作的JavaAPI,因此nio也被看成是non-blockingI/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要protocol类型修改为:
//NIO
protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
c)APR:APR(ApachePortable Runtime/Apache可移植运行时),是ApacheHTTP服务器的支持库。你可以简单地理解为:Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。与配置NIO运行模式一样,也需要将对应的Connector节点的protocol属性值改为:
protocol="org.apache.coyote.http11.Http11AprProtocol"
2)maxThreads:由该连接器创建的处理请求线程的最大数目,也就是可以处理的同时请求的最大数目。如果未配置默认值为200。如果一个执行器与此连接器关联,则忽略此属性,因为该属性将被忽略,所以该连接器将使用执行器而不是一个内部线程池来执行任务。maxThreads是一个重要的配置属性,maxThreads配置的合理直接影响了Tomcat的相关性能,所以这里我们重点讨论下。
maxThreads并不是配置的越大越好,事实上你即使配置成999999也是没有用的,因为这个最大值是受操作系统及相关硬件所制约的,并且最大值并不一定是最优值,所以我们追寻的应该是最优值而不是最大值。
QPS(Query Per Second):每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。我们常常使用QPS值来衡量一个服务器的性能。
QPS =并发数/平均响应时间
或者
并发数= QPS *平均响应时间
一个系统吞吐量通常由QPS、并发数两个因素决定,每套系统的这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。所谓吞吐量这里可以理解为每秒能处理请求的次数。
所以选择一个合理的maxThreads值,其实并不是那么容易的事。因为过多的线程只会造成,更多的内存开销,更多的CPU开销,但是对提升QPS确毫无帮助;找到最佳线程数后通过简单的设置,可以让web系统更加稳定,得到最高,最稳定的QPS输出。
我们可以通过以下几种方式来获取maxThreads的最佳值:
(1)通过线上系统不断使用和用户的不断增长来进行性能测试,观察QPS,响应时间,这种方式会在爆发式增长时系统崩溃,如双12等。
(2)根据公式计算,服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) *cpu数量,这种方式有时会被误导,因为某些系统处理环节可能会耗时比较长,从而影响公式的结果。
(3)单、多用户压力测试,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这个值的附近应该就是最佳线程数量,这种方式理想场景比较适用,实际情况会比这个复杂的多。
(4)根据系统的自身情况调整,如硬件限制,系统限制,程序处理能力限制等。
(5)定期修改为不同的maxThreads值,看服务器响应结果及用户反应。
QPS和线程数的关系
(1)在最佳线程数量之前,QPS和线程是互相递增的关系,线程数量到了最佳线程之后,QPS持平,不在上升,甚至略有下降,同时相应时间持续上升。
(2)同一个系统而言,支持的线程数越多(最佳线程数越多而不是配置的线程数越多),QPS越高。
QPS和响应时间的关系
(1)对于一般的web系统,响应时间一般有CPU执行时间+IO等待时间组成。
(2)CPU的执行时间减少,对QPS有实质的提升,IO时间的减少,对QPS提升不明显。如果要想明显提升QPS,优化系统的时候要着重优化CPU消耗大户。
所以想要找出maxThreads的最优值可并不容易,没有最好只有更好,更好的值只能通过时间来显现,如果你不想考虑那么多,一般情况下设置成1000即可。
3)acceptCount:当所有可能的请求处理线程都在使用时传入连接请求的最大队列长度。如果未指定,默认值为100。一般是设置的跟maxThreads一样或一半,此值设置的过大会导致排队的请求超时而未被处理。所以这个值应该是主要根据应用的访问峰值与平均值来权衡配置。
4)maxConnections:在任何给定的时间内,服务器将接受和处理的最大连接数。当这个数字已经达到时,服务器将接受但不处理,等待进一步连接。NIO与NIO2的默认值为10000,APR默认值为8192。
3、Tomcat缓存优化:
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
参数说明:
compression打开压缩功能
compressionMinSize启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType压缩类型
connectionTimeout定义建立客户连接超时的时间.如果为-1,表示不限制建立客户连接的时间
整合的配置:
protocol="HTTP/1.1"
maxHttpHeaderSize="8192"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="1000"
minProcessors="100"
maxProcessors="1000"
enableLookups="false"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
connectionTimeout="20000"
URIEncoding="utf-8"
acceptCount="1000"
redirectPort="8443"
disableUploadTimeout="true"/>