【负载均衡、负载计算】【propagate_entity_load_avg】

MLOps生产化实战:从Notebook到高可用模型服务 机器学习模型部署不是简单封装API,而是跨越开发与运维边界的系统工程。其核心在于解决数据流、计算资源与可观测性的三重断层:特征需离线/在线一致性保障,推理须适配GPU资源约束与动态批处理,监控则要覆盖延迟、置信度、特征健康等多维指标。Triton+KServe架构实现高性能与可路由的平衡,Feast统一特征定义,Istio支持细粒度灰度,MLflow固化实验元数据。这些实践共同构成MLOps落地的关键路径——让模型真正具备可审计、可回滚、可证伪的工业级可靠性。 阅读详情

对于组调度而言,需要传播负载的变化到整个cfs列表里面。propagate_entity_load_avg就负责传播组调度负载的变化

propagate_entity_load_avg

/* Update task and its cfs_rq load average */
static inline int propagate_entity_load_avg(struct sched_entity *se)
{
	struct cfs_rq *cfs_rq;
	//只有group下面才有cfs_rq,才需要传播
	if (entity_is_task(se))
		return 0;

	if (!test_and_clear_tg_cfs_propagate(se))
		return 0;
	/* 获取se所在的cfs_rq */
	cfs_rq = cfs_rq_of(se);

	set_tg_cfs_propagate(cfs_rq);
	/* 更新group se与其所在的cfs_rq中的负载 */
	update_tg_cfs_util(cfs_rq, se);
	update_tg_cfs_load(cfs_rq, se);

	trace_sched_load_cfs_rq(cfs_rq);
	trace_sched_load_se(se);

	return 1;
}

// 将cfs_rq->propagate_avg 设置为1
static inline void set_tg_cfs_propagate(struct cfs_rq *cfs_rq)
{
	cfs_rq->propagate_avg = 1;
}

// 将cfs_rq->propagate_avg 设置为0
static inline int test_and_clear_tg_cfs_propagate(struct sched_entity *se)
{
	struct cfs_rq *cfs_rq = group_cfs_rq(se);

	if (!cfs_rq->propagate_avg)
		return 0;

	cfs_rq->propagate_avg = 0;
	return 1;
}

更新负载

update_tg_cfs_util

/* Take into account change of utilization of a child task group */
static inline void
update_tg_cfs_util(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
	struct cfs_rq *gcfs_rq = group_cfs_rq(se);
	/* 计算变化值 */
	long delta = gcfs_rq->avg.util_avg - se->avg.util_avg;

	/* Nothing to update */
	if (!delta)
		return;

	/* Set new sched_entity's utilization */
	/* group se的util_avg的等于其gcfs_rq的util_avg */
	se->avg.util_avg = gcfs_rq->avg.util_avg;
	se->avg.util_sum = se->avg.util_avg * LOAD_AVG_MAX;

	/* Update parent cfs_rq utilization */
	/* 将util_avg的变化传播并更新到cfs_rq */
	add_positive(&cfs_rq->avg.util_avg, delta);
	cfs_rq->avg.util_sum = cfs_rq->avg.util_avg * LOAD_AVG_MAX;
}

/*
 * Signed add and clamp on underflow.
 *
 * Explicitly do a load-store to ensure the intermediate value never hits
 * memory. This allows lockless observations without ever seeing the negative
 * values.
 */
#define add_positive(_ptr, _val) do {                           \
	typeof(_ptr) ptr = (_ptr);                              \
	typeof(_val) val = (_val);                              \
	typeof(*ptr) res, var = READ_ONCE(*ptr);                \
								\
	res = var + val;                                        \
								\
	if (val < 0 && res > var)                               \
		res = 0;                                        \
								\
	WRITE_ONCE(*ptr, res);                                  \
} while (0)

update_tg_cfs_load

