Hisayoshi Kato's weblog at Sun Solution Center

pageicon Thursday Jun 12, 2008

kernel threadを追跡してみる?

user processと結びついているkernel threadは実多くのthreadがいます。たとえば、taskq_thread、scsi_watch_threadなどです(Solaris Internal参照)。今回、追跡したいのは、このようなthreadが何のカーネル関数を使って、どんなことを行っているかです!taskq threadについて、後日blogします。。

#mdb -k

>::print -t kthread_t
{
    struct _kthread *t_link
    caddr_t t_stk
    int (*)() t_startpc
    struct cpu *t_bound_cpu
    short t_affinitycnt
    short t_bind_cpu
    ushort_t t_flag
    ushort_t t_proc_flag
    ushort_t t_schedflag
    volatile char t_preempt
    volatile char t_preempt_lk
    uint_t t_state
    pri_t t_pri
...

上記より、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
..
要するに、kernel thread名をkeyにして、どんなカーネル関数が呼ばれているかを分析できるわけです。また、stackトレースをするとさらにコードレベルまで分析できます。

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