iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >解决SpringBoot内嵌Tomcat并发容量的问题
  • 590
分享到

解决SpringBoot内嵌Tomcat并发容量的问题

2024-04-02 19:04:59 590人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

一、SpringBoot内嵌Tomcat默认配置与优化 在做一个关于秒杀系统的模块,进行jmeter压测性能的时候发现tomcat并发上不去,深入原因找到可供优化的地方,力求最大性能

一、SpringBoot内嵌Tomcat默认配置与优化

在做一个关于秒杀系统的模块,进行jmeter压测性能的时候发现tomcat并发上不去,深入原因找到可供优化的地方,力求最大性能。

发现并发容器问题

对单接口进行6000线程压测,每个线程请求5次,线程在5秒内创建完毕,当进行一半的时候,已经出现了请求响应时间过大及其错误率达到了43%。这个并发容量对于配置比较好点的服务器相对来说有点弱。

深入springBoot底层了解原因

在SpringBoot官方文档中提到了关于元数据的配置

可以看到,关于我们最常用的设置项目的端口的默认配置就在其中。

默认内嵌Tomcat配置

1、server.tomcat.accept-count:等待队列长度,当可分配的线程数全部用完之后,后续的请求将进入等待队列等待,等待队列满后则拒绝处理,默认100。

2、server.tomcat.max-connections:最大可被连接数,默认10000

3、server.tomcat.max-threads:最大工作线程数,默认200,

4、server.tomcat.min-spare-threads:最小工作线程数,初始化分配线程数,默认10

默认配置下,连接超过10000后会出现拒绝连接情况

默认配置下,触发的请求超过200+100后拒绝处理(最大工作线程数+等待队列长度)

这些元数据Spring当然提供了外部配置功能


#更改内嵌tomcat参数
server.port=8080
## 等待队列长度,默认100。
server.tomcat.accept-count=1000
## 最大工作线程数,默认200。(4核8g内存,线程数经验值800,操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。)
server.tomcat.max-threads=800
## 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)
server.tomcat.min-spare-threads=100

SpringBoot内置Tomcat,在默认设置中,Tomcat的最大线程数是200,最大连接数是10000。支持的并发量是指连接数,200个线程如何处理10000条连接的?

目前Tomcat有三种处理连接的模式,一种是BIO,一个线程只处理一个连接,另一种就是NIO,一个线程处理多个连接。由于Http请求不会太耗时,而且多个连接一般不会同时来消息,所以一个线程处理多个连接没有太大问题。

还有一种是apr模式,后续会详细介绍一下tomcat的这三种模式,这里不做深入讨论。

Tomcat启动的时候,可以通过log看到Connector使用的是哪一种运行模式:


Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["http-nio-8080"]
Starting ProtocolHandler ["http-apr-8080"]

默认值可以在spring-boot-autoconfigure-版本号.jar(比如:spring-boot-autoconfigure-2.1.0.RELEASE) 包中看到,解压反编译/WEB/ServerProperties.class文件就可以看到默认配置。

定制化内嵌Tomcat开发

关于KeepAlive

在使用Jmeter的Http请求中默认是开启KeepAlive的

Http的KeepAlive请求为当我们的客户端向我们的服务器发送Http请求的时候,若带上了KeepAlive的请求头,则表明我们的Http客户端希望跟服务端之间建立一个KeepAlive的连接,这个连接对应的用处就是说,向我们的服务端发送完对应的响应之后,我们的服务端不要立马断开连接,而是等待尝试复用连接。

此解决方案是用来解决Http的一个响应,无状态,每次都要断开连接,新建连接所带来的一个耗时问题。

但如果说我们每个网页请求打开之后都跟服务端保持一个长连接,那我们服务端的连接数很快就会被用完了,因此再最早的Http1.0的时候是没有设计KeepAlive的请求的,但是现在的Http1.1加上KeepAlive请求,目的就是越来越多的移动端的设备,甚至于一些很复杂的网页交互,需要在用户浏览的过程当中,频繁的向服务端发送请求,因此,建立一个KeepAlive连接,并非为了压测的目的,而是真正的在应用场景上是有一些性能的好处的,无论是客户端还是服务端,在做一些网络通信的交互上面,无需每次都新建连接,断开连接,耗费tcp/Ip建连的时间,而仅仅只需要发送数据即可。

