Re: [PATCH] sched: modify move_tasks() to improve load balancing outcomes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Siddha, Suresh B wrote:
On Thu, Apr 13, 2006 at 04:57:15PM +1000, Peter Williams wrote:
Problem:

The move_tasks() function is designed to move UP TO the amount of load it is asked to move and in doing this it skips over tasks looking for ones whose load weights are less than or equal to the remaining load to be moved. This is (in general) a good thing but it has the unfortunate result of breaking one of the original load balancer's good points:

with previous load balancer code it was a good point.. because all tasks
were weighted the same from load balancer perspective.. but now the
imbalance represents what task to move (atleast in the working
cases :)

That's the option 4 case in my original mail. Are you suggesting that it would have been the better option to adopt? If so, why?

I don't like it because (leaving aside the active/expired array issues) it would move the X top priority tasks across where X is the number of tasks required to meet the requirement. If we could arrange for it to skip every second one without making the code too complicated (i.e. there'd be a possible need for multiple passes until the required load was moved).


namely, that (within the limits imposed by the active/expired array model and the fact the expired is processed first) it moves high priority tasks before low priority ones and this means there's a good chance (see active/expired problem for why it's only a chance) that the highest priority task on the queue but not actually on the CPU will be moved to the other CPU where (as a high priority task) it may preempt the current task.

Solution:

Modify move_tasks() so that high priority tasks are not skipped when moving them will make them the highest priority task on their new run queue.

you mean the highest priority task on the current active list of the new run queue, right?

Good point. this_min_prio should probably be initialized to the minimum of this_rq->curr->prio and this_rq->best_expired_prio rather just using this_rq->curr->prio.


There will be some unnecessary movements of high priority tasks because of
this...

How so. At most one task per move_tasks() will be moved as a result of this code that wouldn't have been moved otherwise. That task will be a high priority task stuck behind a higher priority task on its current queue that will be the highest priority on its new queue causing a preempt and access to the CPU. I wouldn't call this unnecessary.

Peter, Are you sure that this is a converging solution? If we want to

Yes, I think we're getting there.

I think we need changes to try_to_wake_up() to help high priority tasks find idle CPUs or CPUs where they would preempt when they wake up. Leaving this to the load balancer is bad for these tasks latencies. I think that this change needs to be done independently of smpnice as it would be useful even without smpnice. I'm hoping Ingo or Nick will comment on this proposal.

It would also help if you fixed the active load balance code so that it's not necessary to distort normal load balancing to accommodate it. I haven't had time to look at it myself (other than a quick glance) yet.

Peter
--
Peter Williams                                   [email protected]

"Learning, n. The kind of ignorance distinguishing the studious."
 -- Ambrose Bierce
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux