SlideShare a Scribd company logo
<대용량 아키텍처와 성능 튜닝>
CH.10 애플리케이션 서버
의 병목 발견 방법
아꿈사 스터디 2015.5.16
정민철(ccc612@gmail.com)
자바 서버 애플리케이션
구조
User AP
WAS
JVM RDBMS
Web Server
Client
Network
현상 및 튜닝 개요
Hang up: 실행되고 있으나 응답이 없는 상태
Slow down: 응답시간이 급격히 떨어지는 상태
동작을 위한 구성 요소 중 하나 이상의 병목으로
발생
튜닝: 병목 구간 발견 => 제거
애플리케이션 서버의 기본
구조
WebServer
OR Browser
OR Client
Dispatcher
Request
Queue
Thread
Pool
Connection
Pool
Thread
Queue
JMS Thread
Queue
APP1 Thread
Queue
APP2 Thread
Queue
Other
Resources
Connector
Working
Thread
Idle
Thread
Queue + Thread Pool
애플리케이션 서버의 기본
구조
Thread Pooling
Thread를 미리 생성해 pool에 저장
필요 시 꺼내서 사용
업무의 성격에 따라 Thread pool 나눠서 운영
장점
업무 부하에 따라 각 pool의 thread 수 조정 가능
문제가 생겨도 다른 업무에 영향이 없음
죄송합니다 여기부터는
Copy & Paste
from here
쓰레드 덤프
• Thread dump
– Snapshot of java ap (X-ray)
– We can recognize thread running tread state
by “continuous thread dump”
Slow down in WAS & User AP
• Getting Thread Dump
– Unix : kill –3 pid , Windows : Ctrl + Break
– Get thread dump about 3~5 times between 3~5secs
Threads
Time
Working thread
Thread dump
Slow down in WAS & User AP
• Thread dump
– It displays all of thread state by “THREAD STACK”
"ExecuteThread: '42' for queue: 'default'" daemon prio=5 tid=0x3504b0 nid=0x34 runnable
[0x9607e000..0x9607fc68]
at java.net.SocketInputStream.read(SocketInputStream.java:85)
at oracle.net.ns.Packet.receive(Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:730)
at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:702)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:373)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1427)
at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:911)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:1948)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2137)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:404)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:344)
at weblogic.jdbc.pool.PreparedStatement.executeQuery(PreparedStatement.java:51)
at weblogic.jdbc.rmi.internal.PreparedStatementImpl.executeQuery(PreparedStatementImpl.java:56)
Thread name Thread id (signature)Thread State
Program stack of this thread
Sun JVM
Slow down in WAS & User AP
• How to analysis thread dump
MYTHREAD_RUN(){  1
call methodA();
}
methodA(){
//doSomething(); 2
call methodB();
}
methodB(){
//call methodC(); 3
}
methodC(){
// doSomething 4
for(;;){// infinite loop } 5
}
“MYTHREAD” runnable  1
at …MYTHREAD_RUN()
:
“MYTHREAD” runnable 2
at …methodA()
at …MYTHREAD_RUN()
:
“MYTHREAD” runnable 3
at …methodB()
at …methodA()
at …MYTHREAD_RUN()
:
“MYTHREAD” runnable 4
at …methodC()
at …methodB()
at …methodA()
at …MYTHREAD_RUN()
:
“MYTHREAD” runnable
at …methodC()
at …methodB()
at …methodA()
at …MYTHREAD_RUN()
:
계속 이모양이
반복됨
Source code
Thread dumps
Slow down in WAS & User AP
• CASE 1. Lock contention
– In the java application java thread wait for lock in synchronized method
– Occurred in multi threaded program
– Reduce frequency of synchronized method
– Synchronized block must be implemented to be end as soon as possible (※
IO? )
public void synchronized methodA(Object param)
{
//do something
while(1){}
}
< sample code >
Slow down in WAS & User AP
• CASE 1. Lock contention
Thread1 Thread3
Thread2
Thread4
Sychronized
MethodA
Threads
Time
Thread1 – That has a lock
Thread 2.3.4 – waiting for lock
Slow down in WAS & User AP
• CASE 1. Lock contention : Thread dump example
"ExecuteThread: '12' for queue: 'weblogic.kernel.Default'" daemon prio=10 tid=0x0055ae20 nid=23
lwp_id=3722788 waiting for monitor entry [0x2fb6e000..0x2fb6d530]
:
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
:
at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(Unknown Source)
at org.apache.axis.utils.XMLUtils.getSAXParser(XMLUtils.java:252)
- locked <0x329fcf50> (a java.lang.Class)
"ExecuteThread: '13' for queue: 'weblogic.kernel.Default'" daemon prio=10 tid=0x0055bde0 nid=24
lwp_id=3722789 waiting for monitor entry [0x2faec000..0x2faec530]
at org.apache.axis.utils.XMLUtils.getSAXParser(XMLUtils.java:247)
- waiting to lock <0x329fcf50> (a java.lang.Class)
:
"ExecuteThread: '15' for queue: 'weblogic.kernel.Default'" daemon prio=10 tid=0x0061dc20 nid=26
lwp_id=3722791 waiting for monitor entry [0x2f9ea000..0x2f9ea530]
at org.apache.axis.utils.XMLUtils.releaseSAXParser(XMLUtils.java:283)
- waiting to lock <0x329fcf50> (a java.lang.Class)
at
Slow down in WAS & User AP
• CASE 2. Dead lock
– CWC “Circular waiting condition”
– Commonly it makes WAS hang up
– Remove CWC by changing lock direction
– Some kind of JVM detects dead lock automatically
sychronized methodA(){
call methodB();
}
sychronized methodB(){
call methodC();
}
sychronized methodC(){
call methodA();
}
< sample code >
Slow down in WAS & User AP
• CASE 2. Dead lock
Thread1
Sychronized
MethodA
Thread2
Sychronized
MethodB
Thread3
Sychronized
MethodC
Threads
Time
Thread 1
Thread 2
Thread 3
Circular waiting condition
Slow down in WAS & User AP
• CASE 2. Dead lock
FOUND A JAVA LEVEL DEADLOCK:
----------------------------
"ExecuteThread: '12' for queue: 'default'":
waiting to lock monitor 0xf96e0 (object 0xbd2e1a20, a weblogic.servlet.jsp.JspStub),
which is locked by "ExecuteThread: '5' for queue: 'default'"
"ExecuteThread: '5' for queue: 'default'":
waiting to lock monitor 0xf8c60 (object 0xbd9dc460, a weblogic.servlet.internal.WebAppServletContext),
which is locked by "ExecuteThread: '12' for queue: 'default'" JAVA STACK INFORMATION FOR THREADS LISTED
ABOVE:
------------------------------------------------
Java Stack for "ExecuteThread: '12' for queue: 'default'":
==========
at weblogic.servlet.internal.ServletStubImpl.destroyServlet(ServletStubImpl.java:434)
- waiting to lock <bd2e1a20> (a weblogic.servlet.jsp.JspStub)
at weblogic.servlet.internal.WebAppServletContext.removeServletStub(WebAppServletContext.java:2377)
at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:207)
:
Java Stack for "ExecuteThread: '5' for queue: 'default'":
==========
at weblogic.servlet.internal.WebAppServletContext.removeServletStub(WebAppServletContext.java:2370)
at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:207)
at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:154)
- locked <bd2e1a20> (a weblogic.servlet.jsp.JspStub)
at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:368)
:
Found 1 deadlock.========================================================
Deadlock auto detect in Sun JVM
Slow down in WAS & User AP
• CASE 2. Dead lock
"ExecuteThread-6" (TID:0x30098180, sys_thread_t:0x39658e50, state:MW, native ID:0xf10) prio=5
at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java(Compiled Code))
at weblogic.jdbc.common.internal.ConnectionEnv.cleanup(ConnectionEnv.java(Compiled
:
"ExecuteThread-8" (TID:0x30098090, sys_thread_t:0x396eb890, state:MW, native ID:0x1112) prio=5
at oracle.jdbc.driver.OracleConnection.commit(OracleConnection.java(Compiled Code))
at weblogic.jdbcbase.pool.Connection.commit(Connection.java(Compiled Code))
:
sys_mon_t:0x39d75b38 infl_mon_t: 0x39d6e288:
oracle.jdbc.driver.OracleConnection@310BC380/310BC388: owner "ExecuteThread-8" (0x396eb890)
1 entry  1)
Waiting to enter:
"ExecuteThread-10" (0x3977e2d0)
"ExecuteThread-6" (0x39658e50)
sys_mon_t:0x39d75bb8 infl_mon_t: 0x39d6e2a8: 
oracle.jdbc.driver.OracleStatement@33AA1BD0/33AA1BD8: owner "ExecuteThread-6"
(0x39658e50) 1 entry  2)
Waiting to enter:
"ExecuteThread-8" (0x396eb890
Deadlock trace in AIX JVM
Slow down in WAS & User AP
• CASE 3. Wait for IO Response
– Situation in waiting for IO response (DB,Network)
– Commonly occurred caused by DB locking or slow response
Threads
Time
Wait for IO response
Slow down in WAS & User AP
• CASE 3. Wait for IO Response
"ExecuteThread: '42' for queue: 'default'" daemon prio=5 tid=0x3504b0 nid=0x34 runnable [0x9607e000..0x9607fc68]
at java.net.SocketInputStream.socketRead(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:85)
at oracle.net.ns.Packet.receive(Unknown Source)
at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.net.ns.NetInputStream.read(Unknown Source)
at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:730)
at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:702)
at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:373)
at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1427)
at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:911)
at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:1948)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2137)
at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:404)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:344)
at weblogic.jdbc.pool.PreparedStatement.executeQuery(PreparedStatement.java:51)
at weblogic.jdbc.rmi.internal.PreparedStatementImpl.executeQuery(PreparedStatementImpl.java:56)
at weblogic.jdbc.rmi.SerialPreparedStatement.executeQuery(SerialPreparedStatement.java:42)
at com.XXXX 생략
at ……..
Slow down in WAS & User AP
• CASE 4. High CPU usage
– When monitoring CPU usage by top,glance. WAS process consumes a lot of
CPU - almost 90~100%
– Find it using tools below
• Sun : prstat,pstack,thread dump
• AIX : ps –mp,dbx,thread dump
• HP : glance,thread dump
• See a document “How to find bottleneck in J2EE application “ in
http://www.j2eestudy.co.kr
Slow down in WAS & User AP
• CASE 4. High CPU usage
– Example in HP UX
HP glance
1. Start “glance”
2. Press “G” and enter the WAS
PID
3. Find the TID that consumes a
lot of CPU resource
4. Get a thread dump
5. Find the thread in Thread dump
that has a matched LWID with
this TID
6. And find the reason and fix it
Slow down in WAS & User AP
• Summarize
– Thread dump is snapshot of Java Application.
– If u meet a slowdown situation, Get a thread dump.
– Analysis thread dump.
– And fix it..

