블로그 이미지
평범하게 살고 싶은 월급쟁이 기술적인 토론 환영합니다.같이 이야기 하고 싶으시면 부담 말고 연락주세요:이메일-bwcho75골뱅이지메일 닷컴. 조대협


Archive»


 
 
JMX를 이용하여 Thread 별 CPU 시간을 측정하는 방법

==
 ThreadMXBean mbThread = (ThreadMXBean) ManagementFactory.getThreadMXBean();
 
 long[] ids = mbThread.getAllThreadIds();
 for (long id: ids)
 {
  System.out.println(mbThread.getThreadInfo(id).getThreadName());
  System.out.println(" CPU Time(" + id+ ")" + mbThread.getThreadCpuTime(id));
  System.out.println(" User Time(" + id+ ")" + mbThread.getThreadCpuTime(id));
 }

==
AOP에서 before에서 자기 Thread의 CPU 시간을 저장한후 after에서 다시 측정하여 결과를 빼면 해당 메서드의 CPU  사용 시간을 측정할 수 있다.

참고 : 단위는 nano second ( /1000,000 = milisecond)

본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.

WebLogic 9.2 MP2 기준으로 작성
JMX 이용하여 XID를 입력하여 해당 트렌젝션에 대한 TM,RM,상태 정보들을 출력해주는 JSP 예제
==
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="javax.naming.*" %>
<%@ page import="javax.management.*" %>
<%@ page import="javax.management.remote.*" %>
<%@ page import="weblogic.management.runtime.*" %>

<%!
 public void printMap(Map map,JspWriter writer) throws Exception {
  for(Iterator i=map.keySet().iterator();i.hasNext();){
   Object key = i.next();
   writer.println(key+":"+map.get(key)+"\n<BR>");
  } 
 }
%>
<%
 // MBean 서버에 연결
 Hashtable h = new Hashtable();    
 
 h.put(Context.SECURITY_PRINCIPAL, "weblogic");     
 h.put(Context.SECURITY_CREDENTIALS, "weblogic" );     
 h.put(JMXConnectorFactory.PROTOCOL_PROVIDER_PACKAGES, "weblogic.management.remote");     

 JMXServiceURL serviceURL = new JMXServiceURL(
   "t3","localhost",7001,"/jndi/weblogic.management.mbeanservers.runtime");
 
    JMXConnector connector = JMXConnectorFactory.connect(serviceURL,h);
    MBeanServerConnection conn = connector.getMBeanServerConnection();
 
    ObjectName service = new ObjectName("com.bea:Name=RuntimeService,Type=weblogic.management.mbeanservers.runtime.RuntimeServiceMBean");
   
 // ServerRuntime 얻어오기
 ObjectName  serverRuntime = (ObjectName)conn.getAttribute(service, "ServerRuntime");

 // xid를 이용해서 jtaRuntime으로 부터 JTATransaction객체를 읽어온다.
 String xid = request.getParameter("xid");
 
 ObjectName jtaRuntime = (ObjectName)conn.getAttribute(serverRuntime,"JTARuntime");
 JTATransaction tx = (JTATransaction)conn.invoke(jtaRuntime,"getJTATransaction",
   new Object[] {new String(xid)},new String[] {"java.lang.String"} );

 if(tx == null){ out.println("No transaction exist");return;}

 // 해당 트렌젝션에 대한 정보 출력
 // 참고
 // http://edocs.beasys.com/wls/docs92/javadocs_mhome/weblogic/management/runtime/JTATransaction.html
 
 out.println("# UserProperties");
 out.println("<BR>");
 printMap(tx.getUserProperties(),out);
 
 out.println("# Tx started before :"+tx.getSecondsActiveCurrentCount());
 out.println("<BR>");
 out.println("# Status :"+tx.getStatus());
 out.println("<BR>");
 out.println("# Server & Status");
 out.println("<BR>");
 printMap(tx.getServersAndStatus(),out);
 out.println("# Resource & Status");
 printMap(tx.getResourceNamesAndStatus(),out);
 

%>
==

본인은 구글 클라우드의 직원이며, 이 블로그에 있는 모든 글은 회사와 관계 없는 개인의 의견임을 알립니다.