>  기사  >  Java  >  SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

WBOY
WBOY앞으로
2023-05-11 23:13:101286검색

동시 컨테이너 문제 발견

SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

단일 인터페이스에서 6000개의 스레드 스트레스 테스트를 수행했습니다. 스레드는 5초 내에 생성되었으며 요청 응답 시간은 이미 완료되었습니다. Oversize가 발생하여 오류율이 43%에 이르렀습니다. 이 동시 용량은 더 나은 구성을 갖춘 서버의 경우 상대적으로 약합니다.

이유를 이해하려면 SpringBoot의 하위 레이어에 깊이 들어가 보세요

메타데이터 구성은 공식 SpringBoot 문서에 언급되어 있습니다.

SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

가장 일반적으로 사용되는 설정 항목의 포트 기본 구성이 다음 중 하나임을 알 수 있습니다. 그들을.

기본 내장 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

기본 구성에서는 연결 수가 10,000을 초과하면 연결이 거부됩니다

아래 기본 구성에서는 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개이고 최대 연결 수는 10,000개입니다. 지원되는 동시성 양은 연결 수를 나타냅니다. 200개의 스레드가 어떻게 10,000개의 연결을 처리할 수 있습니까?

현재 Tomcat에는 연결을 처리하는 세 가지 모드가 있습니다. 하나는 하나의 스레드가 하나의 연결만 처리하는 BIO이고, 다른 하나는 하나의 스레드가 여러 연결을 처리하는 NIO입니다. HTTP 요청은 시간이 많이 걸리지 않고 일반적으로 여러 연결이 동시에 메시지를 수신하지 않기 때문에 하나의 스레드로 여러 연결을 처리하는 데 큰 문제가 없습니다.

apr 모드도 있습니다. Tomcat의 세 가지 모드는 나중에 자세히 소개할 것이므로 여기서는 깊이 다루지 않겠습니다.

Tomcat이 시작되면 로그를 통해 커넥터가 사용 중인 작동 모드를 확인할 수 있습니다.

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

기본값은 spring-boot-autoconfigure-version number.jar에 있을 수 있습니다(예: spring-boot-autoconfigure-2.1). .0.RELEASE) 패키지에서 /web/ServerProperties.class 파일의 압축을 풀고 디컴파일하여 기본 구성을 볼 수 있습니다.

SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

맞춤형 임베디드 Tomcat 개발

SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

KeepAlive 정보

KeepAlive는 Jmeter를 사용하는 Http 요청에서 기본적으로 활성화됩니다

Http의 KeepAlive 요청은 클라이언트가 서버에 Http를 보낼 때입니다. 요청할 때 KeepAlive 요청 헤더가 이는 우리 Http 클라이언트가 서버와 KeepAlive 연결을 설정하기를 원한다는 것을 의미합니다. 이 연결의 해당 목적은 해당 응답을 우리 서버에 보내는 것입니다. 그 후 우리 서버는 즉시 연결을 끊지 말고 기다려야 합니다. 연결을 재사용하십시오.

이 솔루션은 Http 응답, 상태 비저장, 연결 끊김 및 매번 새로운 연결로 인해 발생하는 시간 소모적인 문제를 해결하는 데 사용됩니다.

그러나 각 웹 페이지 요청이 열린 후 서버와의 연결을 오랫동안 유지하면 서버의 연결 수가 곧 소진될 것입니다. 따라서 초기 HTTP 1.0에서는 KeepAlive 요청이 설계되지 않았습니다. 그러나 현재 Http1.1과 KeepAlive 요청은 점점 더 많은 모바일 장치를 대상으로 하며 사용자의 탐색 프로세스 중에 서버에 자주 요청해야 하는 매우 복잡한 웹 페이지 상호 작용도 대상으로 합니다. 따라서 KeepAlive 연결을 설정하는 것은 아닙니다. 스트레스 테스트를 목적으로 하지만 클라이언트이든 서버이든 일부 네트워크 통신 상호 작용을 수행할 때 실제로는 일부 성능상의 이점이 있습니다. Tcp/IP 연결이 설정되었지만 데이터 전송만 필요합니다.

그러나 이러한 설계는 또한 몇 가지 문제를 가져올 것입니다. 만약 우리 서버가 KeepAlive의 작동에 어떠한 제한도 두지 않는다면 1. 연결이 어떤 작업도 수행하지 않거나 응답하지 않는다면 이 연결은 서버를 위한 것입니다. 1회 수수료 연결 2. 일부 공격자는 악의적으로 KeepAlive 연결을 사용하여 DDOS 공격을 서버에 보냅니다. 따라서 보안을 위해 Tomcat 개발을 사용자 정의해야 합니다

Configuration

1. KeepAlive가 연결 해제되기 전에 클라이언트가 응답하지 않는 수 밀리초

2. maxKeepAliveRequests: KeepAlive가 연결 해제되고 만료되는 요청 수

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

SpringBoot에 Tomcat 동시성 용량을 포함하는 방법

//当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);
    }
  });
}
}</configurablewebserverfactory>

위 내용은 SpringBoot에 Tomcat 동시성 용량을 포함하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제