More Related Content

PPT
Tomcat New Evolution
PDF
[Hello world 오픈세미나]varnish로 웹서버성능 향상시키기
KEY
Performance Pack
 
PDF
Scripting Yor Java Application with BSF3
 
ODP
Nagios Conference 2014 - Troy Lea - Monitoring VMware Virtualization Using vMA
PDF
Embedded systems
PPTX
Kubernetes #4 volume &amp; stateful set
PPT
Apache Tomcat 7 by Filip Hanik
Tomcat New Evolution
[Hello world 오픈세미나]varnish로 웹서버성능 향상시키기
Performance Pack
 
Scripting Yor Java Application with BSF3
 
Nagios Conference 2014 - Troy Lea - Monitoring VMware Virtualization Using vMA
Embedded systems
Kubernetes #4 volume &amp; stateful set
Apache Tomcat 7 by Filip Hanik

What's hot (20)

PDF
Apache Traffic Server & Lua
PPT
Tomcat Clustering
PPTX
Nagios Conference 2014 - Jeff Mendoza - Monitoring Microsoft Azure with Nagios
PDF
NetApp ontap simulator
PDF
How to add non root user account to netapp for commvault
PPT
Apache Traffic Server
PDF
Backup workflow for SMHV on windows 2008R2 HYPER-V
PDF
ReplacingSquidWithATS
PDF
Faster & Greater Messaging System HornetQ zzz
PDF
Replacing Squid with ATS
PDF
Nginx Internals
PDF
실시간 서비스 플랫폼 개발 사례
PDF
WebSockets with Spring 4
PDF
Squid for Load-Balancing & Cache-Proxy ~ A techXpress Guide
PPTX
Query logging with proxysql
PPTX
Asynchronous Web Programming with HTML5 WebSockets and Java
PDF
Service-Oriented Integration With Apache ServiceMix
PDF
Java/Spring과 Node.js의공존
PPTX
201904 websocket
PPTX
My sql failover test using orchestrator
Apache Traffic Server & Lua
Tomcat Clustering
Nagios Conference 2014 - Jeff Mendoza - Monitoring Microsoft Azure with Nagios
NetApp ontap simulator
How to add non root user account to netapp for commvault
Apache Traffic Server
Backup workflow for SMHV on windows 2008R2 HYPER-V
ReplacingSquidWithATS
Faster & Greater Messaging System HornetQ zzz
Replacing Squid with ATS
Nginx Internals
실시간 서비스 플랫폼 개발 사례
WebSockets with Spring 4
Squid for Load-Balancing & Cache-Proxy ~ A techXpress Guide
Query logging with proxysql
Asynchronous Web Programming with HTML5 WebSockets and Java
Service-Oriented Integration With Apache ServiceMix
Java/Spring과 Node.js의공존
201904 websocket
My sql failover test using orchestrator
Ad

