성능과 튜닝/APM (AP 성능 측정)

Aspect J를 이용한 간이 APM 만들기.

Terry Cho 2009. 3. 20. 18:07
AOP를 이용하면 특정 클래스의 메서드 실행 전후에 Code를 삽입할 수 있다.
사용자 애플리케이션의 비지니스 메서드에 Code를 삽입하여
1. 시작 시간, 종료시간을 측정하면 비지니스 메서드의 응답 시간을 측정할 수 있고
2. JMX를 이용하여 CPU 사용시간을 측정하면 비지니스 메서드의 CPU 사용률을 측정할 수 있다.
3. Thread Local 변수를 이용하면, Transaction이 시작될때부터 끝날때 까지를 측정할 수 있다. (예를 들어 JSP는 JSPServlet : service 메서드에서부터 시작되기 때문에, AOP에서 before advice에 transaction id를 set하게 하고, after advice에서 Trace내용을 flush하게 하면 된다. 그 중간에는 Thread Local에 Trace 정보를 저장하게 한다.)

초간단하게 작성한 AspectJ를 이용한 메서드별 응답시간 측정 프로그램이다.
Aspect J 1.5이상 JVM 1.5이상에서만 동작한다.

AbstractTracerAspect.aj 소스
==
package bcho.aspectj.aspects;

import bcho.aspectj.logger.xml.*;

public abstract aspect AbstractTracerAspect {
abstract pointcut scope();
pointcut targetMethod(): scope() && execution(* *(..));
Object around(): targetMethod(){
long startTime = System.currentTimeMillis();
try{
return proceed();
}finally{
long endTime = System.currentTimeMillis();
long elapsedTime = endTime - startTime;
Logger.log(thisJoinPoint,startTime,elapsedTime);
}// try
}
}
===

Logger.java 소스

==
package bcho.aspectj.logger.xml;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
public class Logger {
static public void log(JoinPoint point,long startTime,long elapsedTime){
Signature signature;
Object args[];
signature = point.getSignature();
args = point.getArgs();
System.out.println("["+startTime+"|signature] "+signature);
System.out.println("\tElapsed time :"+elapsedTime);
for(int i=0;i<args.length;i++){
System.out.println("\targ["+i+"] :"+args[i]);
}
}
}
==

코드 작성후 ajc로 컴파일 한후에 jar로 묶고 측정할 Application이 있는 디렉토리에 배포

%TRACER_HOME%/aspectjTracer.jar
%TRACER_HOME%/META-INF/aop.xml 을 다음과 같이 작성

==
 <aspectj>
    <aspects>
       <concrete-aspect name="myTracerAspect" extends="bcho.aspectj.aspects.AbstractTracerAspect">
          <pointcut name="scope" expression="within(bcho..*) &amp;&amp; !within(bcho.aspectj..*) " />
       </concrete-aspect>
    </aspects>
</aspectj>
==

expression 부분이 Weaving을 할 class에 대한 정의 
bcho.* 시작되는 모든 클래스를 profiling하되 bcho.aspectj.* 클래스는 제거하도록 설정함. (XML이기 때문에, &를 &amp;로 정의해야 함)

다음 CLASSPATH에 다음 내용을 추가함
set CLASSPATH=%TRACER_HOME%;%CLASSPATH%
set CLASSPATH=%TRACER_HOME%/aspectjTracer.jar;%CLASSPATH%

java 실행시 다음과 같이 -Xagent 옵션 추가

java -javaagent:%ASPECTJ_HOME%/lib/aspectjweaver.jar {실행할 JAVACLASS}

를 해주면 Runtime에 Weaving이 되면서 메서드 수행 시간을 trace해준다.

자세한 내용은 다 만들면 다시 정리하겠다... ^^