调度子系统8_负载均衡(五)

//	计算group在给定domain中的imbalance
//	调用路径:find_busiest_group->calculate_imbalance
//	函数参数:
//		sds:sched domain的统计信息
//		this_cpu:当前正在运行load balance的cpu
//		imbalance:保存imbalance值
//	函数任务:
//		1.计算最忙group内进程的平均负载
//			1.1 公式:最忙group当前的负载量/最忙group当前运行的进程数
//		2.如果最忙group失衡
//			2.1 最忙group内进程的平均负载 = min(最忙group的当前负载,sched doman的平均负载)
//		3.如果最忙group的负载小于domain平均负载,则说明已经平衡,返回
//		4.如果最忙group没有失衡
//			4.1 计算最忙group超过group容量的进程个数
//		5.计算load balance进行pull的load
//			5.1 pull的load量为 min(最忙group超过domain平均负载的量,最忙group的超过容量的负载量)
//		6.计算this_cpu所在group与最忙cpu所在group之间的imbalance量
//			6.1 imbalance量为 min(load balance进行pull的load,当前cpu所在group超过domain平均负载的量)
//		7.如果imbalance不足最忙group中进程的平均负载
//			7.1 进行微调整
static inline void calculate_imbalance(struct sd_lb_stats *sds, int this_cpu,
		unsigned long *imbalance)
{
	unsigned long max_pull, load_above_capacity = ~0UL;

	//计算最忙group内进程当前的平均负载
	sds->busiest_load_per_task /= sds->busiest_nr_running;
	//如果最忙group失衡
	if (sds->group_imb) {
		//则最忙group内进程的平均负载取 min(当前负载、历史负载)
		sds->busiest_load_per_task =
			min(sds->busiest_load_per_task, sds->avg_load);
	}

	//如果最忙group的负载小于平均负载,则说明已平衡
	if (sds->max_load < sds->avg_load) {
		//imbalance=0
		*imbalance = 0;
		return fix_small_imbalance(sds, this_cpu, imbalance);
	}
	//没有group失衡
	if (!sds->group_imb) {

		//最忙group超过容量的进程数
		load_above_capacity = (sds->busiest_nr_running -
						sds->busiest_group_capacity);
		load_above_capacity *= (SCHED_LOAD_SCALE * SCHED_LOAD_SCALE);
		load_above_capacity /= sds->busiest->cpu_power;
	}

	//计算load balance进行pull的load
	max_pull = min(sds->max_load - sds->avg_load, load_above_capacity);

	//计算imbalance
	*imbalance = min(max_pull * sds->busiest->cpu_power,
		(sds->avg_load - sds->this_load) * sds->this->cpu_power)
			/ SCHED_LOAD_SCALE;

	//imbalance不足最忙group中进程的平均负载
	if (*imbalance < sds->busiest_load_per_task)
		return fix_small_imbalance(sds, this_cpu, imbalance);

}

//	查找sched group中最忙的group
//	函数任务:
//		1.遍历group内所有在线的cpu
//			1.1 获取cpu对应的rq的当前负载rq->load.weight
//			1.2 如果rq当前只有一个进程,并且负载大于imbalance,继续1.1
//			1.3 通过cpu power计算cpu的负载
//				1.3.1 为方便在不同cpu见进行比较
//			1.4 记录负载最大的cpu
//		2.返回最忙的cpu
//	调用路径:load_balance->find_busiest_queue
2.1 static struct rq *find_busiest_queue(struct sched_group *group, enum cpu_idle_type idle,
		   unsigned long imbalance, const struct cpumask *cpus)
{
	struct rq *busiest = NULL, *rq;
	unsigned long max_load = 0;
	int i;
	//遍历group内的cpu
	for_each_cpu(i, sched_group_cpus(group)) {
		unsigned long power = power_of(i);
		unsigned long capacity = DIV_ROUND_CLOSEST(power, SCHED_LOAD_SCALE);
		unsigned long wl;
		//cpu在线
		if (!cpumask_test_cpu(i, cpus))
			continue;
		//cpu的rq
		rq = cpu_rq(i);
		//rq当前的负载
		wl = weighted_cpuload(i);

		//rq当前只有一个进程,则返回
		if (capacity && rq->nr_running == 1 && wl > imbalance)
			continue;

		//通过cpu power计算cpu的负载
		wl = (wl * SCHED_LOAD_SCALE) / power;

		//记录最大负载的cpu
		if (wl > max_load) {
			max_load = wl;
			busiest = rq;
		}
	}
	//返回最忙的cpu
	return busiest;
}

//	获取cpu power
//	函数任务:
//		1.如果cpu没有对应的group,返回SCHED_LOAD_SCALE
//		2.否则返回对应group的power
2.2 static unsigned long power_of(int cpu)
{
	//获取cpu对应的group
	struct sched_group *group = group_of(cpu);

	//没有对应的group,返回SCHED_LOAD_SCALE
	if (!group)
		return SCHED_LOAD_SCALE;
	//否则返回group的power
	return group->cpu_power;
}
时间: 2024-11-10 00:06:59