Viewers also liked (16)

PPTX
[4]iv.경험디자인을 통한 생산성 향상 coex 110822
PDF
JVM과 톰캣 튜닝
PDF
[메조미디어] Man 네트워크 소개서 2015 version6_2
PPTX
Ch6 대용량서비스레퍼런스아키텍처 part.1
PPTX
홍익경영혁신2015 b131378
PDF
H/W 규모산정기준
PPTX
Ssl 하드웨어 가속기를 이용한 성능 향상
PPTX
경영 혁신 15.10.25
PDF
UNUS BEANs 소개서 20141015
PDF
TTA H/W 규모산정 지침 Ttak.ko 10.0292
PDF
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
PDF
생산성 측정을 통한 인력관리의 혁신
PPTX
안드로이드 리스트뷰 최적화 사례 연구
PPT
어플리케이션 성능 최적화 기법
PDF
람다아키텍처
PDF
서버성능개선 류우림
[4]iv.경험디자인을 통한 생산성 향상 coex 110822
JVM과 톰캣 튜닝
[메조미디어] Man 네트워크 소개서 2015 version6_2
Ch6 대용량서비스레퍼런스아키텍처 part.1
홍익경영혁신2015 b131378
H/W 규모산정기준
Ssl 하드웨어 가속기를 이용한 성능 향상
경영 혁신 15.10.25
UNUS BEANs 소개서 20141015
TTA H/W 규모산정 지침 Ttak.ko 10.0292
조대협의 서버 사이드 - 대용량 아키텍처와 성능튜닝
생산성 측정을 통한 인력관리의 혁신
안드로이드 리스트뷰 최적화 사례 연구
어플리케이션 성능 최적화 기법
람다아키텍처
서버성능개선 류우림
Ad

