tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: CPUs and processes not evenly assigned?!
In article <alpine.DEB.2.00.1611102238460.6429%inya.fehu.org@localhost>,
Hubert Feyrer <hubert%feyrer.de@localhost> wrote:
>On Thu, 10 Nov 2016, Michael van Elst wrote:
>>>> Can you try this?
>>
>>> Tried it, and it seems to help with both 2 and 4 CPUs.
>>> Codebase: -current
>>
>> Great, so the problem was just the rounding error.
>
>Yes. I've also played with it a bit more, and the "stealing" of processes
>between CPUs seems to get less with the factor of r_mcount, e.g. with 4*
>below I see less movement of processes on a 4-CPU system as shown in the
>patch below.
>
>Maybe this should be made a sysctl or depend on the number of CPUs?
>
>
> - Hubert
>
>
>
>--- sys/kern/kern_runq.c.orig 2016-11-10 21:11:10.000000000 +0000
>+++ sys/kern/kern_runq.c
>@@ -534,7 +534,9 @@ sched_balance(void *nocallout)
> ci_rq = ci->ci_schedstate.spc_sched_info;
>
> /* Average count of the threads */
>- ci_rq->r_avgcount = (ci_rq->r_avgcount + ci_rq->r_mcount) >> 1;
>+ ci_rq->r_avgcount = (ci_rq->r_avgcount +
>+ 4*ci_rq->r_mcount
>+ ) /2;
>
> /* Look for CPU with the highest average */
> if (ci_rq->r_avgcount > highest) {
I think that the code is wrong here; I think it should be using r_count...
u_int totcount = ci_rq->r_count + ci_rq->r_mcount;
ci_rq->r_avgcount = totcount >> 1;
/* Look for CPU with the highest total */
if (totcount > highest) {
hci = ci;
highest = totcount;
}
Why avgcount is kept anyway?
christos
Home |
Main Index |
Thread Index |
Old Index