调度子系统8_负载均衡(五)的相关文章

调度子系统6_负载均衡(三)

// 负载均衡 // 在sched_domain中进行负载均衡,检查是否可以通过最繁忙的组中迁移一些进程到本cpu // 函数参数: // this_cpu, 其上执行负载均衡的cpu // this_rq, 其上执行负载均衡的rq // sd, 其上执行负载均衡的sched domain // idle, this_cpu的状态 // CPU_SCHED_IDLE,this_cpu空闲 // CPU_NOT_IDLE,this_cpu不空闲 // balance,sd中是否均衡 // 函数任务

调度子系统5_负载均衡(二)

一篇介绍Linux负载均衡的文章:          Linux Load Balancing Mechanism          CSDN资源地址

一张图看懂阿里云网络产品[五]负载均衡SLB

负载均衡SLB是对多台云服务器进行流量分发的服务.它可以通过流量分发扩展应用系统的服务能力,通过消除单点故障提升应用系统的可用性.通过设置虚拟IP,将位于同一地域的多台云服务器虚拟成一个高性能.高可用的应用服务池.根据指定的方式,将来自客户端的网络请求分发到云服务器池中. 系列文章持续更新中,敬请关注 [一]网络产品概览 [二]VPC [三]EIP [四]NAT网关 [五]负载均衡SLB [六]共享带宽 [七]共享流量包 [八]高速通道 [九]VPN网关 [十]云托付 [十一]全球加速

DockOne技术分享(一二五):深信服容器云的负载均衡实现

本文讲的是DockOne技术分享(一二五):深信服容器云的负载均衡实现[编者的话]此次重点讲的是在深信服容器云项目中的负载均衡方案的原理与实现.同时,因为我们投入的人力有限,人员的水平也有不足,但是借助Docker与Kubernetes等开源技术的发展,我们基本上达到了容器云平台中应用服务的负载均衡. [3 天烧脑式 Docker 训练营 | 上海站]随着Docker技术被越来越多的人所认可,其应用的范围也越来越广泛.本次培训我们理论结合实践,从Docker应该场景.持续部署与交付.如何提升测试

高负载均衡学习haproxy之配置文件详解

通过前一篇文章的介绍,我们知道了haproxy的配置文件主要包含以下几个部分: global全局配置.defaults默认配置.监控页面配置.frontend配置.backend配置 下面对每一部分分别进行讲解. PS:本文部分内容借鉴马哥haproxy视频. 一.global全局配置 全局配置的标志参数为global,全局配置主要用于设定义全局参数,属于进程级的配置,通常和操作系统配置有关. 1.1 进程管理及安全相关的参数 chroot <jail dir>:修改haproxy的工作目录至

负载均衡进阶:SLB常见问题解决方法

摘要:在由和阿里云网络团队联合主办的2017阿里云网络技术在线高峰论坛上,阿里云技术专家添毅分享了网络产品部根据客户和阿里云运维的反馈提炼出的几大最主要和最常见的在使用SLB产品中发生的问题,并为大家介绍了针对这些常见问题的相应处理方法.想知道如何借助SLB构建高可用系统以及健康检查是如何实现的,本文不容错过! 本文内容根据演讲嘉宾分享视频以及PPT整理而成. 本次的分享将会主要围绕以下5个部分 基本概念回顾 如何构建高可用系统 选择性能共享型还是性能保障型实例 为什么健康检查异常 为什么负载不

架构分析、数据整合、负载均衡,梦想旅行解析云上实践

全面赋能,双11电商解决方案上新,全新75折:https://www.aliyun.com/solution/ecommerce/act/huhang1111 9月23日由阿里云主办的第三期<电商大咖直播:备战双11最佳实践>线上分享圆满结束,来自梦想旅行的CTO李帅分享了如何在大数据的云上实践过程中来把畅行全球的事做的更完美,主要介绍了分布式爬虫架构.数据整合与知识发现.遇到的阻碍.高可用与容灾. 本次视频直播的整理文章整理完毕,如下内容. 如何能够让云计算更好的帮助行业的发展.更好的服务行

负载均衡-lvs

常用的负载均衡技术比较DNS 轮询DNS本身的机制不再赘述,这里主要看一看基于DNS的负载均衡,其大致原理很清楚,DNS系统本身支持同一个域名映射到多个ip (A记录),例如 这样每次向DNS系统询问该域名的ip地址时(Tell Me The IP Address of niubility.com.),DNS会轮询(Round Robin)这个ip列表,每次给一个不同的ip,从而达到负载均衡的效果. 来看看这种负载均衡解决方案的优缺点 优点易于实现对于应用系统本身几乎没有任何侵入,配置也很简单,

调度子系统1_调度子系统初始化

unsigned int sysctl_sched_rt_period = 1000000; int sysctl_sched_rt_runtime = 950000; // 参考: // SMP负载均衡 // http://soft.chinabyte.com/os/22/12359522.shtml // linux组调度浅析 // http://hi.baidu.com/_kouu/item/0fe32610e493314be75e06d1 // 进程调度和组调度 // http://bl