LWN:在mainline中关闭task migration!

CFS及RT调度整体介绍 linux内核调度子系统——CFS调度器/组调度,cfs,组调度,lazy preemption 阅读详情

关注了就能看到更多这么棒的文章哦~

Migration disable for the mainline

By Jonathan Corbet
November 9, 2020
DeepL assisted translation
https://lwn.net/Articles/836503/

realtime 的开发人员多年来一直在努力创建一个能够确保最高优先级的任务总是能够毫不延迟地运行的内核。这意味着需要进行漫长的工作,不断寻找和解决那些可能会阻止高优先级任务运行的情况。其中,有一个长期存在的问题就是那些关闭了抢占(disable preemption)的内核代码。realtime 开发人员已经实现的一个工具就是禁用 migration(迁移,指将某个进程从一个 CPU 移动到另一个 CPU),而不是禁用抢占。不过这种方法在 scheduler 开发人员中并未广泛接受。即便如此,最终的解决方案似乎也是来自 scheduler 开发者 Peter Zijlstra 的这套 migration-disable patch set (https://lwn.net/ml/linux-kernel/20201023101158.088940906@infradead.org/)。

内核中使用的可扩展性技术之中非常关键的一个,是 per-CPU 数据。全系统级别的锁(system-wide locking)是保护共享数据的一种很有效的方式,但因为多种原因,它会损害性能,哪怕这个锁本身没有多少争抢也一样。任何只被单个 CPU 访问的数据结构都不需要全系统级别的锁保护,从而避免了这个问题。举例来说,内存分配器(memory allocator)会维护每个 CPU 的可用内存区域的列表,在分配的时候就可以不受系统上其他 CPU 的干扰了。但是,内核代码只有在独占 CPU 的情况下才能安全地操作 per-CPU 数据,如果这时其他进程有渠道可以插进来执行,那么它可能会看到(或导致)产生不一致的 per-CPU 数据结构。要防止这种情况的话, 正常来说就是在必要的时候禁用抢占,这个操作开销非常小(本质上来说就是设置一个标志而已),这样就能确保一个给定的任务在完成工作之前不会被中断。

禁用抢占,这是 realtime 开发者不喜欢看到的,他们已经进行了大量的工作来确保任何 task 都可以在更高优先级的 task 需要 CPU 时被中断。当他们努力移除这些 preemption-disabled 区域的时候,他们观察到,通常情况下,真正需要的是防止 task 在访问 per-CPU 数据时在 CPU 之间移动,也许还需要加上一些(通常是 本地 CPU 的)锁。例如,参见 kmap_local()的工作(https://lwn.net/Articles/836144/)。禁用迁移的话,仍然可以允许进程被抢占,所以它不会破坏 realtime project 的目标,或者说那些开发者希望能够达到这个目的。

不过,禁用迁移也会带来自己特有的问题。内核的 CPU scheduler 的任务是充分利用系统中所有的 CPU。如果有 N 个 CPU 可用,它们应该在任何时候都在运行 N 个最高优先级的任务。如果不偶尔在 CPU 之间移动任务的话,这个目标就无法实现。每次新创建的任务都恰好能落在正确的处理器上的话,那就太好了,但现实世界不是这样的。因此,如果剥夺了调度器迁移任务的能力的话,哪怕只是暂时关闭,也实际上剥夺了一个对系统的整体行为和吞吐量至关重要的工具。

举个简单的例子,想象一个只有两个 CPU 和两个任务的系统,其中只有优先级较低的任务当前是 runnable 状态,也就是可以真正执行的。在高优先级任务在这个 CPU 上变成 runnable 状态的同时,这个低优先级任务就进入了一段 mirgration-disabled 的阶段。该低优先级任务将被抢占,以便让高优先级任务能够运行。不过,这时低优先级任务仍然希望使用 CPU,而与此同时,另一个 CPU 却处于空闲状态。正常情况下,调度器会将低优先级任务迁移到空闲的 CPU 上,让它继续运行,但由于这里已经暂时禁用了迁移,所以此进程就被 block 住,无法运行。因此,这是 migration disable 和 preemption disable 的一个区别,如果只是禁用抢占的话,不会导致此进程被阻塞。

因此,不出意外,这个 migration disable 功能在 mainline 的 scheduler 开发者们之中并不受欢迎。不过,这些开发者(尤其是 Zijlstra)也明白推动这项工作的真正需求是什么。所以,当 Thomas Gleixner 在 9 月份发布了一套 migration-disable 的补丁时,Zijlstra 拒绝合入它,但他也着手创建了一个从 scheduler 角度来看可以接受的替代方案,至少对 realtime 内核应该够用了。实现这个机制的 patch,一上来的 comment 里面就明确指出,这种 migration disable 功能是"(强烈)不希望采用的":

这充其量只是一个 "临时 "的变通方法。正确的解决方案是摆脱上述假设,并重新设计代码,采用显式的 per-cpu locking 或更短的 preempt-disable 区域。

最终的目标必须是摆脱 migrate_disable(),否则的话我们就需要一个不依赖于强制迁移的可调度性方式了。

在让 migration disable 功能能正常工作起来时,有几个特别棘手的地方。其中之一,自然是 CPU hotplug,这在过去已经证明 hotplug 有很多麻烦(https://lwn.net/Articles/537562/)。如果要将 CPU 从系统中移除,首先应该将所有正在运行的进程迁移到其他地方,以免碰到更棘手的问题,也就是发怒的用户。但如果其中一些进程已经禁用了迁移功能,那就不能立即进行迁移。所以热插拔机制必须要能统计出每个 runqueue 中有多少任务禁用了迁移,并且要等到这个数字降到零。

然后,就是上面所说的任务被阻塞的问题:可能有一个 CPU 可用来运行一个优先级较低的任务,而这个任务已经被抢占掉了,在禁用迁移后,这个任务就无法移动到这个可用的 CPU 上。在极端的情况下,几个被抢占的任务最终可能都会堆积在一个 CPU 上,无法迁移,而大部分系统仍然处于空闲状态。这种行为违反了"work conservation"的规则,肯定不会让调度器开发人员开心——他们已经因为暴躁而很出名了。

针对这个问题所采取的方法并不是一个完美的解决方案(可能并不存在一个完美的方案),但希望它能有所帮助。如果一个 CPU 的 runqueue 中包含一个 runnable 的任务,但它已经被一个更高优先级的任务抢占了,正常的反应是尝试将这个被抢占的任务迁移到其他地方。如果迁移已经被禁止,显然这是不可能的。所以,调度器会尝试迁移正在运行的、优先级更高的任务,以解除这种困境。这并不是个理想的方案,迁移是有代价的,包括可能会导致损失 cache locality(CPU 本地 cache 中已有数据的高效访问),这些代价现在将由更高优先级的任务来承担。或者,正如 Zijlstra 所说的那样。"这给更高优先级的任务增加了迁移带来的干扰,但是却使得系统完全的计算能力得以恢复,否则就得不得不承担算力损失了"。

最后,值得指出的是,迁移禁用将仅限于配置为 realtime 的内核。在其他内核上,调用 migrate_disable()将会正常禁用抢占,就像现在的行为一样。所以对于大多数用户来说,行为不会改变,至少不会直接改变。在这么多年后,这是将 realtime preemption patch 完全迁移到 mainline 上的又一重要步骤。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

全国30米分辨率逐年植被覆盖度(FVC)数据集 植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。分别对LANDSAT 5/7/8系列数据计算FVC,其中Landsat5 和Landsat 7NDVI计算利用 B4和B3波段,Landsat8 和Landsat9 NDVI计算利用 B5和B4波段。算法从当年所有观测数据中,以低云、低探测角度和最高NDVI值为标准,选择最佳的可用像元值,并进行换算。(3) FVC的计算。 阅读详情

相关推荐

HFSS线圈仿真避坑指南:从建模到寄生参数分析的完整流程

本文详细介绍了HFSS线圈仿真的完整流程,从精准建模到寄生参数优化,特别针对Ansys Electronics Desktop用户提供实用指南。涵盖线圈几何构建、材料属性配置、端口激励设置及寄生电阻与电感分析等关键步骤,帮助工程师避免常见错误,提升仿真精度与效率。

weixin_29209801的博客 548

Linux软件锁使用规则,【翻译】Linux 锁的种类和规则

介绍内核提供了多种锁定原语,可以将其分为几类:睡眠锁CPU本地锁自旋锁本文档从概念上描述了这些锁类型,并提供了它们的嵌套规则,包括在PREEMPT_RT下使用的规则。译者注:PREEMPT_RT是Linux内核的一个实时补丁,能让Linux变成一个实时操作系统。锁类别睡眠锁只能在可抢占的任务上下文中获取睡眠锁。尽管实现允许在其他上下文中使用try_lock(),但有必要仔细评估unlock()和t...

weixin_39642619的博客 835

ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

【代码】ServiceNow Discovery & CMDB Interview Questions and Answers (2025)

weixin_47584092的博客 910

linux 内核migration任务,[转]linux内核线程migration_thread和kthreadd的创建

linux内核中两大重要的线程,migration_thread负责cpu的负载均衡(将进程从本地队列移动到目标cpu的队列),kthreadd负责为kthread_create_list链表中的成员创建内核线程。内核版本2.6.24中的引导部分,start_kernel()->rest_init():点击(此处)折叠或打开static void noinline __init_refok ...

weixin_30744725的博客 2515

基于CubeMX与lwip的STM32轻量级HTTP服务器搭建及VSCode高效开发指南

本文详细介绍了如何在STM32单片机上,利用STM32CubeMX图形化配置工具和轻量级TCP/IP协议栈lwIP,快速搭建一个轻量级HTTP服务器。通过结合VSCode的高效代码编辑能力,提供了一套从硬件连接到动态网页交互(SSI/CGI)的完整开发指南,旨在为嵌入式设备提供零成本、跨平台的Web交互界面。

weixin_29163857的博客 582

KMS服务器一键部署与激活实战指南

本文详细介绍了KMS服务器的一键部署与激活实战指南,包括快速入门、安装步骤、服务管理技巧及常见问题排查。特别针对Windows和Mac用户提供了Office激活的具体操作步骤,并分享了高级配置与优化方案,帮助IT管理员高效管理批量授权激活。

weixin_29305313的博客 460

【内核调度、hotplug进程迁移】【migrate_tasks】

在cpu_down()时,需要调用migration_call() -> migrate_tasks()把cpu上所有runnable进程迁移到其他cpu;在cpu_up()时,并不需要在函数中迁移进程,直接等待负载均衡算法的迁移。 migrate_tasks 需要注意的是被迁移的task的dst cpu很有可能都是不一样的。 /* * Migrate all tasks from the rq, sleeping tasks will be migrated by * try_to_wa

勿于浮沙筑高台 1700

latex写论文(TeXstudio工具)

目录前言IEEE模板模板免费分享参考文献写作方法我的.tex文件代码 前言 学校老师要求我们以IEEE顶级会议格式与标准写报告,于是过程虽然麻烦点,但是效果还是不错了,下面先展示一下自己写完的效果。 IEEE模板 我是在 Overleaf 上注册了个账号下载了模板,里面有各种会议论文的写作模板,这个注册还挺麻烦,要外网注册,国内邮箱都不行。进行后点菜单,菜单里有下载源码。 https://cn.overleaf.com/project/5fe5b082dff088649fc67106 模板免费分享 已

小样yx的博客 6749

记一次阿里云linux服务器中毒处理

记一次阿里云linux服务器中毒处理 事件 定位进程 人肉筛查 clamav 来源 参考 事件 阿里云告警: 您的云服务器(XXXXX)由于被检测到对外攻击,已阻断该服务器对其它服务器端口(XXX)的访问,阻断预计将在XXXXXX时间内结束,请及时进行安全自查。 登录服务器(Ubuntu 16.04.4 LTS),发现CPU满载,docker下的jekins各种重启。 定位进程...

bggl的博客 1232

Apache Paimon快照管理实战:如何避免Flink作业中的反压问题?

本文深入探讨了如何通过优化Apache Paimon的快照管理机制来避免Flink作业中的反压问题。详细解析了同步与异步快照过期模式的适用场景及配置建议,并提供了Checkpoint策略与状态后端的协同优化方案,帮助提升实时数据处理的性能和稳定性。

i1j2k的博客 177

MyEclipse 2017 CI 10安装与激活

本文介绍MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的安装与激活。此方法理论上应该能激活MyEclipse 2017 CI所有系列,即激活方法是通用的,只是激活文件略有不同。本文提供MyEclipse 2017 CI 7、CI 8、CI 9和CI 10的激活文件。说明:博主所提供的压缩包格式均为RAR5,即WinRAR 5.0以上的版本才能正常解压,别的压缩软件博主不太清...

weixin_42539046的博客 9416

linux调度原理(五)

schedule函数流程分析

sy4331的博客 1611

【Docker】完美解决拉取镜像超时报错:ERROR: Get https://registry-1.docker.io/v2/

因为我们下载的镜像是外网的镜像资源,所以下载的速度会非常的慢,甚至大概率下载时会报错,所以需要我们配置一个国内的服务器镜像地址,国内服务器镜像地址有很多,这里咱们就说一下阿里镜像加速器的配置方法。

liu_chen_yang的博客 12万+

深入理解Linux进程上下文切换:从__schedule到线程切换

调度层__schedule):做出"切换谁"的决策内存管理层):处理地址空间切换硬件抽象层):处理架构特定的状态保存恢复汇编层):执行最底层的寄存器切换这种设计不仅清晰分离了关注点,还允许不同架构提供自己的优化实现。每次上下文切换虽然只有微秒级的时间开销,但正是这精妙的机制支撑起了整个Linux系统的多任务魔法。通过源码分析,我们看到了操作系统设计中的诸多智慧:惰性TLB切换优化性能、FPU状态延迟加载减少开销、对硬件bug的巧妙规避。这些细节共同确保了Linux能够在各种硬件上高效可靠地运行。

u014200244的专栏 688

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

发现英语有点不够用了,尤其是计算机英语

点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章最近技术上一直在研究QEMU、 KVM、vGPU等,因为要解决一个非常重要的vGPU Migration问题。为了解决这个问题,翻阅...

flysnow_org的博客 254

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux性能分析神器ftrace:从原理到实战

ftrace,即 Function Trace 的缩写,是 Linux 内核自带的一款强大的跟踪工具。它诞生于 2008 年,由 Steven Rostedt 开发,并在 2.6.27 版本的内核中首次引入。最初,ftrace 只是一个简单的函数跟踪器,主要用于记录内核的函数调用流程,随着不断的发展和完善,如今它已演变成一个功能丰富的跟踪框架,采用插件式的设计,支持开发者添加更多类型的跟踪功能,在 Linux 内核的开发与调试中发挥着不可或缺的作用。

深度Linux 1104

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

屏障指令 - 防止优化导致错误

处理器流水线设计、编译器优化设计,为了获得更高性能,有时程序代码顺序会被重新编排。 这种 重编排有时 会带来意外的程序 错误。 如: preempt_disable(); function_which_must_not_be_preempted(); preempt_enable(); 可能如下重排效果: function_which_must_not_be_preempted(); preempt_disable(); preempt_enable(); 也可能如下重排效果: preempt_dis

liuxs2009的专栏 473

Linux内核同步 - memory barrier

一、前言 我记得以前上学的时候大家经常说的一个词汇叫做所见即所得,有些编程工具是所见即所得的,给程序员带来极大的方便。对于一个c程序员,我们的编写的代码能所见即所得吗?我们看到的c程序的逻辑是否就是最后CPU运行的结果呢?很遗憾,不是,我们的“所见”和最后的执行结果隔着: 1、编译器 2、CPU取指执行 编译器将符合人类思考的逻辑(c代码)翻译成了符合CPU运算规则的汇编指令,编译器了解底层CPU...

weixin_34248487的博客 277

preempt_disable导致的cyclictest测试延时超标

1,内核:4.19.90 preempt rt 架构:arm64 2,测试步骤和结果 1)cyclictest -p 90 -m -c 0 -i 1000 (v1.10) 2)ltpstress.sh -p -n -t 48 测试结果:cyclictest的最大延时超过10毫秒 3,ftrace log 1)方法 trace-cmd start -e all;cyclictest -p 90 -m -c 0 -i 1000 -b 1000 --tracemark ltpstre...

chensong_2000的博客 1269

进程迁移

进程迁移(Process Migration) 什么是进程迁移?  进程迁移就是将一个进程从当前位置移动到指定的处理器上。它的基本思想是在进程执行过程中移动它,使得它在另一个计算机上继续存取它的所有资源并继续运行,而且不必知道运行进程或任何与其它相互作用的进程的知识就可以启动进程迁移操作,这意味着迁移是透明的。 进程迁移的好处  进程迁移是支持负载平衡和高容错性的一种非常有

√R.D 3533

preempt rt对pagefault的处理

在项目中我们发现了实时系统的pagefault开销比非实时要高,所以本文对pagefault做一下分析和对比。 1,pagefault调用栈(以arm64为例,内核版本为4.19.90) el1_da(arch/arm64/kernel/entry.S)--arm64发生dataabort的异常处理入口 do_mem_abort inf=esr_to_fault_info(fault_info,异常向量表,见arch/arm64/mm/fault.c+...

chensong_2000的博客 484

Linux Kernel Lock types and their rules

目录 Lock types and their rules Introduction Lock categories Sleeping locks CPU local locks Spinning locks Owner semantics rtmutex semaphore semaphores and PREEMPT_RT rw_semaphore rw_semaphore and PREEMPT_RT local_lock local_lock and PREEMPT_RT

RToax 868

Linux进程管理 (7)实时调度

关键词:RT、preempt_count、RT patch。 除了CFS调度器之外,还包括重要的实时调度器,有两种RR和FIFO调度策略。本章只是一个简单的介绍。 更详细的介绍参考《Linux进程管理 (9)实时调度类分析,以及FIFO和RR对比实验》。 同时为了提高Linux的实时性,Linux社区还维护了realtime相关的补丁。这些补丁的介绍在《Linux实时补丁及其分析》。 ...

weixin_30491641的博客 275

nova migrate 迁移问题集锦

nova migrate ERROR: Policy doesn't allow compute_extension:admin_actions:migrate to be performed. (HTTP 403)

GIS+=地理信息+云计算+大数据+容器+物联网+... 2199

php artisan migration 数据库操作的使用说明

一、命名规范 1,创建表命名 php artisan make:migration create_tablename_table --create="tablename" 2,修改字段命名 php artisan make:migration alter_tablename_table --table=tablename 3,添加字段命名 php artisan make:mig...

lw545034502的博客 6768

Linux内核抢占和进程调度

HY:内核禁止抢占,并不会妨碍进程调度,所以自旋锁(禁止抢占)保护的代码不能睡眠,否则会进行内核进程调度,可能会造成死锁。 抢占:在系统调用到内核态时,也可以发生进程调度。 -------------- 自旋锁是SMP架构中的一种low-level的同步机制。 当线程A想要获取一把自旋锁而该锁又被其它线程锁持有时,线程A会在一个循环中自旋以检测锁是不是已经可用了。对于自选锁需要注意: 由于自旋时不释放CPU,因而持有自旋锁的线程应该尽快释放自旋锁,否则等待该自旋锁的线程会一直在那里自旋,这...

u014426028的博客 3006
上一篇: LWN:让Autoconf重焕生机!
下一篇: LWN:Android上使用KVM!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值