/* Take into account change of load of a child task group */
static inline void
update_tg_cfs_load(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
	struct cfs_rq *gcfs_rq = group_cfs_rq(se);
	long delta, load = gcfs_rq->avg.load_avg;

	/*
	 * If the load of group cfs_rq is null, the load of the
	 * sched_entity will also be null so we can skip the formula
	 */
	if (load) {
		long tg_load;

		/* Get tg's load and ensure tg_load > 0 */
		tg_load = atomic_long_read(&gcfs_rq->tg->load_avg) + 1;

		/* Ensure tg_load >= load and updated with current load*/
		tg_load -= gcfs_rq->tg_load_avg_contrib;
		tg_load += load;

		/*
		 * We need to compute a correction term in the case that the
		 * task group is consuming more CPU than a task of equal
		 * weight. A task with a weight equals to tg->shares will have
		 * a load less or equal to scale_load_down(tg->shares).
		 * Similarly, the sched_entities that represent the task group
		 * at parent level, can't have a load higher than
		 * scale_load_down(tg->shares). And the Sum of sched_entities'
		 * load must be <= scale_load_down(tg->shares).
		 */
		if (tg_load > scale_load_down(gcfs_rq->tg->shares)) {
			/* scale gcfs_rq's load into tg's shares*/
			load *= scale_load_down(gcfs_rq->tg->shares);
			load /= tg_load;
		}
	}

	delta = load - se->avg.load_avg;

	/* Nothing to update */
	if (!delta)
		return;

	/* Set new sched_entity's load */
	se->avg.load_avg = load;
	se->avg.load_sum = se->avg.load_avg * LOAD_AVG_MAX;

	/* Update parent cfs_rq load */
	add_positive(&cfs_rq->avg.load_avg, delta);
	cfs_rq->avg.load_sum = cfs_rq->avg.load_avg * LOAD_AVG_MAX;

	/*
	 * If the sched_entity is already enqueued, we also have to update the
	 * runnable load avg.
	 */
	if (se->on_rq) {
		/* Update parent cfs_rq runnable_load_avg */
		add_positive(&cfs_rq->runnable_load_avg, delta);
		cfs_rq->runnable_load_sum = cfs_rq->runnable_load_avg * LOAD_AVG_MAX;
	}
}

 

【信息科学与工程学】计算机科学与自动化 第二百三十三篇 凤凰架构01 编号类型领域系统软件/硬件或系统集成方案及系统架构模块子模块函数名称/算法名称算法的数学分析及计算机体系架构及数据结构与算法详细设计及参数列表及数值范围设计关联知识1共识算法分布式基石状态机复制架构:Proposer/Acceptor/Learner 多节点角色模型,基于操作转移(Operation Transfer)分布式共识PaxosPaxos 协议(Prepare/Promise/Accept/Accepted 两阶段)数学基础:多数派(Quorum)投票,基于鸽巢原理保证 W+R>N 时读写集合必有 阅读详情

相关推荐

【信息科学与工程学】【数据中心】 第二十七篇 AI领域各类通讯模式01

类型业务特性数据要求数据Pipeline工作流程Pipeline应用场景限制条件机器学习​模式识别、预测分析、决策支持结构化数据、标注数据、特征工程数据采集 → 数据清洗 → 特征提取 → 特征选择 → 数据集划分问题定义 → 数据准备 → 模型选择 → 训练 → 评估 → 调优 → 部署推荐系统、风险评估、客户分群、销售预测依赖数据质量、过拟合风险、解释性差、需要持续更新深度学习​端到端学习、复杂模式提取、自动特征工程大规模数据、标注数据、图像/文本/语音数据增强 → 标准化 → 批处理 → 数据加载器架

weixin_49199313的博客 732

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

___update_load_avg 之前版本的kernel没有accumulate_sum函数,而是直接将这部分放在本函数内执行。 accumulate_sum详见https://blog.youkuaiyun.com/feifei_csdn/article/details/103814876 主要是对time进行衰减 /* * We can represent the historical contribution to runnable average as the * coefficients o

勿于浮沙筑高台 1608

FreeRTOS:卡在configASSERT( ( pxQueue ) )问题的解决

FreeRTOS卡在configASSERT( ( pxQueue ) )问题的解决

qq_42007164的博客 9567

【内核调度、负载均衡】【update_sg_lb_stats】

target_load target_load是迁移到的cpu的load,或者我们可以说是目的cpu的load static inline unsigned long cfs_rq_runnable_load_avg(struct cfs_rq *cfs_rq) { return cfs_rq->runnable_load_avg; } /* Used instead of source_load when we know the type == 0 */ static unsigned l

勿于浮沙筑高台 1078

保姆级教程:Halcon 3D点云匹配与差异分析避坑指南(从采样到可视化)

本文提供了一份详细的Halcon 3D点云匹配与差异分析实战指南,涵盖从模型准备到可视化的全流程。重点解析了STL文件读取单位误区、点云采样密度优化、表面模型创建技巧以及差异分析的专业手法,帮助用户避开常见陷阱,提升工业检测效率与精度。

weixin_33728268的博客 402

从零构建:Esp32+Esp-IDF驱动ST7789屏幕并集成LVGL图形库

本文详细介绍了如何从零开始使用Esp32和Esp-IDF驱动ST7789屏幕并集成LVGL图形库。内容涵盖环境准备、SPI驱动配置、屏幕初始化、LVGL图形库集成及常见问题排查,帮助开发者快速实现高效稳定的显示解决方案。

