Re: Nick's scheduler v17

From: Nick Piggin
Date: Mon Oct 27 2003 - 18:16:51 EST




Andrew Theurer wrote:

*imbalance = min(this_load - load_avg, load_avg - max_load)

That way you take just enough to either have busiest_queue or
this_rq's length be the load_avg. I suppose you could take even
less, but IMO, the /=2 is what I really don't like. Perhaps:

That is _exactly_ what I had before! Thats probably the way to go. Thanks
for having a look at it.


*imbalance = min(this_load - load_avg, load_avg - max_load);
*imbalance = (*imbalance + FPT - 1) / FPT;

This should work well for intranode balances, internode balances may
need a little optimization, since the load_avg really does not really
represent the load avg of the two nodes in question, just one cpu
from one of them and all the cpus from another.

Oh, actually, after my path, load_avg represents the load average of _all_
the nodes. Have a look at find_busiest_node. Which jogs my memory of why
its not always a good idea to do your *imbalance min(...) thing (I actually
saw this happening).


Oops, I meant avg_load, which you calculate in find_busiest_queue on the fly.


OK


5 CPUs, 4 processes running on one cpu. load_avg would be 0.8 for all cpus.
balancing doesn't happen. I have to think about this a bit more...


Actually, if we use avg_load, I guess it would be 0, since this is an unsigned long. Maybe avg_load needs to have a min value of 1. Then if we apply:


Well its got a fixed point scaling factor.


*imbalance = min(max_load - avg_load, avg_load - this_load)
min(4 - 1, 1 - 0)



I think you want:

*imbalance = min(max_load - avg_load, avg_load - this_load)
if ( (*imbalance < 1*FPT) &&
(max_load - this_load) > 1*FPT )
*imbalance = 1*FPT;

So if there is a total imbalance of more than 1 task, at least one
will be moved.




And imbalance looks a lot better. Only concern would be an idle cpu stealing from another, leaving the other cpu idle. I guess a check could be put there.



pull_task won't pull a running task, so you get some protection there.


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/