흰 스타렉스에서 내가 내리지

그라파나 - 메트릭을 통한 문제 확인 예제 본문

모니터링

그라파나 - 메트릭을 통한 문제 확인 예제

주씨. 2023. 12. 18. 20:24
728x90

# 실무에서 많이 발생하는 대표적인 문제

  • CPU 사용량 초과
  • JVM 메모리 사용량 초과
  • 커넥션 풀 고갈
  • 에러 로그 급증

 

# CPU에 부하를 주는 코드 추가

@Slf4j
@RestController
public class TrafficController {
    @GetMapping("/cpu")
    public String cpu(){
        log.info("옛다 cpu 부하!!!!!");
        long value = 0;
        for (long i=0; i< 100000000000L; i++){
            value++;
        }
        return "ok value = " +  value;
    }
}

 

 

# cpu 부하 주는 api 실행

CPU 그래프가 튀었다
스레드도 하나 튀었다

 

 

# JVM 메모리 사용 누적하는 코드

private List<String> list = new ArrayList<>();

@GetMapping("/jvm")
public String jvm(){
    log.info("jvm");
    for (int i=0; i<1000000; i++){
        list.add("엤다 메모리부하!!" + i);
    }
    return "ok";
}

- 스프링빈은 싱글톤으로 만들어지기 때문에 List 생성을 함수 밖에 둔다. 

 

- /jvm 으로 요청하고, 계속 새로고침해서 계에에에속 요청해보자.

으아 삥글삥글돌아

죽어버림

 

- 보통은 GC가 이걸 방지헤준다. 

 

 

# 커넥션 풀 고갈

@Autowired
DataSource dataSource;

@GetMapping("/jdbc")
public String jdbc() throws SQLException{
    log.info("jdbc");
    Connection conn = dataSource.getConnection();
    log.info("connection info={}", conn);
    //conn.close();  // 커넥션을 닫지 않는다.
    return "ok";
}

 

- 총 10번 API 요청을 해본다.

- 커넥션이 10번 이루어져 Active가 MAX를 쳤다.

- 여기서 한번 더 요청한다면,

- Active 커넥션이 커넥션 풀의 최대 숫자인 10개를 넘어가게 되면, 커넥션을 획득하기 위해 대기(Pending)하게 된다. 

- 그래서 커넥션 획득 부분에서 대기하게 되고 결과적으로 HTTP 요청에 응답하지 못한다. 

- DB 커넥션을 획득하기 위해 대기하던 톰캣 쓰레드가 30초 이상 DB커넥션을 획득하지 못하면 다음과 같은 예외가 발생하면서 커넥션 획득을 포기한다.

Tomcat의 커넥션 획득 포기

 

 

# 에러 로그 급증

- ERROR 레벨의 로그가 급증한다면 심각한 문제가 발생한 것으로 볼 수 있다. 

@GetMapping("/error-log")
public String errorLog(){
    log.error("error log");
    return "error";
}

 

에러 로그 급증