JVM에서 스레드 덤프 가져오기

스레드 덤프는 현재 JVM(Java Virtual Machine)에서 활성화된 모든 Java 스레드 목록입니다. 이 문서에서는 Adobe Experience Manager 내의 JVM에서 스레드 덤프를 가져오는 여러 방법에 대해 설명합니다.

설명 description

환경

Adobe Experience Manager

문제/증상

Linux, UNIX 또는 Windows의 JVM에서 스레드 덤프를 가져오는 방법

스레드 덤프는 현재 JVM(Java Virtual Machine)에서 활성화된 모든 Java 스레드 목록입니다.

JVM에서 스레드 덤프를 가져오는 방법에는 여러 가지가 있습니다. 1개 이상의 스레드 덤프를 사용하는 것이 좋습니다. 정기적으로 10개의 스레드 덤프를 수행하는 것이 좋습니다(예: 10초마다 1개의 스레드 덤프).

해결 방법 resolution

1단계: Java 프로세스의 PID 가져오기

스레드 덤프를 가져오기 위해 필요한 첫 번째 정보는 Java 프로세스의 PID입니다.

Java JDK는 모든 Java 프로세스 ID를 나열하는 jps 명령과 함께 제공됩니다. 다음과 같이 이 명령을 실행할 수 있습니다.

jps -l 70660 sun.tools.jps.Jps 70305

참고: Linux 및 UNIX에서는 이 명령을 sudo -u user jps -l(으)로 실행해야 할 수 있습니다. 여기서 "user"는 Java 프로세스가 실행 중인 사용자의 사용자 이름입니다.

작동하지 않거나 Java 프로세스(경로가 설정되지 않았거나 JDK가 설치되지 않았거나 이전 Java 버전)를 찾을 수 없는 경우

  • UNIX, Linux 및 Mac OS X: ps -el | grep java
  • Windows: 작업 관리자를 열고 Java 프로세스의 PID를 찾으려면 Ctrl+Shift+Esc를 누릅니다.

2단계: JVM에서 스레드 덤프 요청

jstack

설치/사용 가능한 경우 jstack 도구를 사용하는 것이 좋습니다. 명령줄 콘솔에 스레드 덤프를 인쇄합니다.

jstack을 사용하여 스레드 덤프를 가져오려면 다음 명령을 실행합니다.
jstack -l <pid>

console output redirect/append 지시문을 사용하여 연속적인 스레드 덤프를 파일로 출력할 수 있습니다.
jstack -l <pid> >> threaddumps.log

참고:

  • jstack 도구는 JDK 1.5 이후 사용할 수 있습니다(Windows의 JVM인 경우 일부 버전의 JDK 1.5 및 JDK 1.6에서만 사용 가능).

  • jstack은 -Xrs jvm 매개 변수가 활성화되어 있더라도 작동합니다.

  • JDK 1.6의 jstack 도구를 사용하여 JDK 1.5에서 실행되는 프로세스에서 스레드덤프를 가져올 수 없습니다.

  • Linux 및 UNIX에서는 Java 프로세스를 소유한 사용자로 명령을 실행해야 합니다.
    sudo -u java-user jstack -l <pid>

    (< java-user>은(는) Java 프로세스가 실행 중인 사용자의 ID로 대체해야 합니다.)

  • Windows에서 jstack을 실행하고 "이 명령을 처리하는 데 사용할 수 있는 저장소가 충분하지 않음" 오류가 발생하면 jstack을 windows SYSTEM 사용자 또는 Java 프로세스를 소유한 사용자로 실행해야 합니다. 여기에서 다운로드할 수 있는 psexec를 사용하여 이를 수행할 수 있습니다. jstack을 SYSTEM 사용자로 실행하려면 다음과 같은 명령을 사용합니다.

    psexec -s jstack <pid>   >> threaddumps.log

    서버에 psexec를 설치할 수 없는 경우 명령을 포함하는 .bat 파일을 만들고 다른 사용자로 Windows 작업 스케줄러를 사용하여 실행할 수 있습니다.

  • Java 프로세스가 응답하지 않으면 다음과 같은 경우에 옵션 -J-d64(64비트 시스템에서)을 사용하는 데 도움이 될 수 있습니다.
    jstack -J-d64 -l   <pid>   >> threaddumps.log

  • jstack 명령(jstack -l <pid> >> threaddumps.log)에서 아래 [ 1] 오류가 발생하면 Java 프로세스를 소유한 사용자로 명령을 실행합니다. 예:
    sudo -u sling jstack -l <pid> >> threaddumps.log

Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

Caused by: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 22893: Operation not permitted

...

sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal$LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:138)

JSTACK 스크립트

jstack을 사용하여 일련의 스레드 덤프를 가져오는 script(eclipse.org의 스크립트에서 적용됨)가 있습니다. 또한 top 명령을 사용하는 스레드 수준 cpu 사용량도 필요합니다.

