服务端优化-Tomcat调优

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


1.写在前面

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

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

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

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

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

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

image.png

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

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

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

扫描二维码关注公众号,回复: 14472324 查看本文章

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) 错误率
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

优化之前:

image.png

未优化之前最大线程数:

image.png

优化之后:

image.png

优化之后最大线程数:

image.png

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


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

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

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

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

image.png

猜你喜欢

转载自juejin.im/post/7130909498285228040