weixin_42657024的博客 525

EAS(能量感知调度)绿色节能调度器

当调度程序决定当前任务应该在哪里运行时(在唤醒期间),EM用来打破了几个好的CPU候选者之间的平等关系,选择一个最佳的候选CPU运行当前任务会产生最少的电量消耗而不牺牲系统的吞吐量的目标。增加了描述能效模型的数据结构structsched_group_energy,MC等级的调度组描述单个CPU的能效模型,DIE等级的调度组描述的cluster的能效模型。2).判断当前的CPU的计算负载是否超过了该CPU最高计算能力的80%,如果是,说明触发overutilized条件了。...

aigourensheng的博客 2529

stm32cubeMX使用HAL库点亮LED流水灯

目录

weixin_46129506的博客 3798

深入讲解CFS组调度!(下)

load_avg 定义为:load_avg = runnable% * scale_load_down(load)。runnable_avg 定义为:runnable_avg = runnable% * SCHED_CAPACITY_SCALE。util_avg 定义为:util_avg = running% * SCHED_CAPACITY_SCALE。这些负载值保存在struct sched_avg结构中,此结构内嵌到se和cfs_rq结构中。

youzhangjing_的博客 623

CXL Virtual Hierarchy (VH) Enumeration理解

在 CXL 3.0 协议中,CXL Virtual Hierarchy (VH) Enumeration 是一种针对 CXL 虚拟层级(Virtual Hierarchy) 设计的设备枚举机制,它允许软件将物理连接的 CXL 设备抽象为多个逻辑层级(虚拟层级),从而实现更灵活的资源管理和拓扑扩展。与传统的 PCIe 枚举相比,CXL VH 枚举在协议特性、拓扑抽象和资源分配机制上有显著差异。本质:VH 是一个逻辑上的设备层级结构,可能与物理连接拓扑不同。

Summer的博客 1003

ZYNQ通过AXI DMA实现PL发送连续大量数据到PS DDR

方案二是在PS端的MPU配置中,将DMA缓冲区所在的内存区域标记为“不缓存”(Device或Strongly Ordered类型),但这样CPU访问这些内存区的速度会大幅降低,需要根据实时性和数据正确性的需求做权衡。更妙的是,描述符链表可以做成一个环状队列,放在DDR里让DMA循环取走,从而实现持续不断的“流式”传输。用FPGA实现FFT硬件加速的系统中也是如此:PS向PL提交待处理的FFT数据,PL硬件加速计算后,DMA把结果写回DDR,全程CPU几乎只做配置调度,大量数据吞吐留给了硬件通道。

QQ_778132974的博客 175

查询与进程调度(CFS)相关信息

进程的nice值,优先级,调度策略,vruntime等信息。在proc目录下,以下是查询147号进程的调度信息。先执行 echo 1 > /proc/sys/kernel/sched_schedstats。调度相关的统计 需要配置CONFIG_SCHEDSTATS。再次查看,多出来好多statistics信息。

968

044、Edge Impulse的音频分类实战

上周调试一块STM32WBA52开发板,板载PDM麦克风死活采不到有效数据。示波器怼上去,时钟线波形漂亮得像教科书,数据线却像心电图——全是毛刺。折腾半天发现是电源纹波干扰,给麦克风单独加了个LC滤波,世界清净了。这种坑,做音频分类的嵌入式工程师迟早要踩一遍。

2401_88858637的博客 54

MuleSoft企业级AI编排:构建安全可控的大模型集成中枢

AI编排(AI Orchestration)是将大语言模型深度融入企业核心业务系统的关键范式,其本质不是简单调用LLM API,而是通过集成平台实现安全治理、上下文编织与多源协同。MuleSoft Anypoint Platform凭借Runtime Fabric的K8s原生架构、DataWeave的数据语义处理能力及Exchange的API治理中枢,为企业提供LLM推理所需的可信执行环境。相比LangChain等轻量框架,MuleSoft在事务一致性、错误契约化、审计留痕和GPU资源隔离等方面具备不可替代

weixin_30740295的博客 376

基于Matlab模拟六自由度Stewart并联机器人运动学逆解

在现代工业和科学领域中,机器人技术的发展已经取得了巨大的进步,为生产和研究提供了许多便利。其中,六自由度Stewart并联机器人是一种广泛应用于各种领域的机器人系统。它具有高精度、高刚度和高可靠性的特点,被广泛应用于飞行模拟器、手术机器人和运动仿真等领域。然而,要使Stewart并联机器人能够实现复杂的运动任务,我们需要了解其运动学逆解。运动学逆解是指根据机器人末端执行器的位置和姿态,计算出各个关节的角度和长度。这对于控制机器人的运动非常重要,因为它可以帮助我们确定机器人各个关节的运动范围和工作空间。

