OpenSolaris for SPARC!

오픈솔라리스 nv106 부터 드디어 SPARC 을 지원한다고 합니다. 자세한 내용은 여기를 참고하세요.
현재로써는 자동인스톨러(AI) 를 이용한 설치를 지원한다고 합니다. 
흥미로운것은 IPS Repository 를 x86 용 SPARC 용 이렇게 따로 가는게 아니라 통합된 형태로 같이
간다고 하는군요. 

by 계란소년 | 2009/03/04 15:40 | OpenSolaris | 트랙백 | 덧글(0)

OpenSolaris Powertop

전력의 Power 와 top 의 합성어로 powertop 이라고 하는 재미있는 project 를 소개 해드릴까 합니다. 기본적인 개념은 cpu 가 idle 한 상태에서 cpu 를 깨우는(wake-up) 것을 최대한 줄여서 불필요한 전력 소모를 줄인다는 것입니다. 간단히 예를 들어 아무 것도 하지 않고 가만히 있기만 해도 usb-hub 는 usb 가 새로 꼽혔는지 확인하기 위해 1초에도 몇백번씩 poll 을 하는데 서버에는 대부분 이러한 작업이 필요 없는 낭비에 불과할 것입니다. powertop 역시 dtrace 를 이용해서 만들어 졌습니다.

오픈솔라리스 라이브 CD 로 설치를 하면 기본적으로 powertop 이 탑재되어 있습니다.

$pfexec powertop

으로 간단하게 실행할 수 있지요. 실행 화면은 아래와 같습니다.



어떻게 보면 일반 사용자에겐 무의미하게 보일 수도 있겠지만 전원이 없는 상황에서는 최대한 랩탑을 오래쓰기 위해서 필요 없는 어플리케이션을 죄다 닫아버리고 쓰는 저같은 사람에게는 꽤 유용한 툴입니다.

참고로 OpenSolaris 에는 powertop 말고도 tesla 라고 하는 project 가 진행중입니다. Tesla 는 QoS 관리라는 개념으로 전원의 사용을 관리하려고 하는 프로젝트 입니다. 저도 아직 실체를 보지는못했기 때문에 실체를 확인하는대로 소개 글을 올리도록 하겠습니다.

by 계란소년 | 2009/02/23 14:59 | OpenSolaris | 트랙백 | 덧글(0)

BTrace - 1. 소개

BTrace - 1. 소개

BTrace 는 ByteCode Dynamic Trace 의 약자로 DTrace 에 착안을 해서 만들어진 동적 Java process 추적 툴입니다. DTrace 의 개념에 착안해서 만들어진 Java 용 DTrace 라고 생각하시면 이해가 제일 빠르실 겁니다. DTrace 가 생소하신 분들은 sdnkorea blog 의 DTrace Startup Guide 를 먼저 살펴보시기 바랍니다. BTrace 는 현재 jdk6 이상에서만 사용이 가능하며 아직까지는 draft 버전으로 종종 JVM crash 를 유발하기도 합니다. BTrace 는 특정메소드의 호출 혹은 특정 클래스에 관련된 이벤트들을 특수한 코딩이 필요 없이 동적으로 추적할 수 있으므로 현재 실행중인 java process 의 중단 없이 내부를 추적할 수 있는 매우 유용한 툴 입니다. 

사용법은 DTrace 와 매우 유사 합니다. DTrace 는 D 언어 스크립트를 현재 실행중인 process 를 target 으로 실행 하듯이 BTrace 는 BTrace 소스(java) 를 실행중인 java process 를 target 으로 실행 합니다. 
예)
  btrace 4448 AllCall.java (여기서 4448 은 java pid)

프로그램을 추적하려면 어떠한 지점(혹은 이벤트)를 추적할지에 대한 point 설정과 해당 point 에서 필요한 정보를 얻어낼 수 있는 action 코드가 필요할 것입니다. BTrace 스크립트는 사용자가 지정한 probe point (특정 지점 혹은 이벤트로) 에 도달하면 (보통 probe 가 fire 됐다고 표현 합니다) Action 메소드 에서 정의한 코드를 수행합니다. probe point 는 @OnMethod 어노테이션을 이용해서 지정합니다.
지정하는 방법은 Aspectj 의 point-cut 설정과 유사하여 클래스별, 메소드별로 설정할 수 있도록 되어 있습니다.

BTrace 는 현재 실행중인 process 를 추적하기 위한 툴이므로 실행중인 process 에 어떠한 영향도 주어서는 안됩니다. 즉 읽기전용으로 동작해야 된다는 뜻입니다. 그러므로 BTrace 스크립트에서는 오브젝트 생성이나 exception 생성 및 throw, 다른 메소드의 호출등이 불가능 합니다. 이러한 제약조건은 글의 마지막에 정리해 보도록 하겠습니다.

