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로 병렬 쓰레드 확인