但是这样的设计也会带来一些问题,如果说我们的服务端对KeepAlive的操作没有做任何限制 1.连接不做任何操作,不做任何响应,那这条连接对服务端来说就是一条费连接 2.有一些攻击者恶意利用KeepAlive连接向我们的服务端发送DDOS的攻击,那服务端对应的连接只会成为攻击者攻击的后门,因此,为了安全,我们需要定制化Tomcat开发

配置

1、KeepAliveTimeOut:多少毫秒后客户端不响应则断开KeepAlive

2、maxKeepAliveRequests:多少次请求后KeepAlive断开失效

在SpringBoot官方文档中提到了对内嵌容器的配置


//当spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把bean加载进spring容器
@Configuration
public class WebServerConfiguration implements WebServerFactoryCustomizer<ConfigurableWebServerFactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
  //使用对应工厂类提供给我们的接口定制化我们的tomcat connector
  ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
    @Override
    public void customize(Connector connector) {
      Http11NioProtocol protocol= (Http11NioProtocol) connector.getProtocolHandler();
      //定制KeepAliveTimeout,设置30秒内没有请求则服务器自动断开keepalive连接
      protocol.seTKEepAliveTimeout(30000);
      //当客户端发送超过10000个请求则自动断开keepalive连接
      protocol.setMaxKeepAliveRequests(10000);
    }
  });
}
}

容器问题优化

响应时间变长,TPS上不去

单Web容器上限

线程数量:

4核CPU 8G内存单进程调用线程数800-1000,1000以上后即花费巨大的时间在CPU调度上

等待队列长度:

队列做缓冲池用,但也不能无限长,消耗内存,出队入队也耗CPU

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 解决SpringBoot内嵌Tomcat并发容量的问题

