服务端优化-Tomcat调优

3,018 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情


1.写在前面

目前的java开发中,越来越多的企业,基本上都上springboot开发框架了,尤其是一些小型软件公司。

为了可以更快速的搭建开发的框架,实现项目的快速交付。毕竟原来的springmvc模式,配置确实是比较多。

在使用springboot框架后,我们在部署项目,基本上就不需要再搞一个tomcat中间件,因为springboot已经是内嵌了tomcat中间件,直接运行jar包就可以了。

那内嵌的tomcat服务,对于大部分人来说,好像一时之间,找不到tomcat的配置,该如何进行配置?

也就是说,无法进行tomcat的调优了(也有可能是,根本就没接触过调优)。

哈哈,这个确实是比较尴尬了喔,好几年开发经验,没经过服务器的调优,看起来,确实会比较low。

image.png

作为一个有经验的程序员,我们得修炼我们得内功心法才行,不然被别人称为菜鸟,那就很尴尬了。

那我们今天就对tomcat调优的一些内容,进行分享!!!

绝对干货,没收获的,回来找我!!!^_^

2.Tomcat调优

为什么对Tomcat进行调优?

基于服务器性能瓶颈分析,与服务端线程数得出结论。当前系统瓶颈主要存在与Tomcat!

查看Tomcat配置是否生效,建议开启SpringBoot的监控点

调优:嵌入式Tomcat配置

Springboot开发的服务使用内嵌的tomcat服务器来启动服务,那么tomcat配置使用的是默认配置,我们需要对tomcat配置进行一些适当的优化,让tomcat性能得以提升。

这里我们先观看springboot项目启动,默认的tomcat配置,如下图所示:

image.png

这个配置,我们该如何查看呢?这里我们可以借助actuator工具查看。

然后直接浏览器打开即可:http://localhost:8080/actuator/configprops

在pom.xml文件,加上下面的依赖即可

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

当然,你也可以直接进入源码查看,也是可以的。actuator工具是为了更直观。 image.png

以上是内嵌tomcat默认的线程数配置,这里,我们可以进行调优:

改写Tomcat相关配置,修改配置如下所示:

# Tomcat的maxConnections、maxThreads、acceptCount三大配置,分别表示最大连接数,最大线程数、最大的等待数,可以通过application.yml配置文件来改变这个三个值,一个标准的示例如下:
server.tomcat.uri-encoding= UTF-8

# 思考问题:一台服务器配置多少线程合适?
server.tomcat.accept-count= 1000 # 等待队列最多允许 1000 个请求在队列中等待
server.tomcat.max-connections= 20000 # 最大允许 20000 个链接被建立

## 最大工作线程数,默认200, 4核8g内存,线程数经验值 1000
server.tomcat.threads.max= 1000 # 并发处理创建的最大的线程数量
server.tomcat.threads.min-spare= 100 # 最大空闲连接数,防止突发流量

1)、accept-count:最大等待数

  • 当调用HTTP请求数达到tomcat的最大线程数时,还有新的请求进来,这时tomcat会将该剩余请求放到等待队列中,acceptCount就是指队列能够接受的最大等待数。默认 100 ,如果等待队列超了,新的请求就会被拒绝(connection refused)。

2)、maxThreads:最大线程数

  • 每一次HTTP请求到达Web服务,tomcat都会创建一个线程来处理该请求。
  • 最大线程数决定了Web服务容器可以同时处理多少个请求。默认是 200 。
  • 当然最大线程数肯定建议增加越大越好。但是增加线程是有成本的,不能无限制增大。线程多不仅仅会带来线程上下文切换的成本,而且线程也需要消耗内存资源。JVM中默认情况下在创建新线程时会分配大小为1M的线程栈,所以,更多的线程异味着需要更多的内存。
  • 线程数的经验值为: 1 核2g内存为 200 ,线程数经验值 200 ; 4 核8g内存,线程数经验值 1000 。

计算公式:

# java查看xss的值的命令
java -XX:+PrintFlagsFinal -version | grep ThreadStackSize

# 计算最大线程数的公式:
Number of threads = (MaxProcess内存 - JVM内存 - ReservedOsMemory) / (ThreadStackSize)

系统最大可创建的线程数量=(机器本身可用内存 - (JVM分配的堆内存+JVM元数据区)) / Xss的值

image.png

明显,这里的xss的值为1024k,也就是1m

还记得xss的值嘛?

image.png

这里的xss的值调优,我们之前应该是分享过了,详情可以查看这里:JVM调优-JVM调优实践二

扩展:JVM最大创建线程数

3)、Max Connections:最大连接数

  • 最大连接数是指在同一时间,tomcat能够接受的最大连接数。如果设置为-1,则禁用Max Connections功能,不限制连接
    • 对于Java的阻塞式BIO默认值是Max Threads的值;如果在BIO模式使用定制的Executor执行器,默认值将是执行器中Max Threads的值。
    • 对于Java 新的NIO模式,Max Connections 默认值是 10000
    • 对于Windows上APR/native IO模式,Max Connections默认值为 8192 ,这是出于性能原因,如果配置的值不是 1024 的倍数,Max Connections的实际值将减少到 1024 的最大倍数。
  • Max Connections和accept-count关系:当连接数达到最大值Max Connections后系统会继续接收连接,但不会超过acceptCount的限制。

调优配置生效确认

image.png

查看,浏览器打开:http://localhost:8080/actuator/configprops

调优之后:性能对比

未优化性能表:

并发数/ 5s平均响应时间(RT)吞吐量(TPS)错误率
20010002000
30014641910
50024311970
70034141980
100048911990

优化后性能表:

并发数/ 5s样本数平均响应时间(ms)吞吐量(TPS)
200100001000181
300150001000272
500250001000454
700350001002636
1000500001001908
1500750001418960
20001000001935973

优化之前:

image.png

未优化之前最大线程数:

image.png

优化之后:

image.png

优化之后最大线程数:

image.png

可以发现,经过优化后,程序性能提升 4 倍+;


好了,以上就是服务端优化-Tomcat调优的分享了。

个人得实操,可能也有些不足,大家轻点喷!!!

个人理解,也可能不够全面,班门弄斧了。

如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

image.png