기본적인 개념 설명은 여기서 끝내고 직접 BTrace 스크립트를 보고 설명을 드리도록 하겠습니다.

예제) (BTrace sample 디렉토리의 AllCall1.java)
package com.sun.btrace.samples;

import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;

/**
 * This script demonstrates the possibility to intercept
 * method calls that are abou to be executed from the body of
 * a certain method. This is achieved by using the {@linkplain Kind#CALL}
 * location value.
 */
    @OnMethod(clazz="javax.swing.JTextField", method="/.*/",
              location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/"))
    public static void m(Object self, String method) { // all calls to the methods with signature "()"
   println(method);
   println(probeMethod());
   println(probeClass());
    }

위의 스크립트는 javax.swing.JTextField 클래스를 호출하는(Kind.Call) 모든 Class(clazz="/.*/") 의 모든 method (method="/.*/") 들을 추적하여 TextField 메소드들 중에서 매개변수가 없는(즉 signature 가 () 인) 메소드를 호출한 호출자의 메소드 이름을 출력해 주는 예제입니다. 해당 스크립트를 Java2D(jdk demo\jfc 에 존재하는) 를 target 으로 실행하면 다음과 같은 결과를 보실 수 있습니다.

getInsets()Ljava/awt/Insets;
scrollRectToVisible
class javax.swing.JTextField

즉 JTextField의 scrollRectToVisible 메소드가 java.asw.Insets 의 getInsets 메소드에서 호출 되고 있음을 나타냅니다.

위의 OnMethod 에서 눈여겨 볼 부분은 @Location annotation 입니다. Location 의 종류는 여러가지가 있는데 몇가지만 소개 하면 다음과 같습니다.

  Kind.Call   : 해당 Class 의 해당 method 를 호출한 시점
  Kind.Catch  : method 의 exception 이 catch 되는 시점
  Kind.Entry  : method 가 호출 되기 바로 직전
  Kind.Return : method 가 return 된 직후에
  Kind.Line   : method 의 해당 라인이 실행될때
  Kind.Throw  : method 가 exception 을 throw 할 때
  
각각의 Location 에 따라서 Action Method 에 Argument 들이 달라집니다. 예를 들어 Kind.Call 의 경우는

  Object self, String method, Object arg1, Object arg2....

이런식으로 해당 probe point 를 호출하는 클래스 자체(self) 와 호출하는 메소드 이름(method), 그리고 메소드의 signature 즉 입력 매개변수들인 arg1, arg2 등을 매개변수로 받게 됩니다.(위의 m 메소드 참조)

Kind.Entry 및 Return 의 경우는
  Object returned
  
즉 probe point 가 호출되고 나서 리턴되는 object(returned) 를 매개변수로 받게 됩니다. 즉 아래의 예를  보시기 바랍니다.

   @OnMethod(
     clazz="java.lang.ClassLoader", 
     method="defineClass",
     location=@Location(Kind.RETURN)
   )   
   public static void defineclass(Class cl) {
       println(strcat("loaded ", name(cl)));
       jstack();
       println("==========================");
   }
   
java.lang.ClassLoader.defineClass 의 return object 인 Class 타입을 매개변수로 받습니다.

BTrace 에 대한 간단한 소개는 이것으로 마치고 다음 글에는 action 메소드에서 유일하게 호출 가능한 com.sun.btrace.BTraceUtils 의 메소드들에 대해 설명 드리도록 하겠습니다.

첨부) action method 의 제약사항
1. 새로운 object 생성 불가
2. 새로운 array 생성 불가
3. exception throw 불가
4. exception catch 불가
5. 임시 instance 및 static method 호출 불가 -오직 com.sun.btrace.BTraceUtils 클래스의 static method 만 호출 가능
6. 타겟 프로그램의 클래스 혹은 오브젝트에 값의 설정 불가함. 그러나 BTrace class 자체의 state field 들에 대한 설정은 가능함.
7. public static void 타입의 method 만 BTrace 클래스의 메소드로 허락됨
8. inner, outer local 클래스의 사용 불가
8. 동기화 사용 불가(synchronized)
9. loop 사용 불가. 단 if 구문은 사용 가능함.
10. extend 불가능
11. 인터페이스 implement 불가
12. asset 구문 삽입 불가
13. Class literal 즉 this 의 사용 불가

by 계란소년 | 2009/02/01 14:34 | OpenJDK | 트랙백 | 덧글(0)

◀ 이전 페이지 다음 페이지 ▶