携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
1.写在前面
目前的java开发中,越来越多的企业,基本上都上springboot开发框架了,尤其是一些小型软件公司。
为了可以更快速的搭建开发的框架,实现项目的快速交付。毕竟原来的springmvc模式,配置确实是比较多。
在使用springboot框架后,我们在部署项目,基本上就不需要再搞一个tomcat中间件,因为springboot已经是内嵌了tomcat中间件,直接运行jar包就可以了。
那内嵌的tomcat服务,对于大部分人来说,好像一时之间,找不到tomcat的配置,该如何进行配置?
也就是说,无法进行tomcat的调优了(也有可能是,根本就没接触过调优)。
哈哈,这个确实是比较尴尬了喔,好几年开发经验,没经过服务器的调优,看起来,确实会比较low。
作为一个有经验的程序员,我们得修炼我们得内功心法才行,不然被别人称为菜鸟,那就很尴尬了。
那我们今天就对tomcat调优的一些内容,进行分享!!!
绝对干货,没收获的,回来找我!!!^_^
2.Tomcat调优
为什么对Tomcat进行调优?
基于服务器性能瓶颈分析,与服务端线程数得出结论。当前系统瓶颈主要存在与Tomcat!
查看Tomcat配置是否生效,建议开启SpringBoot的监控点
调优:嵌入式Tomcat配置
Springboot开发的服务使用内嵌的tomcat服务器来启动服务,那么tomcat配置使用的是默认配置,我们需要对tomcat配置进行一些适当的优化,让tomcat性能得以提升。
这里我们先观看springboot项目启动,默认的tomcat配置,如下图所示:
这个配置,我们该如何查看呢?这里我们可以借助actuator工具查看。
然后直接浏览器打开即可:http://localhost:8080/actuator/configprops
在pom.xml文件,加上下面的依赖即可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 复制代码
当然,你也可以直接进入源码查看,也是可以的。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内存,线程数经验值 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的值
复制代码
明显,这里的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的限制。
调优配置生效确认
调优之后:性能对比
未优化性能表:
并发数/ 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调优的分享了。
个人得实操,可能也有些不足,大家轻点喷!!!
个人理解,也可能不够全面,班门弄斧了。
如果觉得有收获的,帮忙点赞、评论、收藏
一下呗!!!