Hisayoshi Kato's weblog at Sun Solution Center
kernel threadを追跡してみる?
user processと結びついているkernel threadは実多くのthreadがいます。たとえば、taskq_thread、scsi_watch_threadなどです(Solaris Internal参照)。今回、追跡したいのは、このようなthreadが何のカーネル関数を使って、どんなことを行っているかです!taskq threadについて、後日blogします。。
|
#mdb -k >::print -t kthread_t |
上記より、mdbを使うとkernel threadの構造体をみることができます。または、/usr/include/sys/kthread.hをみてください。このkthreadの構造体の中で注目したいのが、 void (*t_startpc)(void); /* PC where thread started */です。これを使ってdtraceしてみましょう。
| # dtrace -n 'fbt:::entry{@[curthread->t_startpc,curthread->t_startpc]=count();} tick-1sec{printa("\n%a %p\n",@);}' dtrace: description 'fbt:::entry' matched 22268 probes CPU ID FUNCTION:NAME 0 51722 :tick-1sec genunix`seg_pasync_thread 11d4e50 zfs`arc_reclaim_thread 7b671b28 ce`ce_drain_fifo 7b63f6c0 genunix`taskq_thread 11b44dc genunix`thread_create_intr 11ba068 0x0 0 unix`idle 10533c4 ^C |
とかってとれます。これは、ユーザプロセスと対応しているkernel threadではなく、OSのカーネルにとって必要な処理をするkernel threadとになります。たとえば、arc_reclaim_threadをおってみましょう。
| # dtrace -n 'fbt:::entry/(uintptr_t)curthread->t_startpc==0x7b671b28/{@[probemod,probefunc,stack()]=count();} tick-1sec{printa(@);trunc(@);}' dtrace: description 'fbt:::entry' matched 22268 probes CPU ID FUNCTION:NAME 0 51722 :tick-1sec genunix cv_block genunix`cv_timedwait+0x64 zfs`arc_reclaim_thread+0x194 unix`thread_start+0x4 1 genunix cv_timedwait zfs`arc_reclaim_thread+0x194 unix`thread_start+0x4 1 genunix disp_lock_enter unix`disp+0x84 unix`swtch+0x8c genunix`cv_timedwait+0x98 zfs`arc_reclaim_thread+0x194 unix`thread_start+0x4 1 .. |
Posted at 11:42AM Jun 12, 2008 by katohisa in DTrace | Comments[0]
Thursday Jun 12, 2008





