java
VisualVM 테스트 1 : 쓰레드 부하, Cpu 부하 확인
다름임
2025. 5. 2. 17:54
기존 프로젝트에서 VisualVM 을 적용하여 테스트 해보았다
작성한 코드 :
package com.fastcampus.gearshift.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class CallController {
// 10초간 쓰레드 대기 (VisualVM에서 쓰레드 확인용)
@GetMapping
public String getTestMessage() throws InterruptedException {
Thread.sleep(10000L);
return "test";
}
// 10초간 CPU 연산 부하 테스트
@GetMapping("/cpu")
public String getCpuTest() {
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < 10000) {
Math.pow(Math.random(), Math.random()); // CPU 소모
}
return "cpu test done";
}
}
1.
쓰레드 부하 확인: http://localhost:8080/gearshift/test
결과 :
http-nioi-8080-exec-5가
10 초 동안 sleep 한다음 테스트 후 아래처럼 변했다
해석 :
[1] Threads 탭 결과 (http-nio-8080-exec-*)
- http-nio-8080-exec-4, exec-7 등이 Running, Wait 상태로 표시됨
- 13,095ms, 11,106ms처럼 일정 시간 실행된 쓰레드가 확인됨 → Thread.sleep(10000) 정상 작동!
- 이 쓰레드들은 HTTP 요청을 처리하느라 블로킹되었다가 종료됨
결론: getTestMessage()의 Thread.sleep(10000)으로 Tomcat 쓰레드 대기 부하 확인 완료
[2] Monitor 탭 결과
- CPU Usage는 낮음 (~0.6%)
→ 예상대로 sleep()은 CPU를 거의 사용하지 않음 - Heap 사용량도 안정적이며, 큰 GC는 없음
- Live threads는 피크 시점에 34개 → 테스트 도중 쓰레드 수 증가 확인됨
결론: 시스템 리소스 사용은 안정적이며, sleep 기반 테스트에 적합
2.
CPU 부하 확인: http://localhost:8080/gearshift/test/cpu
결과 :
http-nio-8080-exec-4 가 주황색으로 Park 였다가 점점 Running으로 변함
결과 :
결과 해석
🔹 Threads 탭
- http-nio-8080-exec-4와 exec-7 등의 쓰레드가 Running 상태로 10초 내외 동작 → getCpuTest() 메서드의 루프 연산이 CPU를 사용한 것
- 이전의 Thread.sleep() 테스트와 달리, Park 상태 없이 실제 연산으로 CPU를 점유한 것 확인됨
🔹 Monitor 탭
- CPU Usage가 이전보다 상승한 패턴 확인됨
- GC activity: 0% → GC는 발생하지 않았고, 힙 메모리도 안정적
정상적인 CPU 부하 시뮬레이션 결과입니다. VisualVM으로도 CPU가 사용되었고, 해당 쓰레드가 계산을 수행한 게 잘 보입니다.
정리: 두 가지 부하 모두 성공
테스트상태결과 요약
Thread.sleep 기반 쓰레드 블로킹 테스트 | 완료 | 쓰레드 상태 WAIT, Tomcat exec 증가 확인 |
CPU 부하 테스트 (연산 루프) | 완료 | 쓰레드 RUNNING, CPU usage 증가 확인 |
Parked → Running 전환이 일어나는 이유
🔸 Park 상태란?
- Java 쓰레드가 작업이 없어 기다리는 상태입니다.
- 예를 들어 Tomcat의 HTTP 요청 처리 쓰레드는 요청이 들어올 때까지 Park 상태로 대기합니다.
🔸 요청이 들어오면?
- http://localhost:8080/test/cpu 같은 요청이 들어오면,
- Tomcat 쓰레드 풀의 exec-* 쓰레드 하나가 깨워져(unpark) Running 상태로 진입
- 그 후 Math.pow(Math.random(), Math.random()) 연산을 10초간 수행하며 CPU 사용
🔸 연산이 끝나면?
- 다시 Park 또는 Wait 상태로 되돌아가며 다음 요청 대기
요약 흐름
1. 기본 상태: http-nio-8080-exec-* → PARK
2. 요청 들어옴 → RUNNING (CPU 연산 수행)
3. 연산 종료 → 다시 PARK 상태
- Tomcat의 쓰레드가 정상적으로 동작하고 있고
- 여러분의 부하 테스트가 시스템에 실제 영향을 주고 있다는 것
- 즉, VisualVM 분석을 위한 구조는 완성되었다고 볼 수 있어요.
다음으로 해 볼 수 있는 테스트
메모리 부하 테스트 | List<byte[]> 등에 할당 반복 → 힙 메모리 증가 확인 |
GC 테스트 | 메모리 할당 후 System.gc()로 GC 유도 |
비동기 테스트 | @Async나 ExecutorService로 병렬 쓰레드 확인 |