1. 소개
2. 의존성
spring-boot-starter-web
에 대한 의존성을 선언해야합니다 .일반적으로 부모를spring-boot-starter-parent
로 지정한 다음 원하는 스타터를 포함합니다.<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.1. Tomcat
Spring-boot-starter-web을
사용할 때 기본적으로 포함되므로 Tomcat을 사용할 때 추가 의존성이 필요하지 않습니다 .2.2. Jetty
tomcat
을 제외해야합니다 .그런 다음 단순히spring-boot-starter-jetty
에 대한 의존성을 선언합니다 .<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
2.3. Undertow
Spring-boot-starter-undertow
를 의존성으로 사용한다는 점을 제외하면 Jetty와 동일합니다 .<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
2.4. 액추에이터
pom
에 의존성을 추가하여 사용할 수 있도록합니다.<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.5. Apache 벤치
ab.exe
를 찾을 수 있습니다 .Linux 시스템을 사용하는 경우 다음 과 함께 apt-get 을 사용하여ab
를 설치할 수 있습니다 .$ apt-get install apache2-utils
3. 시작 메트릭
3.1. 수집
ApplicationReadyEvent
에서 실행할 이벤트 핸들러를 등록합니다 .Actuator 구성 요소에서 사용 하는MeterRegistry
를 직접 사용하여 관심있는 메트릭을 프로그래밍 방식으로 추출합니다 .@Component
public class StartupEventHandler {
// logger, constructor
private String[] METRICS = {
"jvm.memory.used",
"jvm.classes.loaded",
"jvm.threads.live"};
private String METRIC_MSG_FORMAT = "Startup Metric >> {}={}";
private MeterRegistry meterRegistry;
@EventListener
public void getAndLogStartupMetrics(
ApplicationReadyEvent event) {
Arrays.asList(METRICS)
.forEach(this::getAndLogActuatorMetric);
}
private void processMetric(String metric) {
Meter meter = meterRegistry.find(metric).meter();
Map<Statistic, Double> stats = getSamples(meter);
logger.info(METRIC_MSG_FORMAT, metric, stats.get(Statistic.VALUE).longValue());
}
// other methods
}
Actuator REST 엔드 포인트를 수동으로 쿼리하거나 이벤트 핸들러 내에서 시작시 흥미로운 메트릭을 로깅하여 독립형 JMX 콘솔을 실행할 필요가 없습니다.
3.2. 선택
- jvm.memory.used – 시작 이후 JVM에서 사용한 총 메모리
- jvm.classes.loaded –로드 된 총 클래스 수
- jvm.threads.live – 총 활성 스레드 수입니다. 테스트에서이 값은 "휴지 상태"의 스레드 수로 볼 수 있습니다.
4. 런타임 메트릭
4.1. 수집
/ metrics
엔드 포인트를 대상 URL로 사용하여 애플리케이션을로드합니다.부하가 걸린 실제 애플리케이션을 테스트하기 위해 대신 애플리케이션에서 제공하는 엔드 포인트를 사용할 수 있습니다.서버가 시작되면 명령 프롬프트가 표시되고ab를
실행합니다 .ab -n 10000 -c 10 http://localhost:8080/actuator/metrics
위의 명령에서 10 개의 동시 스레드를 사용하여 총 10,000 개의 요청을 지정했습니다.
4.2. 선택
초당 요청 및 요청 당 시간 (평균)에 중점을 두었습니다.
5. 결과
Tomcat, Jetty 및 Undertow의 메모리 풋 프린트
는 다른 두 개보다 약간 더 많은 메모리를 필요로하는 Undertow 및 가장 적은 양을 필요로하는 Jetty와 비슷 하다는 것을 발견했습니다 .벤치 마크의 경우 Tomcat, Jetty 및 Undertow의 성능이 비슷
하지만 Undertow가 분명히 가장 빠르고 Jetty가 약간 느리다는 것을 발견했습니다.
미터법 | Tomcat | Jetty | Undertow |
---|---|---|---|
jvm.memory.used (MB) | 168 | 155 | 164 |
jvm.classes.loaded | 9869 | 9784 | 9787 |
jvm.threads.live | 25 | 17 | 19 |
초당 요청 | 1542 년 | 1627 년 | 1650 년 |
요청 당 평균 시간 (밀리 초) | 6.483 | 6.148 | 6.059 |
6. 벤치 마크 토론
사용 사례에서 무엇이 중요한지 명확하게 이해하는 것이 중요합니다
.이 예제에서 수집 된 벤치 마크 측정은 Actuator 엔드 포인트에 대한 HTTP GET 요청으로 구성된 매우 구체적인 워크로드를 사용하여 수행되었습니다.서로 다른 워크로드는 컨테이너 구현 전반에 걸쳐 서로 다른 상대적 측정 결과를 초래할 것으로 예상됩니다
. 더 견고하거나 정확한 측정이 필요한 경우 프로덕션 사용 사례와 더 근접하게 일치하는 테스트 계획을 설정하는 것이 좋습니다.또한 또는 과 같은보다 정교한 벤치마킹 솔루션 은 더 가치있는 통찰력을 얻을 수 있습니다.7. 컨테이너 선택
적절한 컨테이너 구현을 선택하려면 몇 가지 측정 항목만으로는 깔끔하게 요약 할 수없는 여러 요소를 기반으로해야합니다
. 편안함 수준, 기능, 사용 가능한 구성 옵션 및 정책은 그 이상은 아니지만 똑같이 중요합니다.8. 결론
참고
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-boot-servlet-containers
'Java' 카테고리의 다른 글
Spring 5 기능성 Bean 등록 (0) | 2021.03.18 |
---|---|
Spring MVC의 세션 속성 (0) | 2021.03.18 |
Apache Shiro 소개 (0) | 2021.03.17 |
HTTP 호출자를 사용한 Spring Remoting 소개 (0) | 2021.03.17 |
Thymeleaf를 사용한 Spring Boot CRUD 애플리케이션 (0) | 2021.03.17 |