Hisayoshi Kato's weblog at Sun Solution Center
システム監視のための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 ・・・・ |
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 |
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 ...)
Posted at 02:48PM Mar 16, 2007 by katohisa in DTrace | Comments[0]
Friday Mar 16, 2007





