AEM 스레드 덤프 분석
IBM 스레드 분석기 도구를 사용하여 AEM Java 스레드 덤프를 성공적으로 분석하려면 이 문서에 설명된 단계 및 모범 사례를 따르십시오.
설명 description
환경
Adobe Experience Manager
문제
IBM 스레드 분석기 도구를 사용하여 AEM Java 스레드 덤프를 분석하는 방법
해결 방법 resolution
-
IBM 스레드 분석기를 다운로드하고 설치합니다(줄여서 IBM TDA라고 함).
-
성능 문제가 발생한 AEM 인스턴스에서 스레드 덤프를 캡처합니다.
-
IBM TDA에서 스레드 덤프를 엽니다.
-
스레드 덤프의 세부 정보를 보려면 목록에서 파일을 선택한 다음 스레드 세부 정보 단추를 클릭하십시오.
-
맨 위에 가장 긴 스택이 있는 스택 깊이 별로 정렬합니다.
-
10줄 이상의 스택 깊이로 스레드를 검토합니다. 이러한 스레드는 일반적으로 가장 흥미 있는 스레드입니다.
관심 있는 스레드를 기록합니다.
-
스레드 상태 별로 정렬합니다.
-
실행 가능 스레드까지 아래로 스크롤합니다. 실행 가능한 스레드는 스레드 덤프 수행 시 적극적으로 CPU 타임이 필요한 스레드입니다.
참고: 실행 가능한 스레드를 검토할 때 이 페이지 하단에 있는 Threads 섹션에 나열된 스레드를 무시할 수 있습니다.
-
애플리케이션의 일부인 실행 가능한 스레드(예: 백그라운드 작업 스레드 또는 요청 스레드 등)를 검색합니다(요청 스레드에는 다음과 같은 이름 - 127.0.0.1
[
1347028187737]
GET /content/sites/global/en/sitemap.static-delivery.httpd.html HTTP/1.1).스레드가 검색되면 하나씩 클릭합니다.
-
각 요청 스레드에 대해 스레드 이름의 타임스탬프를 확인하여 사용자의 브라우저가 서버에 요청한 시간을 파악할 수 있습니다.
예를 들어 위의 스레드 이름에서 타임스탬프(밀리초 유닉스 에포크 형식 단위)는 1347028187737 입니다.
www.epochconverter.com을(를) 사용하여 해당 에포크 번호를 날짜/시간으로 변환할 수 있습니다.
각 스레드 덤프에 수행한 날짜와 시간이 표시됩니다.
요청 시간과 스레드 덤프 시간 차이를 비교하여 요청이 활성화된 기간을 확인할 수 있습니다.
-
요청 스레드를 검토한 후 다른 실행 가능한 스레드를 스크롤합니다.
실행할 수 있는 관심 스레드가 발견되면 중간 패널을 확인합니다. 대기 중인 스레드.
나열된 Threads은 선택한 스레드가 모니터를 릴리스할 때까지 대기합니다.
대기 중인 스레드가 표시되지 않으면 선택한 스레드가 계속 Lock의 소유자일 수 있습니다(자세한 내용은 Lock의 클래스 구현 참조).
예를 들어 잠금 기능이 여러 모니터를 내부적으로 구현하므로 ReentrantReadWriteLock을 사용하여 잠금 홀더인 스레드를 구별할 수 없습니다.
따라서 소스 코드를 확인하여 잠금 홀더일 수 있는 스레드와 일치시켜야 할 수도 있습니다.
-
스레드에 다른 여러 스레드가 대기 중인 잠금 기능이나 모니터가 있는 경우 나머지 스레드 덤프로 이동하여 문제가 같은 다른 스레드가 발견될 수 있는지 확인합니다.
동일한 스레드가 다른 덤프에 계속 있는지 확인합니다(IBM TDA에서 여러 스레드 덤프를 선택하고 Threads 비교 단추를 클릭하여 여러 스레드 덤프에서 스레드 상태를 볼 수 있음).
-
아래 스크린샷에서 Collector 서비스 를 참조하십시오.
-
이 보기에서 여러 스레드 덤프의 스레드를 확인하여 장기 실행 스레드인지 확인할 수 있습니다.
기본적으로 스레드가 여러 덤프에서 실행 가능 상태이고 스레드에 긴 스택이 있는 경우 오래 실행되는 스레드입니다.
-
실행 가능한 스레드가 많이 검색되지 않은 경우 스레드 목록으로 돌아가 스레드 덤프를 선택한 다음 상단 패널에서 세부 정보 모니터링 단추를 클릭합니다.
IBM TDA가 모니터 소유 스레드와 대기 스레드의 트리 보기를 표시하는 창을 엽니다.
참고: 서블릿 엔진 스레드 풀 모니터와 같은 일부 스레드 풀 스레드가 표시되고 유휴 스레드가 무시될 수 있습니다.
대부분의 경우 스택 줄이 10개 이하이므로 스레드가 유휴 스레드 풀 스레드임을 알 수 있습니다.
스레드 수준 CPU 사용률(Linux 플랫폼만 해당):
-
스레드 덤프 외에
top -H -b -n1 -p <javapid>
출력을 캡처한 경우 스레드 수준 CPU 사용률을 상호 참조할 수 있습니다.상위 출력을 열고 CPU를 사용하는 스레드의 프로세스 ID를 가져옵니다.
프로세스 ID를 16진수로 변환한 다음 해당 스레드 덤프 파일에서 해당 16진수 값을 검색합니다.
ID는 스레드 중 하나의 nid 와 일치해야 합니다.
-
대부분의 CPU를 사용하는 일치하는 스레드가 VM 스레드 또는 GC 스레드인 경우 메모리에 문제가 발생할 수 있습니다.
추가 스레드 덤프와 상위 출력에 대해 동일한 연습을 반복하고, 이러한 스레드의 패턴에 CPU 타임이 필요한 경우 메모리에 문제가 발생합니다.
-
메모리 문제가 확인되면 다음에 문제가 발생할 때 힙 덤프를 캡처합니다.
힙 덤프 캡처 및 분석에 대한 자세한 내용은 이 메모리 문제 분석 문서를 참조하십시오.
무시할 수 있는 Threads:
- VM 스레드: VM 시스템 스레드입니다.
- GC 작업 스레드로 시작하는 스레드: 가비지 수집 스레드입니다.
- [ 1347028691218] in code at java.net.PlainSocketImpl.socketAccept(Native Method)
과(와) 유사한 이름의 Threads: 새 연결을 기다리는 서블릿 엔진의 스레드 풀에서 가져온 스레드입니다.