【内核调度、负载计算】【cpu_load_update_active】

本文探讨Linux内核中CPU负载的计算,重点在`cpu_load_update_active`函数,该函数涉及`weighted_cpuload`和`cfs_rq->runnable_load_avg`。还介绍了无Hz(NOHZ)模式,此模式旨在减少不必要的时钟中断,提高效率。`cpu_load_update_periodic`用于周期性更新CPU负载,而`decay_load_missed`关注不同时间窗口的负载平均值,用于负载平衡决策。
摘要由CSDN通过智能技术生成

之前看了entity_load和cfs_rq的负载的计算,他们的核心code都是一样的,至于具体差别后面有时间再去看,现在来看看cpu级别的负载的计算

cpu_load_update_active

cpu级别的负载的计算主要是涉及到一个数组

/*
 * Called from scheduler_tick()
 */
void cpu_load_update_active(struct rq *this_rq)
{
	unsigned long load = weighted_cpuload(this_rq);
	
	//所有cpu的周期性的时钟已经被停掉了
	if (tick_nohz_tick_stopped())
		cpu_load_update_nohz(this_rq, READ_ONCE(jiffies), load);
	else
		cpu_load_update_periodic(this_rq, load);//periodic周期性的
}

weighted_cpuload(this_rq);实际上获取的是

cfs_rq->runnable_load_avg

关于kernel的no HZ模式:

负载均衡的触发条件之一是软中断。每个cpu上都设置了一个周期性的时钟中断,随着cpu性能的提升,时钟中断的频率可以上升到1000HZ,也就是每秒能处理1000个中断。

时钟中断的设计本身是存在bug的,即他都会周期性的去执行,如果处理器一直处于空闲状态,周期性的唤醒是不必要的,由此kernel引入了NOHZ模式,即关闭所有cpu的这个周期时钟中断。

cpu_load_update_periodic

周期性的去更新cpu load值

static void cpu_load_update_periodic(struct rq *this_rq, unsigned long load)
{
#ifdef CONFIG_NO_HZ_COMMON
	/* See the mess around cpu_load_update_nohz(). */
	this_rq->last_load_update_tick = READ_ONCE(jiffies);
#endif
	cpu_load_update(this_rq, load, 1);
}
/**
 * __cpu_load_update - update the rq->cpu_load[] statistics
 * @this_rq: The rq to update statistics for
 * @this_load: The current load
 * @pending_updates: The number of missed upda
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值