다음과 같이 실행하십시오.

sudo -u <user> jstackSeries.sh
<pid> <aemserveruser> <count> <delay>

예: sudo -u aemuser jstackSeries.sh 1234 aemserveruser 10 3

  • 1234 은(는) Java 프로세스의 PID입니다.
  • cq5serveruser 은(는) Java 프로세스가 실행되는 Linux 또는 UNIX 사용자입니다.
  • 10 은(는) 사용할 스레드 덤프 수입니다.
  • 3 은(는) 각 덤프 사이의 지연입니다.

참고: 최상위 출력에는 10진수 형식의 기본 스레드 ID가 있지만 jstack 출력에는 16진수의 nid가 있습니다. 스레드 ID를 16진수로 변환하여 상위 출력에서 jstack 출력으로 높은 cpu 스레드를 일치시킬 수 있습니다.

위의 스크립트 외에도 유사한 Windows Powershell 스크립트 및 github의 Adobe AEM 특정 스크립트가 있습니다.

스레드 덤프를 가져오는 다른 방법

jstack 도구를 사용할 수 없는 경우 다음과 같이 스레드 덤프를 사용할 수 있습니다.

참고: 명령줄 매개 변수 -Xrs을(를) 사용하도록 설정한 경우 일부 도구는 JVM에서 스레드 덤프를 가져올 수 없습니다. 스레드 덤프를 가져오는 데 문제가 있는 경우 이 옵션이 활성화되어 있는지 확인하십시오.

UNIX, Mac OS X 및 Linux(JDK 1.4 이하 버전)

UNIX, Mac OS X 및 Linux에서는 QUIT 신호를 Java 프로세스로 전송하여 스레드 덤프를 표준 출력으로 출력하도록 할 수 있습니다.

  1. 이 명령을 실행하여 다음을 수행합니다.
    kill -QUIT <pid>

    이 명령을 sudo -u user kill -QUIT <pid>(으)로 실행해야 할 수 있습니다. 여기서 "user"는 Java 프로세스를 실행 중인 사용자입니다.

  2. crx-quickstart/server/start 스크립트를 사용하여 CQSE를 시작하는 경우 스레드 덤프가 crx-quickstart/server/logs/startup.log에 출력됩니다. JBoss, WebSphere, Tomcat 또는 기타 같은 서드파티 애플리케이션 서버를 사용하는 경우 서버의 설명서를 참조하여 표준 출력이 대상으로 하는 파일을 확인하십시오.

Windows:

JDK 1.X

  1. javadump.exe를 다운로드합니다(아래 첨부).
  2. 다음 세 개의 인수를 사용하여 JVM을 시작합니다(올바른 순서여야 함).
    -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile= C:\temp\jvmoutput.log
  3. Ctrl+Shift+Esc를 눌러 작업 관리자를 엽니다.
  4. Java 프로세스의 PID를 찾습니다.
  5. 명령줄에서 javadump.exe   <pid>을(를) 실행합니다.
  6. 스레드 덤프가 2단계에서 언급된 jvmoutput.log 파일에 나타납니다.

JDK 1.6

플러그 인을 사용하여 jconsole 도구에서 스레드 덤프를 가져옵니다. [ 0]

스레드 덤프를 요청하는 방법은 다음과 같습니다.

  1. Communique를 실행하는 jvm에 다음 매개 변수를 추가합니다.
    Dcom.sun.management.jmxremote
  2. JDK 1.6(아직 설치되지 않은 경우)을 다운로드하여 설치합니다.
  3. 스레드 덤프 분석기 유틸리티를 다운로드하고 추출합니다. [ 1]
  4. JDK 1.6의 jconsole.exe 실행:
    jconsole.exe -pluginpath /path/to/file/tda.jar
  5. 스레드 덤프 탭을 클릭합니다.
  6. 요청 스레드 덤프 링크를 클릭합니다.

참고: AEM 6.x를 실행 중이며 실행 중인 스레드를 관찰하려는 경우 http://<host>:<port>/system/console/status-Threads에 스레드 목록을 가져오도록 요청할 수 있습니다. 그러나 이러한 스레드 덤프는 사무라이나 tda와 같은 스레드 덤프 분석 도구에서는 작동하지 않습니다.

적용 대상:

JVM에서 실행되는 모든 Adobe 제품

스레드 덤프 분석 도구

Microsoft 설명서의 Sysinternals에서 [ 0] PsExec v2.42.

[ 1] TDA - Github.com의 irocel/tda에서 스레드 덤프 분석기.

FastThread의 [ 2] Java 스레드 덤프 분석기.

Java용 [ 3] IBM 스레드 및 모니터 덤프 분석기 on IBM Support Assistant 설명서.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f