Similar to Ch10.애플리케이션 서버의 병목_발견_방법 (15)

PPTX
자바 성능 강의
PPT
Analysis bottleneck in J2EE application
PPT
Find bottleneck and tuning in Java Application
PDF
Oracle Fuson Middleware Diagnostics, Performance and Troubleshoot
PDF
Java troubleshooting thread dump
PPTX
WebLogic Stability; Detect and Analyse Stuck Threads
PDF
スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
PPTX
Thread dump troubleshooting
PDF
Oracle Diagnostics : Locks and Lock Trees
PPTX
JEEConf 2017 - How to find deadlock not getting into it
PDF
Oracle WebLogic Diagnostics & Perfomance tuning
PPTX
Debugging java deployments_2
PPTX
Mastering Thread Dump Analysis: 9 Tips & Tricks
PDF
Java Multithreading Interview Questions PDF By ScholarHat
PPT
Java Multithreading and Concurrency
자바 성능 강의
Analysis bottleneck in J2EE application
Find bottleneck and tuning in Java Application
Oracle Fuson Middleware Diagnostics, Performance and Troubleshoot
Java troubleshooting thread dump
WebLogic Stability; Detect and Analyse Stuck Threads
スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
Thread dump troubleshooting
Oracle Diagnostics : Locks and Lock Trees
JEEConf 2017 - How to find deadlock not getting into it
Oracle WebLogic Diagnostics & Perfomance tuning
Debugging java deployments_2
Mastering Thread Dump Analysis: 9 Tips & Tricks
Java Multithreading Interview Questions PDF By ScholarHat
Java Multithreading and Concurrency

