// 寻找sched domain中最忙的group
// 函数参数:
// sd:待查找的sched domain
// this_cpu:当前正在对其执行负载均衡的cpu
// imbalance:为达到平衡需要移动的权重
// idle:this_cpu当前的状态
// sd_idle: sd空闲状态
// cpus:可作为源cpu的集合
// balance:指示this_cpu是否适合负载均衡
// 返回值:
// 如果存在不均衡,返回最忙的group
// 否则,如果用户建议power-savings balance,返回最不忙的group,
// 通过将其中cpus的进程移动到本group,使其idle
// 函数任务:
// 1.计算sd的负载信息
// 2.根据统计信息,决定是否进行负载均衡
// 2.1 this_cpu不适合在sd中进行均衡,则返回
// 2.2 没有最忙的group,或者最忙group可运行进程数为0,则返回
// 2.3 this_cpu所在group的负载大于最忙group的负载,则返回
// 2.4 计算sched domain的平均负载
// 公式:(SCHED_LOAD_SCALE * sds.total_load) / sds.total_pwr
// 2.4.1 如果this_group的负载大于等于平均负载,则返回
// 2.5 this_cpu所在group的负载阈值超过了最忙group的负载阈值,则返回
// this_cpu所在group的负载阈值计算公式:sd->imbalance_pct * sds.this_load
// 2.6 运行到此处,说明存在失衡,计算失衡的负载量(即需要移动的负载数)
// 2.7 返回最忙的group
// 3.如果sd负载没有失衡,计算是否可以通过负载均衡来省电
// 3.1 返回最不忙的group
1.1 static struct sched_group *find_busiest_group(struct sched_domain *sd, int this_cpu,
unsigned long *imbalance, enum cpu_idle_type idle,
int *sd_idle, const struct cpumask *cpus, int *balance)
{
struct sd_lb_stats sds;
memset(&sds, 0, sizeof(sds));
//计算sd的负载
update_sd_lb_stats(sd, this_cpu, idle, sd_idle, cpus,
balance, &sds);
//this_cpu不适合在sd中进行均衡,则返回
if (!(*balance))
goto ret;
//没有最忙的group,或者最忙group可运行进程数为0,则返回
if (!sds.busiest || sds.busiest_nr_running == 0)
goto out_balanced;
//this_cpu所在group的负载大于最忙group的负载,则返回
if (sds.this_load >= sds.max_load)
goto out_balanced;
//sd的平均权重
sds.avg_load = (SCHED_LOAD_SCALE * sds.total_load) / sds.total_pwr;
//this_cpu所在group负载大于sd的平均负载,则返回
if (sds.this_load >= sds.avg_load)
goto out_balanced;
//imbalance_pct,进行负载均衡的阈值
if (100 * sds.max_load <= sd->imbalance_pct * sds.this_load)
goto out_balanc
调度子系统7_负载均衡(四)
最新推荐文章于 2023-03-14 22:00:00 发布
本文深入探讨了Linux内核中的调度子系统,重点在于负载均衡部分。内容涵盖负载均衡的目标、策略以及如何在多核系统中有效地分配任务以优化系统性能。通过对调度算法的理解,读者将能更好地掌握Linux系统的资源管理和性能优化。
摘要由CSDN通过智能技术生成