On Sun, May 07, 2006 at 05:41:53PM -0400, Kris Kennaway wrote:
> static int
> kern_sigtimedwait(struct thread *td, sigset_t waitset, ksiginfo_t *ksi,
> struct timespec *timeout)
> {
> ...
> td->td_sigmask = savedmask;
> SIGSETNAND(td->td_sigmask, waitset);
> signotify(td);
> error = msleep(&ps, &p->p_mtx, PPAUSE|PCATCH, "sigwait", hz);
>
> i.e. several threads in the process are all sleeping for 1 tick and
> then doing a thundering herd on the same proc lock when they wake up.Oops, actually hz=0; it comes via sigwait(2). It's still a thundering herd situation though. I also profiled the sleepq_broadcast call to look at thundering herds from wakeup(), and I found that the umtxq_chain is waking the following distribution of CPUs at once: Before patch: Freq #CPUs 1111 1 366 2 136 3 54 4 17 5 2 6 After patch: Freq #CPUs 1139 1 332 2 139 3 44 4 12 5 2 6 i.e. apparently not a large difference, but still a large proportion of cases where multiple CPUs are woken at once on the same chain. Kris
pgp3KQa0GUTOL.pgp
Description: PGP signature
