Subject: Re: sched_m2 is too unfair
To: None <kern-bug-people@netbsd.org, gnats-admin@netbsd.org>
From: Mindaugas R. <rmind@NetBSD.org>
List: netbsd-bugs
Date: 10/29/2007 17:51:37
> >Number: 37245
> >Category: kern
> >Synopsis: sched_m2 is too unfair
> <...>
> see the following test program and an output of top.
> there seems to be two problems, at least:
>
> - cpu-hogging threads never moves between cpus unless
> there are idle cpus.
Yes, this case is known. The problem is with CPU-hogging threads, which
never sleeps - they dance only with sched_dequeue/sched_enqueue via
preempt/mi_switch, thus never gets sched_takecpu. There are few more cases:
- Yielding;
- STOPPED -> RUN or SUSPENDED -> RUN transitions;
For the first case, I am thinking to perform sched_takecpu() in setrunnable().
> - balance cpus periodically.
I was thinking about calling sched_takecpu() in preempt() when that is
necessary, according to the data collected by sched_balance().
Did you meant something else?
> - there are threads which get completely starved.
> i guess they have never got run after fork and their sl_lrtime
> are still 0.
> <...>
> - make sched_enqueue initialize l_lrtime properly for new lwps.
I think changing the else case in sched_enqueue to this would be correct:
...
} else if (sil->sl_lrtime == 0)
sil->sl_lrtime = hardclock_ticks;
Thanks.
--
Best regards,
Mindaugas
www.NetBSD.org