服务端优化-Tomcat调优

1.写在前面

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

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

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

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

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

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

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

2.Tomcat调优

为什么对Tomcat进行调优?

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

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

调优:嵌入式Tomcat配置

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

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

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

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

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

  org.springframework.boot  spring-boot-starter-actuator

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

以上是内嵌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内存,线程数经验值 1000server.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的值

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

还记得xss的值嘛?

这里的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的限制。

调优配置生效确认

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

调优之后:性能对比

未优化性能表:

并发数/ 5s

平均响应时间(RT)

吞吐量(TPS)

错误率

200

1000

200

0

300

1464

191

0

500

2431

197

0

700

3414

198

0

1000

4891

199

0

优化后性能表:

并发数/ 5s

样本数

平均响应时间(ms)

吞吐量(TPS)

200

10000

1000

181

300

15000

1000

272

500

25000

1000

454

700

35000

1002

636

1000

50000

1001

908

1500

75000

1418

960

2000

100000

1935

973

优化之前:

未优化之前最大线程数:

优化之后:

优化之后最大线程数:

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

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

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

转自:https://juejin.cn/post/7130909498285228040

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章