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
About

This blog is talked about OpenSolaris Community Activity and Bencmarking Test, which are my job.

Search

Archives
« August 2015
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
31
     
Today