OpenSolaris

Printable Version Enter a New Search
Bug ID 6636045
Synopsis Clock thread tick processing can be severely impacted by high yield() syscall frequency
State 5-Cause Known (Bug is root caused)
Category:Subcategory kernel:sched
Keywords BOP | E25K | average | callout | clock | collection | garbage | java | kt-scalability | load | sunalert-submit-availability | thread_lock | triaged | webconsole | yield
Responsible Engineer Christopher Baumbauer
Reported Against 5.10 , snv_83 , s10u5_10
Duplicate Of
Introduced In
Commit to Fix
Fixed In
Release Fixed
Related Bugs 6588996 , 6619224 , 6690928 , 6690941 , 6709289 , 6782663
Submit Date 30-November-2007
Last Update Date 20-November-2009
Description
High frequency of yield() system calls by large number of threads in parallel can stall timeshare class tick processing in the clock thread. The yield() system call acquires the thread dispatcher lock with thread_lock(), as does the clock thread. Contention for these
locks can slow the clock thread progress to a crawl and cause it to fall behind.

Commands that depend on callouts such as sleep hang, and when the threads calling yield() cease absurdly high load averages are reported as an artifact of the clock thread impact.

This behavior has been observed due to Java Parallel Garbage Collection.
Work Around
By default, one thread per cpu is allocated in the 1.5 JVM's for parallel garbage collection. The parameter -XX:ParallelGCThreads=N can be specified to limit the number of GC threads to a reasonable value on machines with a large number of cpu's. If the machine is running with multiple JVM's, this thread allocation should be considered across all JVM's.
Upgrade to JVM 1.5.0_10 or later.  The JVM was modified in that
build to alternately yield() and sleep(), dramatically reducing
the occurrence of this bug.
Comments
N/A