调度子系统4_负载均衡(一)

本文详细解析了Linux内核中的负载均衡机制,包括`trigger_load_balance`函数的作用,如何处理不同CPU状态下的负载均衡任务,以及`run_rebalance_domains`和`rebalance_domains`函数在负载均衡过程中的角色。内容涉及`no_hz`特性,如何选择新的idle load balancer CPU以及在多核系统中如何进行域内和域间的负载均衡决策。
摘要由CSDN通过智能技术生成
//	参考:http://blog.csdn.net/dog250/article/details/5303561

//	负载均衡
//		当rq->next_balance到时,触发负载均衡	
//	调用路径:scheduler_tick->trigger_load_balance
//	注:
//		nohz.cpu_mask中的cpu表示停用了周期时钟
//	函数任务:
//		1.如果进入tick的时候rq变得有事可做,并且之前由本cpu执行idle load balance
//			1.1 不再做idle load balance
//			1.2 nohz.cpu_mask中选择一个cpu负责idle load balance
//			1.3 通过ipi通知彼cpu负责ilb
//		2.如果所有cpu均处于idle状态,之前由本cpu做idle load balance
//			2.1 没有必要再做idb,通知本cpu停止idle load balance
//		3.如果本cpu处于idle状态,其他cpu做idle load balance
//			3.1 ilb的cpu会代此cpu执行load balance,不需要raise SCHED_SOFTIRQ
//		4.本cpu没有加入到任何domain,则不需要在domain间load balance
//		5.如果到达执行load balance时间点
//			5.1 raise SCHED_SOFTIRQ
1.1 static inline void trigger_load_balance(struct rq *rq, int cpu)
{
#ifdef CONFIG_NO_HZ

	//	rq->idle_at_tick = 0表示rq上运行的非idle进程
	//	rq->in_nohz_recently表示最近关闭了周期时钟
	if (rq->in_nohz_recently && !rq->idle_at_tick) {
		rq->in_nohz_recently = 0;
		//如果之前由本cpu执行idle load balance
		if (atomic_read(&nohz.load_balancer) == cpu) {
			//nohz.cpu_mask中的cpu表示停用了周期时钟,在select_nohz_load_balancer中被加入
			cpumask_clear_cpu(cpu, nohz.cpu_mask);
			//进入tick的时候rq变得有事可做,则不再做idle load balance
			atomic_set(&nohz.load_balancer, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值