Messages in this thread | | | Date | Wed, 17 Jul 2013 18:18:15 +0200 | From | Peter Zijlstra <> | Subject | Re: [RFC] sched: Limit idle_balance() when it is being used too frequently |
| |
On Wed, Jul 17, 2013 at 08:59:01AM -0700, Jason Low wrote: > > So if we have the following: > > for_each_domain(sd) > before = sched_clock_cpu > load_balance(sd) > after = sched_clock_cpu > idle_balance_completion_time = after - before > > At this point, the "idle_balance_completion_time" is usually a very > small value and is usually a lot smaller than the avg CPU idle time. > However, the vast majority of the time, load_balance returns 0.
I think the interesting question here is: is it significantly more when we do find a task?
I would also expect sd->newidle_balance_cost (less typing there) to scale with the number of CPUs in the domain - thus larger domains will take longer etc.
And (obviously) the cost of the entire newidle balance is the direct sum of individual domain costs.
> Do you think its worth a try to consider each newidle balance attempt as > the total load_balance attempts until it is able to move a task, and > then skip balancing within the domain if a CPU's avg idle time is less > than that avg time doing newidle balance?
So the way I see things is that the only way newidle balance can slow down things is if it runs when we could have ran something useful.
So all we need to ensure is to not run longer than we expect to be idle for and things should be 'free', right?
So the problem I have with your proposal is that supposing we're successful once every 10 newidle balances. Then the sd->newidle_balance_cost gets inflated by a factor 10 -- for we'd count 10 of them before 'success'.
However when we're idle for that amount of time (10 times longer than it takes to do a single newidle balance) we'd still only do a single newidle balance, not 10.
| |