Hi, Gavin,

Thanks for the reply.

On 9/18/06, Gavin Maltby <Gavin.Maltby at sun.com> wrote:
>
> I'd start by looking at what threads are on cpu (::cpuinfo) and which have
> been on cpu recently (t_disp_time relative to panic_lbolt and panic_lbolt64).
> Also look for any kernel stacks waiting for locks - ie ending around
> mutex_vector_enter; similarly for threads ending in sema_p/sema_wait and in
> rw_rdlock, rw_wrlock etc.
>

Hmm, ::cpuinfo doesn't seem to be useful in this case, as it looks
like the CPU is only handling the 'sync':

> ::cpuinfo
ID ADDR     FLG NRUN BSPL PRI RNRN KRNRN SWITCH THREAD           PROC
 0 1041b778  1d    0    0  -1   no    no t-5    000002a10001fd20 (idle)
 2 01991530  1b    0    0 169   no    no t-30   000002a100177d20 sched
> 000002a100177d20::findstack
stack pointer for thread 2a100177d20: 2a100176f01
  000002a100176fb1 prom_enter_mon+0x38()
  000002a100177081 debug_enter+0x15c()
  000002a100177151 abort_seq_softintr+0x7c()
  000002a100177311 intr_thread+0xa4()
  000002a1000131b1 disp_getwork+0xa4()
  000002a100013261 idle+0xac()
  000002a100013311 thread_start+4()
>

As for which threads have been on CPU recently:  Is there some way to
look at t_disp_time on a Solaris 8 server other than dumping memory
starting at the kthread_t pointer and knowing the offset within the
structure?

As for kernel stacks waiting for locks:  Here are the functions the
threads are sitting in:

1       disp_getwork+0xa4()
1       intr_thread+0xa4()
2       cv_wait_sig+0x180()
3       cv_wait_sig_swap+0x194()
1       do_scrub_ecache_line+0x8c()
1       sema_p+0x138()
1       current_thread+0x44()
1       cpu_pause+0x7c()
2       cv_timedwait+0x98()
1       putnext+0x1cc()
1       prom_rtt()
1       prom_enter_mon+0x38()
63      cv_wait+0x38()

So there's one thread sitting in sema_p(), but it's the
seg_pasync_thread() thread:

> 2a100007d20::findstack
stack pointer for thread 2a100007d20: 2a100007181
[ 000002a100007181 sema_p+0x138() ]
  000002a100007231 seg_pasync_thread+0x104()
  000002a100007311 thread_start+4()
>

And from looking at seg_pasync_thread(), I'd guess that this is a normal state.

Thanks,
Chad Mynhier

Reply via email to