More from Minchul Jung (12)

PPTX
13.앙상블학습
PPTX
10장 진화학습
PPTX
DDD Start! - 2장 아키텍처 개요
PPTX
Ch9 프로세스의 메모리 구조
PPTX
7부. 애플리케이션 입장에서의 성능 튜닝 (1~8장)
PPTX
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
PPTX
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
PPTX
[Http완벽가이드] 9장 웹로봇
PDF
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
PDF
Ch1 일래스틱서치 클러스터 시작
PPTX
Apprenticeship patterns 7
PPTX
Tools in android sdk
13.앙상블학습
10장 진화학습
DDD Start! - 2장 아키텍처 개요
Ch9 프로세스의 메모리 구조
7부. 애플리케이션 입장에서의 성능 튜닝 (1~8장)
실무로 배우는 시스템 성능 최적화 - 4부. 프로세스 이해하기
HTTP 완벽 가이드 / 20장 리다이렉션과 부하균형
[Http완벽가이드] 9장 웹로봇
일래스틱 서치 ch7. 일래스틱 서치 클러스터 세부사항
Ch1 일래스틱서치 클러스터 시작
Apprenticeship patterns 7
Tools in android sdk

Recently uploaded (20)

PPTX
Introduction to Artificial Intelligence
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PPTX
ManageIQ - Sprint 268 Review - Slide Deck
PDF
System and Network Administraation Chapter 3
PDF
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
PDF
medical staffing services at VALiNTRY
PDF
Odoo Companies in India – Driving Business Transformation.pdf
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
top salesforce developer skills in 2025.pdf
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PPTX
ai tools demonstartion for schools and inter college
PPT
Introduction Database Management System for Course Database
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PPTX
ISO 45001 Occupational Health and Safety Management System
PPTX
Online Work Permit System for Fast Permit Processing
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
Introduction to Artificial Intelligence
Navsoft: AI-Powered Business Solutions & Custom Software Development
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
ManageIQ - Sprint 268 Review - Slide Deck
System and Network Administraation Chapter 3
Claude Code: Everyone is a 10x Developer - A Comprehensive AI-Powered CLI Tool
medical staffing services at VALiNTRY
Odoo Companies in India – Driving Business Transformation.pdf
How to Migrate SBCGlobal Email to Yahoo Easily
top salesforce developer skills in 2025.pdf
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
ai tools demonstartion for schools and inter college
Introduction Database Management System for Course Database
CHAPTER 2 - PM Management and IT Context
Flood Susceptibility Mapping Using Image-Based 2D-CNN Deep Learnin. Overview ...
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
ISO 45001 Occupational Health and Safety Management System
Online Work Permit System for Fast Permit Processing
2025 Textile ERP Trends: SAP, Odoo & Oracle

