Hisayoshi Kato's weblog at Sun Solution Center
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を定義することによって、システムを止めずに、動的追跡できるのではないでしょうか?(続く..)
Posted at 07:50PM May 26, 2008 by katohisa in DTrace | Comments[0]
Monday May 26, 2008





