2022년 3월 26일 토요일

SAP PO 스레드 로그(Thread Dump) 특징과 상태

스레드 상태

SAP PO에서 대용량사이즈 유입이나 부하를 주는 로직 등으로 인해 OOM(OutOfMemory)가 발생되는 경우가 있는데 이때 발생되는 Thread나 Heap 덤프분석파일이 nwa > troubleshooting > Advanced... 메뉴에 생성되네요. 이 파일 내용을 보고 덤프의 내용 안에서 OOM이 발생된 원인을 알수 있지않을까 생각이 듭니다.

Thread Dump파일을 보는데 확장자가 .b00으로 된 파일이 여러개가 존재하며 안에는 알수없는 수치나 내용으로 복잡하게 보이네요. 이 덤프는 JAVA(JVM)에서 사용되는 스레드에 대한 Thread call stack정보를 담고 있는 스냅샷이라고 하는데 SAP PO내부에 Java application이 hang, 처리속도저하, OOM, CPU사용랑이 높을때 등 발생되는것 같습니다. 해당 내용은 nwds의 SAP Management Console메뉴 > Threads의 Show Call Stack메뉴를 통해서도 볼수 있지만 NWA에서 보는것과는 내용이 달라보입니다.

스레드 특징

일반적으로 사용자가 많은 웹어플리케이션에서도 동시접속 및 수많은 작업을 처리하기 위해 스레드가 사용되 중요해보이며 EAI플랫폼에서도 이 스레드들은 대량은 트랜잭션을 빠르고 정확하게 처리하기위해 중요한것 같습니다. 특히 두개 이상의 스레드가 같은 자원을 사용할때는 동기화를 통한 정합성을 보장 그리고 이를 통한 하나의 스레드만 자원에 접근할수 있게 해야한다고 하는데 예를 들어 0.03초 정도 차이로 SAP PO의 채널이 중복실행되는 현상 등이지 않을까 생각드는데 노드충돌로 인해서도 이런 비슷한 현상들이 발생되는 경우가 있다고 합니다.

이렇게 여러 스레드들 간에는 같은 자원을 사용할때 경합(Contention)이 발생하고 경우에 데드락(Deadlock)이 발생될수 도 있다고 하는데요.
경합이란 A스레드가 B스레드가 사용하고 있는 자원의 락(lock)이 해제대기를 기다리는 상태이며 데드락은 A스레드가 작업하기 위해선 B스레드가 소유한 락이 해제되기를 기다려야하고 반대로 B스레드가 작업하기 위해선 A가 소유한 락을 기다리는 상태인 경우인것 같습니다.


스레드 상태와 덤프내용 분석

Runnable: 작동준비거나 작동중인 상태이며 자원 분배로 WAITING상태가 될수 있음
Suspended: 다른 스레드에 의해 잠시 중지된 상태
Waiting on Condition: 대기상태
sleep메서드에 의한 호출
I/O에 의한 block
wait메서드에 의한 호출, 다른스레드가 수행하기까지 대기
다른 스레드와 join호출에 의해 동기화된 상태(같은 object접근시)
Waiting for Monitor Entry
다른 스레드가 점유한 lock에 의해 lock획득을 대기하는 상태

위는 스레드의 주요 상태이며 그외
NEW: 스레드가 생성되었지만 실행되지 않은 상태
BLOCKED: 다른 스레드가 락을 해제하기를 기다리는 상태이며 한 스레드가 락을 소유하여 다른 스레드가 락을 획득하지 못해 애플리케이션의 성능이 느려지는 경우
WAITING: wait(), join(), park() 메서드 등을 이용해 대기하는 상태
TIMED_WAITING: WAITING와 동일하지만 차이는 메서드의 인수로 대기시간을 명시할수 있어 지정된 시간에 따라 WAITING 상태가 해제될수 있음
pool-1-thread-13: java.lang.Thread나 java.util.concurrent.ThreadFactory 클래스로 생성되는 스레드 이름
prio=6: 스레드의 우선순위
tid=0x000000654a000 nid=0x2fg4: 스레드의 아이디이며 해당 정보로 스레드의 CPU, 메모리 사용정보를 볼수 있다고 음
runnable [0x0000000fdfgg445]
java.lang.Thread.State: RUNNABLE

스레드의 상태

마무리를 하자면 로그를 보고 OOM이 발생되는 원인을 잘 모르겠지만 처리상태에 대해서는 어느정도 알게 된것 같습니다.


같이보면 좋을내용: 

댓글 없음:

댓글 쓰기