所谓优化就是发挥机器原本的性能。tomcat的优化既是正确的方式使用tomcat。
我参考其他博文整理了一篇关于tomcat优化的相关配置。
目录
一、内存优化
内存优化既是通过配置JVM的堆内存大小的方式来实现。
(1)配置方式:
-
linux中修改bin/cateline.sh文件,添加以下内容:
JAVA_OPTS="-Xms2048m -Xmx2048m"
- windows中修改bin/cateline.bat文件,添加以下内容:
set JAVA_OPTS=-Xms2048m -Xmx2048m
相关参数:
- Xms:初始化的堆内存大小
- Xmx:最大的堆内存大小
(2)windows下测试修改并查看:
修改完配置,启动tomcat,使用命令行进入%JAVA_HOME%/bin目录,
- jps查看jvm的运行进程号
C:\Program Files\Java\jdk1.8.0_101\bin>jps
6128 Jps
1276 Bootstrap
- jmap:观察运行中的JVM 物理内存的占用情况,即显示下面的内容
C:\Program Files\Java\jdk1.8.0_101\bin>jmap -heap 1276
修改前:
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 1046478848 (998.0MB) 《--修改前的最大值
NewSize = 22020096 (21.0MB)
MaxNewSize = 348651520 (332.5MB)
OldSize = 45088768 (43.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 227540992 (217.0MB) <--1
used = 30208568 (28.80913543701172MB)
free = 197332424 (188.19086456298828MB)
13.276099279728903% used
From Space:
capacity = 13107200 (12.5MB) <--2
used = 0 (0.0MB)
free = 13107200 (12.5MB)
0.0% used
To Space:
capacity = 16252928 (15.5MB) <--3
used = 0 (0.0MB)
free = 16252928 (15.5MB)
0.0% used
PS Old Generation
capacity = 69730304 (66.5MB) <--4 将年轻代和老年代的内存(1-4)加起来就是默认的初始化的内存大小
used = 29030872 (27.685997009277344MB)
free = 40699432 (38.814002990722656MB)
41.63307820943962% used
19129 interned Strings occupying 2404488 bytes.
修改后:
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 2147483648 (2048.0MB) <--修改后
NewSize = 715653120 (682.5MB)
MaxNewSize = 715653120 (682.5MB)
OldSize = 1431830528 (1365.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: 年轻代+老年代=2048m,正是自定义配置的2048m
PS Young Generation
Eden Space:
capacity = 537395200 (512.5MB)
used = 65443752 (62.412025451660156MB)
free = 471951448 (450.08797454833984MB)
12.177956185689787% used
From Space:
capacity = 89128960 (85.0MB)
used = 0 (0.0MB)
free = 89128960 (85.0MB)
0.0% used
To Space:
capacity = 89128960 (85.0MB)
used = 0 (0.0MB)
free = 89128960 (85.0MB)
0.0% used
PS Old Generation
capacity = 1431830528 (1365.5MB)
used = 36072216 (34.401145935058594MB)
free = 1395758312 (1331.0988540649414MB)
2.519307648118535% used
二、配置优化
(1)connector配置:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1000"
maxConnections="1000"
connectionTimeout="20000"
tcpNoDelay="true"
compression="on"
compressionMinSize="2048"
redirectPort="8443"/>
相关参数:
- maxThreads:此Connector要创建的最大请求处理线程数。如果未指定,则此属性默认设置为200.如果Executor与此连接器关联,则忽略此属性,因为连接器将使用Executor而不是内部线程池执行任务。
- minSpareThreads:最小的始终保持运行的线程数。这包括活动和空闲线程。如果未指定, 则使用默认值
10
。如果这个Connector使用了Executor,则忽略此属性。 - acceptCount:当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。队列已满时收到的任何请求都将被拒绝。默认值为100。
- maxConnections:服务器在任何给定时间接受和处理的最大连接数。
- connectionTimeout:超时时间。
- tcpNoDelay:如果设置为
true
,则将在服务器套接字上设置TCP_NO_DELAY选项,这样可以在大多数情况下提高性能。默认设置为true
。 - compression:所述连接器可在试图节省服务器的带宽使用HTTP / 1.1 GZIP压缩。参数的可接受值是“off”(禁用压缩),“on”(允许压缩,导致文本数据被压缩),“force”(在所有情况下强制压缩)或数字整数值(这是等效于“on”,但指定压缩输出之前的最小数据量)。
- compressionMinSize:如果压缩设置为“on”,则此属性可用于指定压缩输出之前的最小数据量。如果未指定,则此属性默认为“2048”。
- redirectPort:如果此连接器支持非SSL请求,并且收到匹配
<security-constraint>
需要SSL传输的请求,则Catalina将自动将请求重定向到此处指定的端口号。 - protocol:这个参数配置此连接器处理哪种协议的请求,有四个值可选,为下图
更多详细的connector参数,参考官方文档:https://tomcat.apache.org/tomcat-8.0-doc/config/http.html
(2)executor配置:
<Executor name="tomcatThreadPoolName"
className="org.apache.catalina.core.StandardThreadExecutor"
namePrefix="catalina-exec-"
maxThreads="1000"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"/>
- name:用于在server.xml中的其他位置引用此池的名称。该名称是必需的,必须是唯一的。
- className:实现的类。实现必须实现
org.apache.catalina.Executor
接口。此接口确保可以通过其name
属性引用对象并实现Lifecycle,以便可以使用容器启动和停止对象。className的默认值是org.apache.catalina.core.StandardThreadExecutor
- namePrefix: (字符串)执行程序创建的每个线程的名称前缀。单个线程的线程名称将是
namePrefix+threadNumber
maxThreads:同上
- minSpareThreads:同上
- maxIdleTime:(int)空闲线程关闭毫秒数,除非活动线程数小于或等于minSpareThreads。默认值为
60000
(1分钟) - maxQueueSize:(int)在我们拒绝之前可以排队等待执行的可运行任务的最大数量。默认值是
Integer.MAX_VALUE
- prestartminSpareThreads:(boolean)是否应该在启动Executor时启动minSpareThreads,默认值为
false
- threadPriority:(int)执行程序中线程的线程优先级,默认为
5
(Thread.NORM_PRIORITY
常量的值)
更多参数,参考官方文档:https://tomcat.apache.org/tomcat-8.0-doc/config/executor.html
Executor可以在Tomcat组件之间共享。配置了Executor需要在connector中引用
<Connector executor="tomcatThreadPoolName" ....../>
三、使用APR组件
关于使用apr,这有篇博文很好:Tomcat中如何配置使用APR
参考博文:
- Tomcat优化详细教程(详细,很棒)
- 闲谈Tomcat性能优化