qq_59747472的博客 1128

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

CPU利用率和Load Average

CPU时间片        为了提高程序执行效率,大家在很多应用中都采用了多线程模式,这样可以将原来的序列化执行变为并行执行,任务的分解以及并行执行能够极大地提高程序的运行效率。但这都是代码级别的表现,而硬件是如何支持的呢?那就要靠CPU的时间片模式来说明这一切。程序的任何指令的执行往往都会要竞争CPU这个最宝贵的资源,不论你的程序分成了多少个线程去执行不同的任务,他们都必须排队等待获取这个资源...

y.a.l.e 563

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

CFS完全公平调度算法 - per entity load tracking 几个重要的函数分析

kernel/sched/fair.c  ##############   负载衰减计算函数decay_load() #################### /*  * We choose a half-life close to 1 scheduling period.  * Note: The tables below are dependent on this valu

helloanthea的专栏 5050

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux 负载

负载定义 load_avg/util_avg include/linux/sched.h有定义 struct sched_avg { load_avg 包含进程睡眠所花的时间 runnalbe_load_avg只包含任务在rq上面所花费的时间 代码区别查看分析确认: 数据结构 task_struct -> sched_entity -> sched_avg cfs_rq-> sched_entity(curr, last, next)-> -> sched_avg 和cg

techtitan的专栏 400

一次cfs组调度不公平引起的负载不均衡分析及cfs组调度深入探索(三)

对于 patch,在任务设置到任务组的时候在调用 attach_entity_cfs_rq 时,patch将任务对应的 cfs_rq(这里是 cfs_rq[30])将其加入到链表中,那么只要这个cfs_rq还有负载,就会在负载均衡时一直进行负载更新,直至移除负载或者衰减为0,那么此时向任务组贡献的load_avg将会正确衰减回归正确水平。从上述逻辑中可以看到,对于非睡眠任务负载会直接移除,并更新整个任务组负载,如果任务睡眠,负载并不会立即移除,而是在唤醒时附加到原有 cfs_rq->removed 中。

看我眼色行事的博客 1325

郭健: Linux调度器中的PELT(Per-Entity Load Tracking)

本文来源蜗窝科技http://www.wowotech.net/process_management/PELT.html本文是对https://lwn.net/Artic...

Linux阅码场 1230

linux负载均衡 和 系统负载分析笔记

linux负载均衡,系统负载,cpu使用率

u010936265的博客 1479

android 查看cpu 工具6,Android 之CPU监控命令

一、前言此篇文章就是通过分析整个操作系统或者单个进程CPU,来监控应用的性能。而在Linux世界中,一切对象皆文件。进程执行的时候,也会将相关的信息保存在约定好的文件中,所以熟悉这些文件是必要的。二、CPU数量系统的CPU数量存放在/sys/devices/system/cpu/possible中,如下输出共有0至3四个CPU。root@p212:/proc # cat /sys/devices/...

weixin_42492000的博客 1444

Linux 4.0 CFS负载均衡原理

负载计算 在不考虑EAS的情况下,负载采用PELT计算; struct sched_avg { /* * These sums represent an infinite geometric series and so are bound * above by 1024/(1-y). Thus we only need a u32 to store them for all * c...

鲲的博客 467

Linux进程里运行新代码,linux调度器源码分析 - 新进程加入(三)

中专门描述了copy_process()这个创建函数,而里面有一个函数专门用于进程调度的初始化,就是sched_fork(),其代码如下int sched_fork(unsigned long clone_flags, struct task_struct *p){unsigned long flags;/* 获取当前CPU,并且禁止抢占 */int cpu = get_cpu();/* 初始化跟...

weixin_29196891的博客 365

PELT负载统计原理

pelt简介

m0_72502585的博客 3008

CFS组调度

注:本文缩写说明一、CFS组调度简介1.1. 存在的原因总结来说是希望不同分组的任务在高负载下能分配可控比例的CPU资源。为什么会有这个需求呢,比如多用户计算机系统每个用户的所有任务划分到一个分组中,A用户90个相同任务,而B用户只有10个相同任务,在CPU完全跑满的情况下,那么A用户将占90%的CPU时间,而B用户只占到了10%的CPU时间,这对B用户显然是不公平的。再或者同一个用户,既想-j6...

内核工匠 1999
上一篇: 【内核调度、负载均衡】【entity_tick】
下一篇: 【内核调度】【休眠进程的唤醒】【wake_up_process】
money_yuan
博客等级 码龄10年 104粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值