server.xml配置文件优化
Connector 优化
Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以 Connector的优化是重要部分。默认情况下 Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们可以根据实际需要考虑提高这方面的处理能力。
Connector的全部参数可以参考https://tomcat.apache.org/tomcat-9.0-doc/config/http.html,默认参数如下:
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
正常来说默认参数就可以了,如果出现因访问量过大默认参数不符合实际业务场景的,可以适当调整参数,如下:
<Connector port="8888" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="1000" #该连接器创建的处理请求线程的最大数目
minSpareThreads="100"
acceptCount="1000" #当所有可能的请求处理线程都在使用时传入连接请求的最大队列长度,默认值为100,一般是设置的跟 maxThreads一样或一半
redirectPort="8443" />
maxThreads是一个重要的配置属性,maxThreads配置的合理直接影响了Tomcat的相关性能,maxThreads并不是配置的越大越好,因为这个最大值是受操作系统及相关硬件所制约的,并且最大值并不一定是最优值,所以我们追寻的应该是最优值而不是最大值。要配置好maxThreads,首先我们要清楚:
- QPS(Query Per Second):每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
- 一个系统吞吐量通常由QPS、并发数两个因素决定,每套系统的这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。所谓吞吐量这里可以理解为每秒能处理请求的次数。
- 在最佳线程数量之前,QPS和线程是互相递增的关系,线程数量到了最佳线程之后,QPS持平,不在上升,甚至略有下降,同时相应时间持续上升。
- 同一个系统而言,支持的线程数越多(最佳线程数越多而不是配置的线程数越多),QPS越高。
- CPU的执行时间减少,对QPS有实质的提升,IO时间的减少,对QPS提升不明显。如果要想明显提升QPS,优化系统的时候要着重优化CPU消耗大户。
所以想要找出 maxThreads的最优值可并不容易,没有最好只有更好,更好的值只能通过时间来显现,如果你不想考虑那么多,一般情况下设置成1000即可。
线程池
Executor代表了一个线程池,可以在Tomcat组件之间共享。使用线程池的好处在于减少了创建销毁线程的相关消耗,而且可以提高线程的使用效率。默认线程池参数如下,可按实际需要优化:
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
catalina.sh启动文件优化
catalina.sh文件主要是优化JAVA_OPTS的参数。要优化java-opts的参数最好先理解jvm的一些知识,我们修改一下java_opts的参数,放在CLASSPATH=下面,如下:
JAVA_OPTS="-server
-Xms2g #Java虚拟机堆的初始容量,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能;
-Xmx2g #Java虚拟机可使用堆的最大内存
-Xss512k #设置每个线程的堆大小512k
-XX:MetaspaceSize=512M #这个JVM参数是指Metaspace扩容时触发FullGC的初始化阈值。
-XX:MaxMetaspaceSize=512M " #这个JVM参数是指Metaspace扩容时触发FullGC的最大阈值。
验证:
jps:用来显示本地的java进程,以及进程号,进程启动的路径等
[root@test11 ~]# jps
18834 Bootstrap
27205 Jps
jmap:观察运行中的JVM 物理内存的占用情况
[root@test11 ~]# jmap -heap 18834
Attaching to process ID 18834, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.91-b14
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 994050048 (948.0MB)
NewSize = 20971520 (20.0MB)
MaxNewSize = 331350016 (316.0MB)
OldSize = 41943040 (40.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 = 213909504 (204.0MB)
used = 186045264 (177.4265899658203MB)
free = 27864240 (26.573410034179688MB)
86.97381861069623% used
From Space:
capacity = 8912896 (8.5MB)
used = 2619488 (2.498138427734375MB)
free = 6293408 (6.001861572265625MB)
29.38986385569853% used
To Space:
capacity = 8912896 (8.5MB)
used = 0 (0.0MB)
free = 8912896 (8.5MB)
0.0% used
PS Old Generation
capacity = 40370176 (38.5MB)
used = 15803288 (15.071189880371094MB)
free = 24566888 (23.428810119628906MB)
39.14594774122362% used
16988 interned Strings occupying 1510128 bytes.