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
About

This blog is talked about OpenSolaris Community Activity and Bencmarking Test, which are my job.

Search

Archives
« April 2014
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
   
       
Today