CHAP 09. 스레드 단면 잘라 놓기

자바 트러블슈팅: scouter를 활용한 시스템 장애 진단 및 해결 노하우를 챕터 9을 요약한 내용입니다.

스레드에서 발생하는 모든 문제점들을 쉽게 찾을 수 있는 도구는 많지 않다. 그중에서 데드록이 발생했거나 록이 걸려 여러 스레드가 그 록이 풀리기만을 기다리고 있을 때, 문제를 찾는 가장 좋은 방법이 바로 스레드 단면을 확인하는 것이 간단하다. 게다가 시스템의 CPU가 100%에 도달하면 대부분의 모니터링 도구가 무용지물이 되기 때문에, 스레드 단면을 만들고 이해하는 방법을 알아 두는 것은 매우 중요하다.

스레드 단면은 언제 자를까?

현재 운영 중인 시스템에 문제가 있을 때, APM 같은 도구들이 없다면 반드시 스레드 단면을 잘라 봐야 한다. 그것도 한 번으로는 부족하다. 적어도 두 번, 많으면 10~30초에 한 번씩 적어도 열번 정도는 단명을 생성해서 확인 작업을 수행해야만 한다. 스레드 단면을 분석하면 다음의 경우에 매우 빨리 원인을 찾을 수 있다.

  • 모든 시스템이 응답이 없을 때(전문가들은 시스템 행이 걸렸다고 말한다)

  • 사용자 수가 많지도 않은데, 시스템의 CPU 사용량이 떨어지지 않을 떄

  • 특정 애플리케이션을 수행했는데, 전혀 응답이 없을 때

  • 기타 여러 가지 상황에서 시스템이 내 마음대로 작동하지 않을 때

스레드 단면이 뭐길래

스레드 단면은 보통 스레드 덤프라고 한다. 스레드 덤프를 생성하는 명령어를 수행하면, 수행한 그 시점에 JVM에서 수행되고 있는 모든 스레드가 무슨 일을 하고 있는지 알 수 있다.

다음의 샘플 프로그램을 보자

public class MakeThreads {

    public static void main(String[] args) {
        for(int loop =0; loop < 3; loop++){
            LoopingThread thread  = new LoopingThread();
            thread.start();
        }
        System.out.println("Started looping threads..." + " You must stop this process after test...");
    }
}
class LoopingThread extends Thread {

    @Override
    public void run() {
        int runCount = 100;
        while (true) {
            try {
                String string = new String("AAA");
                List<String> list = new ArrayList<>(runCount);
                for(int loop =0; loop < runCount; loop++){
                    list.add(string);
                }
                Map<String, Integer> hashMap = new HashMap<>(runCount);
                for(int loop = 0; loop < runCount; loop++){
                    hashMap.put(string + loop, loop);
                }
            } catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

이제 소스를 실행해보자

스레드 단면 생성하기

방법은 간단하다.

  1. 클래스 파일의 결과 로그를 특정 파일에 작성한다.

  2. control + \ 키를 누르면 스레드 단면을 생성 할 수 있다.

jstack을 사용하는 방법도 있다

kill 명령어를 사용하는 것이 불안하다면, 자바에서 기본적으로 제공하는 jstack이라는 명령어를 사용하는 방법도 있다. jstack 명령어를 수행하면 특정 프로세스의 단면을 생성하라고 강제로 지시하는 명령어다.

스레드 단면 해부하기

본격적으로 스레드 단면이 어떻게 되어 있는지 순서를 살펴보자

  1. 스레드 단면 생성 시간 정보

  2. JVM에 대한 정보

  3. 각 스레드의 스택을 포함한 다양한 정보

    • 스레드 이름

    • 식별자: 데몬 스레드일 경우에만 표시

    • 스레드 우선순위: 가장 낮은 것이 1, 높은 것이 10이다.

    • 스레드 ID(tid): 다른 스레드와 구분되는 스레드의 ID를 나타낸다. 정확하게 말하면, 해당 스레드가 점유하는 메모리의 주소를 표시한다.

    • 네이티브 스레드 ID(nid): OS에서 관리하는 스레드의 ID를 나타낸다.

    • 스레드의 상태: 스레드 단면을 생성할 때 해당 스레드가 하고 있던 작업에 대한 설명

    • 주소 범위: 스레드의 스택 영역의 예상된 주소 범위

  4. 데드록에 대한 정보

  5. 힙 영역의 사용 현황

참고

Last updated

Was this helpful?