목표

IBM Thread Analyzer 도구를 사용하여 AEM Java Thread Dump를 분석합니다.

단계

  1. IBM Thread Analyzer(간단히 IBM TDA라고 함)를 다운로드하여 설치합니다.
  2. 성능 문제가 발생한 AEM 인스턴스에서 스레드 덤프를 캡처합니다.
  3. IBM TDA에서 스레드 덤프를 엽니다.
  4. 스레드 덤프의 세부 사항을 보려면 목록에서 파일을 선택한 다음 "Thread Detail" 버튼*을 클릭합니다.
tda-threaddetail
  1. 가장 긴 스택이 맨 위에 오도록 하여 "Stack Depth"를 정렬합니다.
tda-image1
  1. 스택 깊이가 10줄 이상인 스레드를 검토합니다.  일반적으로 그러한 스레드에 가장 관심이 많습니다.  관심 있는 스레드에 대해 기록해 둡니다.
  2. 스레드 "상태"별로 정렬합니다.
  3. "실행 가능" 스레드로 스크롤합니다. 실행 가능한 스레드는 스레드 덤프를 수행할 때 CPU 시간을 능동적으로 차지한 스레드입니다.

참고: "실행 가능" 스레드를 검토할 때 이 페이지 하단에서 Threads that can be ignored에 나열된 스레드는 무시할 수 있습니다.

  1. 응용 프로그램의 일부인 실행 가능한 스레드를 찾습니다. 예: 백그라운드 작업 스레드 또는 요청 스레드(요청 스레드의 이름은 127.0.0.1 [1347028187737] GET /content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1과 비슷함). 그러한 스레드를 찾으면 스레드를 하나씩 클릭합니다.
  2. 각 요청 스레드에 대해 사용자의 브라우저에서 스레드 이름의 타임스탬프를 보고 서버에 요청한 시간을 확인할 수 있습니다.  예를 들어, 위의 스레드 이름에서 타임스탬프(밀리초 unix epoch 형식)는 1347028187737입니다.www.epochconverter.com을 사용하여 해당 시기 번호를 날짜/시간으로 변환할 수 있습니다.  각 스레드 덤프는 찍은 날짜와 시간을 보여줍니다.  요청 시간과 스레드 덤프 시간 사이의 시간차를 가져와서 요청이 활성화된 시간을 확인할 수 있습니다.
  3. 요청 스레드를 검토한 후에 다른 "실행 가능" 스레드를 스크롤합니다.  관심 있는 "실행 가능" 스레드를 찾으면 중간 패널에서 "대기 중인 스레드"를 확인합니다.  여기에 나열된 스레드는 선택된 스레드가 모니터를 해제할 때까지 기다립니다.  대기 중인 스레드가 표시되지 않으면 선택한 스레드가 여전히 잠금의 소유자일 수 있습니다(자세한 내용은 잠금 클래스 구현 참조). 예를 들어, ReentrantReadWriteLock을 사용하면 잠금이 여러 모니터를 내부적으로 구현하므로 어느 스레드가 잠금 홀더인지 알 수 없습니다.  따라서 소스 코드에서 잠금 홀더일 수 있는 스레드와 일치하는지 확인해야 할 수도 있습니다.
  4. 스레드에 다른 스레드가 대기 중인 잠금이나 모니터가 있는 경우 나머지 스레드 덤프에서 동일한 문제가 있는 다른 스레드를 찾을 수 있는지 확인합니다.  동일한 스레드가 다른 덤프에 여전히 존재하는지 확인합니다(IBM TDA에서 여러 개의 스레드 덤프를 선택하고 "스레드 비교" 버튼*을 클릭하여 여러 스레드 덤프에서 스레드의 상태를 볼 수 있음).
tda-comparethreads
  1. 아래 스크린샷에서 Collector Service를 참조하십시오.
tda-Image2
  1. 이 보기에서는 여러 스레드 덤프에서 스레드가 장기 실행 스레드인지 확인할 수 있습니다.  기본적으로 스레드가 여러 덤프에서 실행 가능 상태에 있고 긴 스택을 갖고 있으면 장기 실행 스레드라는 의미입니다.
  2. 실행 가능한 스레드를 많이 찾지 못한 경우 스레드 목록으로 돌아가서 스레드 덤프를 선택한 다음 상단 패널의 "Monitor Detail" 버튼*을 클릭합니다. IBM TDA에 창이 열리고 모니터 소유 스레드 및 해당 대기 스레드가 트리 보기로 표시됩니다. 참고: 서블릿 엔진 스레드 풀 모니터와 같은 일부 스레드 풀 스레드가 표시될 수 있고, 유휴 스레드가 무시될 수 있습니다.  대부분 스레드에는 스택 줄이 10개 이하로 있기 때문에 스레드를 유휴 스레드 풀 스레드라고 할 수 있습니다.
tda-monitordetail
  1. 상단 패널에서 "Find long-running threads" 버튼(이 버튼에는 망원경 아이콘이 있음)을 클릭합니다.
  2. 이제 왼쪽 하단에는 스레드 덤프 뒤에 새 아이콘이 표시됩니다. 이 아이콘을 클릭하면 장기 실행 스레드가 모두 표시됩니다.
  3. 오른쪽 창에서 "상태"별로 다시 정렬합니다.
  4. 실행 가능한 스레드까지 아래로 스크롤하여 덤프 전체에서 실행 중인 상태에 있는 스레드를 찾습니다.
스레드 수준의 CPU 사용률(Linux 플랫폼 전용):
  1. 스레드 덤프 외에 "top -H -b -n1 -p <javapid>" 출력을 캡처한 경우 스레드 수준의 CPU 사용률을 상호 참조할 수 있습니다.  최상위 출력을 열고 CPU를 사용하는 스레드의 프로세스 ID를 가져옵니다.  이 프로세스 ID를 16진수로 변환한 다음 해당 스레드 덤프 파일에서 해당 16진수 값을 검색합니다.  이 ID는 스레드 중 하나의 "nid"와 일치해야 합니다.
  2. 대부분의 CPU를 사용하는 일치하는 스레드가 "VM 스레드"이거나 "GC" 스레드인 경우 메모리 문제가 발생할 수 있습니다.  더 많은 스레드 덤프와 맨 위 출력에 대해 동일한 작업을 반복하고, 이러한 스레드에서 CPU 시간을 사용하는 패턴이 있으면 메모리 문제가 있는 것입니다.
  3. 메모리 문제를 확인한 경우에는 다음에 문제가 발생했을 때 힙 덤프를 캡처합니다.  힙 덤프 캡처 및 분석에 대한 자세한 내용은 이 문서를 참조하십시오.

무시할 수 있는 스레드:

  • VM 스레드: VM 시스템 스레드입니다.
  • GC 작업 스레드로 시작하는 스레드: 가비지 컬렉션 스레드입니다.
  • java.net.PlainSocketImpl.socketAccept(네이티브 메서드)에서 코드의 [1347028691218]과 이름이 비슷한 스레드: 새로운 연결을 대기 중인 서블릿 엔진의 스레드 풀에 있는 스레드입니다.

이 작업에는 Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License의 라이센스가 부여되었습니다.  Twitter™ 및 Facebook 게시물은 Creative Commons 약관을 적용받지 않습니다.

법적 고지 사항   |   온라인 개인 정보 보호 정책