本文链接: https://www.lsjlt.com/news/127598.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解决SpringBoot内嵌Tomcat并发容量的问题
    一、SpringBoot内嵌Tomcat默认配置与优化 在做一个关于秒杀系统的模块,进行Jmeter压测性能的时候发现tomcat并发上不去,深入原因找到可供优化的地方,力求最大性能...
    99+
    2024-04-02
  • 怎么在SpringBoot中内嵌Tomcat并发容量
    怎么在SpringBoot中内嵌Tomcat并发容量?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。发现并发容器问题对单接口进行6000线程压测,每个线程请求5次,线程在5秒内创...
    99+
    2023-06-15
  • springboot内置tomcat支持最大的并发量问题怎么解决
    这篇文章主要介绍“springboot内置tomcat支持最大的并发量问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot内置tomcat支持最大的并发量问题怎么解决”文章...
    99+
    2023-07-05
  • springboot内置的tomcat支持最大的并发量问题
    目录springboot内置的tomcat支持最大的并发量Tomcat有两种处理连接的模式默认内嵌Tomcat配置提高tomcat并发量的几种方法总结springboot内置的tom...
    99+
    2023-03-12
    springboot内置tomcat springboot最大并发量 springboot并发量
  • tomcat高并发阻塞问题怎么解决
    要解决Tomcat高并发阻塞问题,可以考虑以下几个方面:1. 调整Tomcat配置:增加Tomcat的线程池大小、调整连接超时时间等...
    99+
    2023-10-12
    tomcat
  • springboot内置tomcat调优并发线程数解析
    目录前言参数线程池核心线程数线程池最大线程数请求最大连接数accept-counttomcat线程池处理机制总结前言 本文解析springboot内置tomcat调优并发线程数的一些...
    99+
    2024-04-02
  • springboot多线程高并发问题怎么解决
    要解决Spring Boot多线程高并发问题,你可以考虑以下几个方面:1. 线程池配置:合理配置线程池的大小、队列容量等参数,以满足...
    99+
    2023-08-24
    springboot
  • Redis解决高并发问题
    1 模拟商品抢购和并发的效果 这里模拟一个商品抢购的过程所带来的问题,以及解决问题的思路。 这里模拟的商品抢购过程是一个商品正常购买的过程,其中包含了两个主要的步骤:商品库存减少和商品购买记录的添加。...
    99+
    2023-09-21
    redis 数据库 mysql
  • 聊聊SpringBoot的@Scheduled的并发问题
    目录SpringBoot @Scheduled的并发spring @Scheduled 并发执行SpringBoot @Scheduled的并发 由于SpringBoot自带的@Sc...
    99+
    2024-04-02
  • PHP 容器技术能否解决并发负载问题?
    PHP 是一种非常流行的编程语言,它被广泛用于 Web 开发。但是,PHP 在处理并发负载时可能会遇到一些挑战。在这篇文章中,我们将探讨 PHP 容器技术是否能够解决这些问题。 什么是 PHP 容器技术? 在讨论 PHP 容器技术是否能解...
    99+
    2023-10-28
    并发 容器 load
  • 详解Mysql数据库平滑扩容解决高并发和大数据量问题
    目录1 停机方案2 停写方案3 平滑扩容之双写方案(中小型数据)4 平滑扩容之2N方案大数据量问题解决4.1 扩容问题4.2 解决方案4.3 双主架构思想4.4 环境部署5 数据库秒...
    99+
    2024-04-02
  • PHP解决高并发问题(opcache)
    php高并发之opcache 今天工作的时候接触到客户的一台服务器,业务逻辑比较简单 。估算pv在120w左右吧,用的是阿里云2c4g的服务器。一大早就开始卡顿了,登陆服务器后查看负...
    99+
    2024-04-02
  • mysql如何解决并发问题
    mysql并发的解决方法优化sql语句优化代码中sql语句,应尽量避免全表扫描,在 where 及 order by 涉及的列上建立索引;并避免频繁创建和删除临时表,以减少系统表资源的消耗。添加缓存缓存适合读多写少更新频度相对较低...
    99+
    2024-04-02
  • java并发问题如何解决
    Java中的并发问题可以通过以下几种方式来解决:1. 使用同步机制:可以使用synchronized关键字或者Lock接口来对共享资...
    99+
    2023-08-12
    java
  • 如何解决重复内容问题
    重复内容是SEO中常见的问题,它可能影响搜索引擎排名和网站信誉。解决重复内容问题主要包括:1、内容审查和识别、2、使用Canonical标签、3、301重定向、4、添加无索引元标签、5、优化内部链接结构、6、利用搜索引擎控制台工具。定期检查...
    99+
    2023-10-29
    如何解决 内容
  • 如何解决Spring Boot内嵌tomcat关于getServletContext().getRealPath获取得到临时路径的问题
    这篇文章主要介绍如何解决Spring Boot内嵌tomcat关于getServletContext().getRealPath获取得到临时路径的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题:使用getSe...
    99+
    2023-06-15
  • 关于SpringBoot 使用 Redis 分布式锁解决并发问题
    目录问题背景解决方案主要实现原理: 可靠性: SpringBoot 集成使用 Redis 分布式锁使用示例参考文档问题背景 现在的应用程序架构中,很多服务都是多副本运行,从而保证服务...
    99+
    2024-04-02
  • SpringBoot之QueryDsl嵌套子查询问题怎么解决
    今天小编给大家分享一下SpringBoot之QueryDsl嵌套子查询问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下...
    99+
    2023-07-05
  • SpringBoot如何使用 Redis 分布式锁解决并发问题
    这期内容当中小编将会给大家带来有关SpringBoot如何使用 Redis 分布式锁解决并发问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。问题背景现在的应用程序架构中,很多服务都是多副本运行,从而保证...
    99+
    2023-06-25
  • springboot并发访问很慢怎么解决
    当Spring Boot应用程序在并发访问时变慢,可能有以下几个原因和解决方法:1. 数据库连接池配置不合理:确保数据库连接池的最大...
    99+
    2023-08-09
    springboot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作