性能优化|tomcat 优化点整理记录
整理
提高并发能力
设置线程池
在配置文件的 Service
下
<executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500" minSpareThreads="20" maxIdleTime="60000"/>
<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1"
connectionTimeout="200000"
redirectPort="8443"
URIEncoding="UTF-8"
maxHttpHeaderSize="95536" maxPostSize="209715200"
server="Neo App Srv 1.0"/>
参数说明:
Attribute | Description |
---|---|
threadPriority ``(优先级) | (int)线程的线程优先级执行程序,默认是5(NORM_PRIORITY常数) |
daemon``(守护进程) | (布尔)是否应该守护程序线程,线程默认是true |
namePrefix``(名称前缀) | (String) The name prefix for each thread created by the executor. The thread name for an individual thread will be namePrefix+threadNumber |
maxThreads``(最大线程数) | (int) The max number of active threads in this pool, default is 200 |
minSpareThreads``(最小活跃线程数) | (int) The minimum number of threads always kept alive, default is 25 |
maxIdleTime``(空闲线程等待时间) | (int) The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads. Default value is 60000 (1 minute)一个空闲的线程shutsdown之前的毫秒数,除非活动线程的数量不等于minSpareThreads。默认值为60000(1分钟) |
maxQueueSize``(最大的等待队里数,超过则请求拒绝) | (int) The maximum number of runnable tasks that can queue up awaiting execution before we reject them. Default value is Integer.MAX_VALUE 可运行的最大数量可以排队等待执行的任务之前,我们拒绝他们。默认值是Integer.MAX_VALUE |
prestartminSpareThreads``(是否在启动时就生成minSpareThreads个线程) | (boolean) Whether minSpareThreads should be started when starting the Executor or not, the default is false minSpareThreads是否应该开始在开始执行程序,默认是false |
threadRenewalDelay``(重建线程的时间间隔) | (long) If a ThreadLocalLeakPreventionListener is configured, it will notify this executor about stopped contexts. After a context is stopped, threads in the pool are renewed. To avoid renewing all threads at the same time, this option sets a delay between renewal of any 2 threads. The value is in ms, default value is 1000 ms. If value is negative, threads are not renewed.。重建线程池内的线程时,为了避免线程同时重建,每隔threadRenewalDelay(单位: ms )重建一个线程。默认值为1000 ,设置为负则不重建 |
设置启动模式
设置NIO模式
Tomcat8在Linux系统中默认使用这种方式。
强制声明
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000" redirectPort="8443"/>
设置apr 模式
安装起来最困难,但是从操作系统级别来解决异步的IO问题,大幅度的提高性能.
即Apache PortableRuntime,从操作系统层面解决io阻塞问题。
Tomcat7或Tomcat8在Win7或以上的系统中启动默认使用这种方式。
Linux如果安装了apr和native,Tomcat直接启动就支持apr。
具体安装办法 参见这个地址:https://my.oschina.net/lsw90/blog/181161
在那里看我们的tomcat以何种工作模式启动的啊?
Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:
StartingProtocolHandler [“http-bio-8080”]
StartingProtocolHandler [“http-nio-8080”]
StartingProtocolHandler [“http-apr-8080”]
禁用tomcat的AJP协议
使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。
[root@tomcat1 conf]# vim server.xml
注释:
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
AJP(Apache JServerProtocol)
AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。
连接器(Connector)优化
最佳实践:
# <Connector executor="tomcatThreadPool"下面添加:
port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
#最多同时处理的连接数,Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。如果没有指定,该属性被设置为200。如果使用了execute将忽略此连接器的该属性,连接器将使用execute,而不是一个内部线程池来处理请求。
maxThreads="1000"
# (最小活跃线程数)
minSpareThreads="100"
maxSpareThreads="200"
# 当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度
acceptCount="1000"
# 禁用上传超时时间
disableUploadTimeout="true"
# 连接超时,单位毫秒,0代表不限制
connectionTimeout="20000"
# URI地址编码使用UTF-8
URIEncoding="UTF-8"
# 关闭dns解析,提高响应时间
enableLookups="false"
#启用压缩功能: 如果没有指定,该属性被设置为“关” ; 开启压缩GZIP js
compression="on"
# 最小压缩大小,单位Byte: 如果压缩被设置为“on”,那么该属性可以用于指定在输出之前被压缩的数据的最小量。如果未指定,此属性默认为“2048”
compressionMinSize="2048"
#压缩的文件类型: 该值是一个被用于HTTP压缩的逗号分隔的MIME类型列表。默认值是text / html类型,为text / xml,text / plain。
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png"
redirectPort="8443" />
JVM调优生产配置
适当调整Tomcat的运行JVM参数可以提升整体性能。
在默认不配置 JVM 堆内存大小的情况下,JVM 根据默认值来配置当前内存大小
在性能测试过程中逐步调整最合适的参数。
编辑catalina.sh配置文件
[root@tomcat1 ~]# vim /usr/local/tomcat8/bin/catalina.sh
# OS specific support. $var _must_ be set to either true or false.下面添加
JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -XX:+UseParallelGCThreads=8 -XX:CMSInitiatingOccupancyFraction=80 -XX:
+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-PrintGC -XX:-PrintGCDetails -XX:-PrintGCTimeStamps -Xloggc:../logs/gc.log"
参数
描述
-Xms
堆内存初始大小,单位m、g
-Xmx
堆内存最大允许大小,一般不要大于物理内存的80%:
设置堆内存大小,根据实际业务调整,不宜过大,也不宜过小。
-XX:PermSize
非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
-XX:MaxPermSize
非堆内存最大允许大小
-XX:+UseParallelGCThreads=8
并行收集器线程数,同时有多少个线程进行垃圾回收,一般与CPU数量相等
-XX:+UseParallelOldGC
指定老年代为并行收集
-XX:+UseConcMarkSweepGC
CMS收集器(并发收集器)
-XX:+UseCMSCompactAtFullCollection
开启内存空间压缩和整理,防止过多内存碎片
-XX:PrintGCTimeStamps
打印 GC 具体时间
-XX:PrintGCDetails
打印出 GC 详细日志
-Xloggc: path
GC 日志生成路径