Ch10.애플리케이션 서버의 병목_발견_방법

  • 1. <대용량 아키텍처와 성능 튜닝> CH.10 애플리케이션 서버 의 병목 발견 방법 아꿈사 스터디 2015.5.16 정민철(ccc612@gmail.com)
  • 2. 자바 서버 애플리케이션 구조 User AP WAS JVM RDBMS Web Server Client Network
  • 3. 현상 및 튜닝 개요 Hang up: 실행되고 있으나 응답이 없는 상태 Slow down: 응답시간이 급격히 떨어지는 상태 동작을 위한 구성 요소 중 하나 이상의 병목으로 발생 튜닝: 병목 구간 발견 => 제거
  • 4. 애플리케이션 서버의 기본 구조 WebServer OR Browser OR Client Dispatcher Request Queue Thread Pool Connection Pool Thread Queue JMS Thread Queue APP1 Thread Queue APP2 Thread Queue Other Resources Connector Working Thread Idle Thread Queue + Thread Pool
  • 5. 애플리케이션 서버의 기본 구조 Thread Pooling Thread를 미리 생성해 pool에 저장 필요 시 꺼내서 사용 업무의 성격에 따라 Thread pool 나눠서 운영 장점 업무 부하에 따라 각 pool의 thread 수 조정 가능 문제가 생겨도 다른 업무에 영향이 없음
  • 7. 쓰레드 덤프 • Thread dump – Snapshot of java ap (X-ray) – We can recognize thread running tread state by “continuous thread dump”
  • 8. Slow down in WAS & User AP • Getting Thread Dump – Unix : kill –3 pid , Windows : Ctrl + Break – Get thread dump about 3~5 times between 3~5secs Threads Time Working thread Thread dump
  • 9. Slow down in WAS & User AP • Thread dump – It displays all of thread state by “THREAD STACK” "ExecuteThread: '42' for queue: 'default'" daemon prio=5 tid=0x3504b0 nid=0x34 runnable [0x9607e000..0x9607fc68] at java.net.SocketInputStream.read(SocketInputStream.java:85) at oracle.net.ns.Packet.receive(Unknown Source) at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source) at oracle.net.ns.NetInputStream.read(Unknown Source) at oracle.net.ns.NetInputStream.read(Unknown Source) at oracle.net.ns.NetInputStream.read(Unknown Source) at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:730) at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:702) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:373) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1427) at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:911) at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:1948) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2137) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:404) at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:344) at weblogic.jdbc.pool.PreparedStatement.executeQuery(PreparedStatement.java:51) at weblogic.jdbc.rmi.internal.PreparedStatementImpl.executeQuery(PreparedStatementImpl.java:56) Thread name Thread id (signature)Thread State Program stack of this thread Sun JVM
  • 10. Slow down in WAS & User AP • How to analysis thread dump MYTHREAD_RUN(){  1 call methodA(); } methodA(){ //doSomething(); 2 call methodB(); } methodB(){ //call methodC(); 3 } methodC(){ // doSomething 4 for(;;){// infinite loop } 5 } “MYTHREAD” runnable  1 at …MYTHREAD_RUN() : “MYTHREAD” runnable 2 at …methodA() at …MYTHREAD_RUN() : “MYTHREAD” runnable 3 at …methodB() at …methodA() at …MYTHREAD_RUN() : “MYTHREAD” runnable 4 at …methodC() at …methodB() at …methodA() at …MYTHREAD_RUN() : “MYTHREAD” runnable at …methodC() at …methodB() at …methodA() at …MYTHREAD_RUN() : 계속 이모양이 반복됨 Source code Thread dumps
  • 11. Slow down in WAS & User AP • CASE 1. Lock contention – In the java application java thread wait for lock in synchronized method – Occurred in multi threaded program – Reduce frequency of synchronized method – Synchronized block must be implemented to be end as soon as possible (※ IO? ) public void synchronized methodA(Object param) { //do something while(1){} } < sample code >
  • 12. Slow down in WAS & User AP • CASE 1. Lock contention Thread1 Thread3 Thread2 Thread4 Sychronized MethodA Threads Time Thread1 – That has a lock Thread 2.3.4 – waiting for lock
  • 13. Slow down in WAS & User AP • CASE 1. Lock contention : Thread dump example "ExecuteThread: '12' for queue: 'weblogic.kernel.Default'" daemon prio=10 tid=0x0055ae20 nid=23 lwp_id=3722788 waiting for monitor entry [0x2fb6e000..0x2fb6d530] : at java.lang.ClassLoader.loadClass(ClassLoader.java:255) : at org.apache.xerces.jaxp.SAXParserFactoryImpl.newSAXParser(Unknown Source) at org.apache.axis.utils.XMLUtils.getSAXParser(XMLUtils.java:252) - locked <0x329fcf50> (a java.lang.Class) "ExecuteThread: '13' for queue: 'weblogic.kernel.Default'" daemon prio=10 tid=0x0055bde0 nid=24 lwp_id=3722789 waiting for monitor entry [0x2faec000..0x2faec530] at org.apache.axis.utils.XMLUtils.getSAXParser(XMLUtils.java:247) - waiting to lock <0x329fcf50> (a java.lang.Class) : "ExecuteThread: '15' for queue: 'weblogic.kernel.Default'" daemon prio=10 tid=0x0061dc20 nid=26 lwp_id=3722791 waiting for monitor entry [0x2f9ea000..0x2f9ea530] at org.apache.axis.utils.XMLUtils.releaseSAXParser(XMLUtils.java:283) - waiting to lock <0x329fcf50> (a java.lang.Class) at
  • 14. Slow down in WAS & User AP • CASE 2. Dead lock – CWC “Circular waiting condition” – Commonly it makes WAS hang up – Remove CWC by changing lock direction – Some kind of JVM detects dead lock automatically sychronized methodA(){ call methodB(); } sychronized methodB(){ call methodC(); } sychronized methodC(){ call methodA(); } < sample code >
  • 15. Slow down in WAS & User AP • CASE 2. Dead lock Thread1 Sychronized MethodA Thread2 Sychronized MethodB Thread3 Sychronized MethodC Threads Time Thread 1 Thread 2 Thread 3 Circular waiting condition
  • 16. Slow down in WAS & User AP • CASE 2. Dead lock FOUND A JAVA LEVEL DEADLOCK: ---------------------------- "ExecuteThread: '12' for queue: 'default'": waiting to lock monitor 0xf96e0 (object 0xbd2e1a20, a weblogic.servlet.jsp.JspStub), which is locked by "ExecuteThread: '5' for queue: 'default'" "ExecuteThread: '5' for queue: 'default'": waiting to lock monitor 0xf8c60 (object 0xbd9dc460, a weblogic.servlet.internal.WebAppServletContext), which is locked by "ExecuteThread: '12' for queue: 'default'" JAVA STACK INFORMATION FOR THREADS LISTED ABOVE: ------------------------------------------------ Java Stack for "ExecuteThread: '12' for queue: 'default'": ========== at weblogic.servlet.internal.ServletStubImpl.destroyServlet(ServletStubImpl.java:434) - waiting to lock <bd2e1a20> (a weblogic.servlet.jsp.JspStub) at weblogic.servlet.internal.WebAppServletContext.removeServletStub(WebAppServletContext.java:2377) at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:207) : Java Stack for "ExecuteThread: '5' for queue: 'default'": ========== at weblogic.servlet.internal.WebAppServletContext.removeServletStub(WebAppServletContext.java:2370) at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:207) at weblogic.servlet.jsp.JspStub.prepareServlet(JspStub.java:154) - locked <bd2e1a20> (a weblogic.servlet.jsp.JspStub) at weblogic.servlet.internal.ServletStubImpl.getServlet(ServletStubImpl.java:368) : Found 1 deadlock.======================================================== Deadlock auto detect in Sun JVM
  • 17. Slow down in WAS & User AP • CASE 2. Dead lock "ExecuteThread-6" (TID:0x30098180, sys_thread_t:0x39658e50, state:MW, native ID:0xf10) prio=5 at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java(Compiled Code)) at weblogic.jdbc.common.internal.ConnectionEnv.cleanup(ConnectionEnv.java(Compiled : "ExecuteThread-8" (TID:0x30098090, sys_thread_t:0x396eb890, state:MW, native ID:0x1112) prio=5 at oracle.jdbc.driver.OracleConnection.commit(OracleConnection.java(Compiled Code)) at weblogic.jdbcbase.pool.Connection.commit(Connection.java(Compiled Code)) : sys_mon_t:0x39d75b38 infl_mon_t: 0x39d6e288: oracle.jdbc.driver.OracleConnection@310BC380/310BC388: owner "ExecuteThread-8" (0x396eb890) 1 entry  1) Waiting to enter: "ExecuteThread-10" (0x3977e2d0) "ExecuteThread-6" (0x39658e50) sys_mon_t:0x39d75bb8 infl_mon_t: 0x39d6e2a8: oracle.jdbc.driver.OracleStatement@33AA1BD0/33AA1BD8: owner "ExecuteThread-6" (0x39658e50) 1 entry  2) Waiting to enter: "ExecuteThread-8" (0x396eb890 Deadlock trace in AIX JVM
  • 18. Slow down in WAS & User AP • CASE 3. Wait for IO Response – Situation in waiting for IO response (DB,Network) – Commonly occurred caused by DB locking or slow response Threads Time Wait for IO response
  • 19. Slow down in WAS & User AP • CASE 3. Wait for IO Response "ExecuteThread: '42' for queue: 'default'" daemon prio=5 tid=0x3504b0 nid=0x34 runnable [0x9607e000..0x9607fc68] at java.net.SocketInputStream.socketRead(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:85) at oracle.net.ns.Packet.receive(Unknown Source) at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source) at oracle.net.ns.NetInputStream.read(Unknown Source) at oracle.net.ns.NetInputStream.read(Unknown Source) at oracle.net.ns.NetInputStream.read(Unknown Source) at oracle.jdbc.ttc7.MAREngine.unmarshalUB1(MAREngine.java:730) at oracle.jdbc.ttc7.MAREngine.unmarshalSB1(MAREngine.java:702) at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:373) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1427) at oracle.jdbc.ttc7.TTC7Protocol.fetch(TTC7Protocol.java:911) at oracle.jdbc.driver.OracleStatement.doExecuteQuery(OracleStatement.java:1948) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2137) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:404) at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:344) at weblogic.jdbc.pool.PreparedStatement.executeQuery(PreparedStatement.java:51) at weblogic.jdbc.rmi.internal.PreparedStatementImpl.executeQuery(PreparedStatementImpl.java:56) at weblogic.jdbc.rmi.SerialPreparedStatement.executeQuery(SerialPreparedStatement.java:42) at com.XXXX 생략 at ……..
  • 20. Slow down in WAS & User AP • CASE 4. High CPU usage – When monitoring CPU usage by top,glance. WAS process consumes a lot of CPU - almost 90~100% – Find it using tools below • Sun : prstat,pstack,thread dump • AIX : ps –mp,dbx,thread dump • HP : glance,thread dump • See a document “How to find bottleneck in J2EE application “ in http://www.j2eestudy.co.kr
  • 21. Slow down in WAS & User AP • CASE 4. High CPU usage – Example in HP UX HP glance 1. Start “glance” 2. Press “G” and enter the WAS PID 3. Find the TID that consumes a lot of CPU resource 4. Get a thread dump 5. Find the thread in Thread dump that has a matched LWID with this TID 6. And find the reason and fix it
  • 22. Slow down in WAS & User AP • Summarize – Thread dump is snapshot of Java Application. – If u meet a slowdown situation, Get a thread dump. – Analysis thread dump. – And fix it..