Hisayoshi Kato's weblog at Sun Solution Center

pageicon Friday Mar 16, 2007

システム監視のためのDTrace(mpstat編)

最近、DTrace Tipsをぜんぜん、Updateしていなかなったので、ちょこちょこUpdateしていきたく考えています。hiroaさんとDTraceのデモを行っている中で、利用した簡単なスクリプトを紹介したく思います。Solarisのパフォーマンスをみる際に利用するのは、*statを利用するのが、普通です。

たとえば、

  • fsstat(ファイルシステム操作をみるstat)
  • iostat(IO deviceの監視をする際に使うstat)
  • mpstat(CPUの動きをみる際に使うstat)
  • vmstat(memoryの動きをみる際に使うstat)
  • netstat(networkの動きをみる際に使うstat)
  • procツール(pfiles,ptree,prstat...)
  • interstat(deviceのinterruptとCPUの関連をみるstat)
  • kstat(statのボス!ほとんど何でもとれます。)
  • sar(日常的に使うstat!kernelの動きからCPUまでみれます。よく知られてます!)
  • others(その他)

のようなstatがあります。普段の監視は、これらstatでかまいませんが、これらの値がおかしくなったり、その原因を追求したいって、思ったりしたことってありませんか?

そんなとき、大活躍するのが、DTraceです!そこで、DTraceによって、どんなことを提供できるのかっていうと以下のような場面で役に立つと思います。

  • アプリケーション動作異常時の原因追求
  • Kernel drvierのデバッグ
  • システムパフォーマンスチューニング

だと思いこんでいます。ホントきりがないくらい使い道があります。以外に一番の使い道は、Solaris Kernelの勉強だったりもするのかもしれません。。

mpstatやvmstatの値をDTraceで、解析している例は、ここ をみてください。
今回の議題は、mpstatについて。mpstatがだしている値は?です。基本は、Kstatから値をとっているのがわかります。OpenSolarisのソースコードは、ここです。

%mpstat 1 1 

CPU minf mjf xcal  intr ithr  csw icsw migr smtx  srw syscl  usr sys  wt idl
  0    3   0    0   387  286  335    5    0    0    0   553    1   0   0  98

ソースを読んでいただければ、わかると思いますが、基本的には、Kstatから値をとっているのが、わかると思います。たとえば、Kstatから値をみてみたいということであれば、下記のように、うってみましょう。


#kstat -n sys
module: cpu                             instance: 0     
name:   sys                             class:    misc
        bawrite                         3023
        bread                           9371
        bwrite                          18968
        canch                           1028
        cpu_nsec_idle                   596447051724090
        cpu_nsec_kernel                 2663202631015
        cpu_nsec_user                   9908580747927
        cpu_ticks_idle                  59644705
        cpu_ticks_kernel                266320
        cpu_ticks_user                  990858
        cpu_ticks_wait                  0
        cpumigrate                      0

        ・・・・

これらの値からほとんどとっています。ただ、これだけだと、値の振る舞いはわかっても、どんなプロセスが?どんなことをやっているのかはわかりません。直接の原因も?わかりません。そんなときにDTraceの登場です。

minf(Minor faults)

  dtrace -n 'vminfo:::as_fault{@[pid,execname,stack(),ustack(5)]=count();}'

 をうったりしてみると、結果がでてくると思います。

   6263  dtrace                                            
              unix`pagefault+0x95
              unix`trap+0xb6c
              unix`_cmntrap+0x140

              libc.so.1`memset+0x114
              libdtrace.so.1`dt_aggregate_snap_cpu+0x105
              libdtrace.so.1`dtrace_aggregate_snap+0x84
              libdtrace.so.1`dtrace_work+0x9c
              dtrace`main+0x159b
               63
たとえば、上記のような出力がでたりもします。これは、User StackとKernel Stackととっています。この出力をみると、どのポイント(ユーザー関数)で、page faultがでているのが発見することができます。とても、興味深いです。ここで、強調したのは、どのプロセスが、どのユーザー関数、どんな要求で、pagefaultがだされているのか?ということが発見できるということです。以下、DTrace One linerを示していきます。

mjf(Major faults)

dtrace -n 'vminfo:::maj_fault{@[pid,execname]=count();}

xcal(Cross calls)

dtrace -n 'sysinfo:::xcalls{@[pid,execname]=count();}'

csw(Context Switches)

dtrace -n 'sysinfo:::pswitch{@[pid,execname]=count();}'

migr(Thread migration)

dtrace -n 'sched:::on-cpu{self->cpu=cpu;} 
sched:::off-cpu/self->cpu/{@[cpu,execname]=count();}'

stmx(Spin on mutexes)

dtrace -n 'sysinfo:::rw_rdfails,
sysinfo:::mutex_adenters{@[pid,execname]=count();}'
dtrace -n 'lockstat:::rw-block{@[pid,execname]=count();}'

srw(Spin on read/writer lock) 

dtrace -n 'sysinfo:::rw_wrfails{@[pid,execname]=count();

intr,ithr(Interrupts)は、device単位で値をみたほうがいいので、intrstatでみたほうがいいでしょう。 

# intrstat 1

      device |      cpu0 %tim
-------------+---------------
  audio810#0 |         2  0.0
      ehci#0 |         2  0.0
       nge#0 |         1  0.0

Device interruptがCPUに影響を与えているかということを判定できます。

どうでしょうか。今回のOne linerは、ホンノ一例にすぎません。よくわからないしという方!ぜひ、DTrace discussに参加していただいて、他のユーザーがどんな使い方をしているのかみてください。もちろん、googleもご利用ください。DTraceを利用すれば、Solaris Kernelだけでなく、アプリケーションのDebugまで、広い範囲で、しかも短時間で解析できるようになるでしょう。そこで、重要なのが、自分で、仮説を立てることです。

DTraceでは、連想配列@[***] の中に、組み込み変数をいれるのですが、OneLinerに組み込み変数を入れ替えて、遊んでみてください。(組み込み変数は、pid, execname, cpu ...)

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


« November 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
     
       
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