Hisayoshi Kato's weblog at Sun Solution Center

pageicon Monday May 26, 2008

Java SDT Provider part 1

なぜ、Javaで、SDTが必要なのか?

すでに、Cなどでは、USDTは、利用可能です。USDTでの利用事例としては、すでに、iscsi、xenstored(xVM)、javascript, PHP, Perl、Ruby、Python、データベースだと、PostgreSQLなど大きく広がりをみせています。DTraceを調べている方は、一度は目にしているでしょう。

Cのみならず、それらをJavaアプリケーションでも同様のProviderを定義できるようにしようとしているのが、このSDT probesになります。

このSDTでは何をやるのかというと、コード間の変数をDTraceで追跡できたり、統計をとれたりするというわけです。デバッガなどに詳しい方は、そんなのなくてもdbxやmdbなどでなんとかなるよって思ったりするかもしれませんが。はたま、loggingつけとけばなんとかなるでしょ。。って思ったり、やっぱり、伝統的なprintfとかでしょって感じのことを思われるでしょう。

確かに静的な追跡ではそれでもかもいませんが、やっぱり、動的に追跡したい!それも、アプリケーションのみならず、カーネルまで追跡したい!ということで、利用したいということでしょうか。

それでは、Java用のDTrace Providerを作成してみましょう。

Keithさんのブログの手順に従って...

JDK7のSolaris版を用意いたしましょう。 

MyProvider.java

 interface MyProvider extends com.sun.tracing.Provider {
 void test(String msg);
}


Test.java 

import com.sun.tracing.*;

public class Test{

 public static void main(String args[]){

    ProviderFactory my = ProviderFactory.getDefaultFactory();
    MyProvider p = my.createProvider(MyProvider.class);
    String msg="katohisa";
  try{
   while(true){
    p.test(msg);
    Thread.sleep(100);
   }
  }catch(InterruptedException e){
   System.out.println(e);
  }
 }
}

上記のファイルをコンパイル

//Testを開始 

#java Test


単なるwhileループで回っているので、下記のようにProviderを確認

//Providerの確認 

 #dtrace -l | awk '{print $2}' | grep My
MyProvider2435

//DTraceの実行

 # dtrace -n 'My*:::'
dtrace: description 'My*:::' matched 1 probe
CPU     ID                    FUNCTION:NAME
  2  81822                 unspecified:test
  3  81822                 unspecified:test
  3  81822                 unspecified:test

//msgの中身をみる。

 # dtrace -n 'My*:::{printf("%s",copyinstr(arg0));}'
dtrace: description 'My*:::' matched 1 probe
CPU     ID                    FUNCTION:NAME
  1  81822                 unspecified:test katohisa
^C
  2  81822                 unspecified:test katohisa


//syscallと一緒に追跡 (pidは、javaのプロセス)

 # dtrace -Fn 'My*:::{printf("%s",copyinstr(arg0));} syscall:::/pid==2435/{}'
dtrace: description 'My*:::' matched 469 probes
CPU FUNCTION                                
  1 | unspecified:test                        katohisa
  1  => pollsys                              
  1  <= pollsys                              
  1 | unspecified:test                        katohisa
  1  => pollsys                  

上記の例のように、DTraceの他のProviderとも組み合わせ可能です。DTraceのすごいところは、アプリケーションのみならず、カーネルやシステムコールなどと複数の組み合わせで追跡できる点というのがすごいところだと思ってます。もちろん、JDK 6で提供されているhotspot providerとも組み合わせることも可能です。

今、考えているのは、ORマッパーなど、SQLを隠蔽されているようなプログラムに対して、このようなProviderを定義することによって、システムを止めずに、動的追跡できるのではないでしょうか?(続く..)


Comments:

Post a Comment:
  • HTML Syntax: NOT allowed


Hisayoshi Kato
I'm Customer Benchmark Engineer at Sun Solution Center.
My interest are Solaris and Oracle.
We're working on Commercial Benchmarking with Sun's customers.
Also I work as OpenSolaris Evangelist in Japan.
Recently my focus is to build OpenSolaris Community in Japan.
Photo By Jim Grisanzio


OpenSolaris.org


Tokyo OpenSolaris User Group


Tokyo Linux User Group


Sun Solution Center



Weblog menu


« December 2009
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  
       
Today

Recent Entries

Search this blog

Links

Sun Solution Center Links

Japan OpenSolaris User Blog Links

Japan OpenSolaris Distro

Visitor

Locations of visitors to this page

Tags