LWN:平衡好处理软中断以及实时任务!

块设备IO完成软中断平衡参数(rq_affinity)的意义 rq_affinity, 块设备IO完成软中断的平衡 By default this value is set to 1, which means that once an I/O request has been completed by the block device, it will be sent back to the "group" of CPUs that the request... 阅读详情

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

Juggling software interrupts and realtime tasks

By Jonathan Corbet
December 2, 2022
DeepL assisted translation
https://lwn.net/Articles/915320/

软件中断(software-interrupt)机制是内核中最古老的子系统之一了。甚至可以说,这部分代码背后的基础设计都早于 Linux 本身。软件中断会打断其他工作,因此,几乎是从它们出现的那一天开始,开发者就已经很希望看到它们能早点消失了。不过人们一直还没能达到这个目的,而且看起来也不会很快达到。相反,安卓系统长期以来一直带有一个 patch 从而试图将软件中断的影响降到最低,至少在某些情况下是这样。John Stultz 现在正在发布这部分代码,其中包含了多位作者的贡献,并希望能将其纳入 mainline 内核。

硬件中断(通常简称 "中断")是在系统中某个物理硬件组成部分希望能得到内核的关注时所发出的;它们通常会立即触发一个 trap 进入特殊的处理函数(handler function)。由于中断会让系统从它当前正在做的工作中跳出来,因此中断处理程序必须迅速完成它们的工作;也就没有时间进行什么扩展处理(extended processing)。这并不是一个什么新问题;Linux 之前的 Unix 系统就经常包括一个 "bottom half(下半部)" 的概念,用左一种推迟把中断处理程序(interrupt handler)中无法完成的工作推迟处理的一种方式。

Linux 内核里也不得不开发了一些机制,用来将中断处理工作推迟到更合适的时机。这些机制之一就是软件中断(或 "软中断,softirq")。它在 0.99 版本的内核中刚出现的时候采用了大家熟悉的 "bottom half "的名字;"softirq "这个词是直到 1.1.77 版本的开发版本中才出现的。缩写 "bh"("bottom half")仍然存在于跟软件中断有关的内核函数名称中。

在目前的实现里把若干个软件中断 "向量" (software-interrupt "vector")分配给了相应的子系统。每当这些子系统中某一个不得不推迟一些工作时,它就会在一个 per-CPU mask 中设置一个 bit,从而在后续某个时刻来调用其软件中断处理程序(software-interrupt handler)。通常,软件中断会在硬件中断处理完成后立即运行,也就是说它是以高优先级运行的,优先级高于内核的其他工作。软件中断机制是保留给内核中少数核心子系统使用的,比如网络子系统和块设备子系统,但有一个很大的例外:内核的 tasklet 机制是对任何子系统都可用的,它会用来在软件中断处理中执行 tasklet。

软件中断在一个运作良好的系统中也会产生延迟,所以它们长期以来一直吸引着那些对响应时间感兴趣的开发者的注意力。在配置为实时抢占(realtime preemption)的内核中,软件中断就像其他进程一样是在一个进程中被处理的,因此它们的优先级可以根据其重要性来进行设置。不过,我们大多数人运行的都不是这种实时抢占内核,所以软件中断处理通常会从其他那些希望运行的任务中抢一些时间。即使在正常的系统中,一个产生大量软件中断的系统最终也会将它们推迟到 per-CPU ksoftirqd 内核线程中。

通常情况下,人们总是希望 realtime task 总是系统上最优先的工作,哪怕是没有运行 realtime kernel 的系统也是一样。但是,软件中断的处理工作的优先级超过了 realtime task,并且会阻止它们在最后期限前完成任务。已经确实看到过软件中断引入的延迟在安卓系统上引起了 audio glitch(音频卡顿问题),从而引出了 Stultz 现在所提出的工作。

这个提议包含了两部分的改动,第一个部分是对 scheduler 针对 realtime task 的安排进行了修改。目前,当一个 realtime task 可以运行时,scheduler 将搜索一个看起来有足够计算空间 CPU 来运行该任务;这个检查的目的之一就是防止将一个资源密集型的任务放在一个缓慢的 CPU 上。Stultz 的 patch 增加了一个新的检查,就是看一下候选 CPU 是否正在处理(或即将处理)一个 "slow" 的软件中断,也就是预计需要相当多的处理时间的软件中断;为了能做出这个决策,他把来自网络子系统或者块设备子系统的软件中断定义为 "slow" 的软件中断。如果 CPU 确实在忙着做这些事,那么 scheduler 就会尝试把 realtime 放在其他 CPU 上,这样,希望该任务能更快地获得对 CPU 的访问。

第二个改动,改变了内核选择运行软件中断处理程序(software-interrupt handler)的方式。通常,这些处理程序会尽快在当前的 CPU 上运行,除非 ksoftirqd 线程已经在运行状态了(running)。在这种情况下,它们会被排在 ksoftirqd 那里处理。这组 patch 会让内核在运行软件中断处理程序之前,先检查当前 CPU 上是否有一个 realtime task 在运行;如果有的话,并且软件中断是 "slow" 类型的,那么就会被推迟到 ksoftirqd 上去,从而使得 realtime task 可以继续运行。更快的软件中断(比如那些 timer 中断)仍然会在当前 CPU 上立即执行。

为了实现这种分割处理,就需要一个很微妙的改动。在目前的内核中,如果 ksoftirqd 在 CPU 上运行,所有的软件中断都会被推迟到由它来处理。如果这些改变是生效状态(有新增一个 kernel configuration option 来配置),"fast" 软件中断将会被立即处理,无论 ksoftirqd 是否正在运行。这个改动是必要的,因为这组 patch 新增的对较慢的软件中断处理程序的延迟动作,可能会导致 ksoftirqd 在系统整体的软件中断工作量不大的时候运行。在之前的测试中,较快的中断处理程序可能会不应该地被延迟到 ksoftirqd。不过,现在新的代码就可能可以在软件中断已经有很多工作的时候不推迟它们的处理了。

这项工作得到最终结果是,诸如 cyclictest 这样的 realtime test 中的 latency 延迟结果要好很多。这些 patch 已经在安卓内核上使用了 "若干年",按理来说不会造成问题,至少在这种环境中不会。即便如此,Peter Zijlstra 对这项工作还是并不完全满意;他建议,最好是在有高优先级任务要运行时直接停止软件中断处理。他有一组 patch 做出了这样的改动,他以前曾发布过这些补丁,但他也承认,当时这项工作 "由于性能出现退化而没能成功"。

Stultz 对 Zijlstra 的这一系列 patch 进行了尝试,得出的结论是,虽然它改善了这种情况,但并没有完全解决这个问题。具体来说,如果某个软件中断处理程序会运行很长时间的话,这个改动没有什么帮助,而这种情况确实是实际生活中会发生的事情。因此,他说 "我不确定它真的能让我们放弃这组 softirq-rt placement optimization patch"。希望最终能制定出某种能让所有相关开发者都接受的解决方案。否则,很可能是安卓还需要继续背负这组 patch 好几年。

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

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

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

format,png

IAR9.4报错之编码方式 IAR9.40编码方式错误导致的报错 阅读详情

相关推荐

Simpack实战:5分钟搞定轨道车辆车轮不圆的3种定义方法(附详细参数设置)

本文详细介绍了在Simpack中定义轨道车辆车轮不圆的3种高效方法:Radius deviations、Fourier coefficients和Harmonic function,并提供了详细的参数设置指南。通过实战案例和参数优化技巧,帮助工程师快速掌握车轮不圆度的定义与仿真,提升轨道车辆动力学分析的准确性和效率。

weixin_29292535的博客 201

谈谈Linux内核的软中断机制

这些新的底半部处理机制解决了早期 “bottom half” 实现的问题,为内核提供了更好的性能、优先级支持和多处理器兼容性。自 Linux 内核 2.1.x 和 2.3.x 版本以来,Tasklets 和 SoftIRQ 已成为内核中的标准底半部处理机制,取代了早期的 “bottom half” 实现。硬件中断是由硬件设备触发的,用于通知 CPU 需要处理的事件。随着 Linux 内核的发展,越来越多的子系统需要更高效、灵活的底半部处理机制,而早期的 “bottom half” 无法满足这些需求。

weixin_43965970的博客 487

使用 Python 获取网络数据

本文介绍了 Python 获取网络数据、使用 requests 库、编写爬虫代码以及使用 IP 代理的方法。Python 的 requests 库非常方便,可以帮助我们快速访问网络资源。编写爬虫程序需要掌握正则表达式、HTTP 协议等知识,同时需要注意爬取速度和频率,以避免对被爬取网站造成负担。最后,使用 IP 代理可以帮助我们隐匿身份,保护我们的网络安全。

互联说 2695

Linux内核软RPS实现网络接收软中断的负载均衡分发

例行的Linux软中断分发机制与问题Linux的中断分为上下两半部,一般而言(事实确实也是如此),被中断的CPU执行中断处理函数,并在在本CPU上触发软中断(下半部),等硬中断处理返回后,软中断随即开中断在本CPU运行,或者wake up本CPU上的软中断内核线程来处理在硬中断中pending的软中断。       换句话说,Linux和同一个中断向量相关的中断上半部和软中断都是在同一个CPU上执

TCP/IP 1万+

从临床试验到互联网AB测试:边缘结构模型(MSM)如何解决‘时依性混杂’这个老大难问题

本文探讨边缘结构模型(MSM)如何解决时依性混杂问题,适用于临床试验和互联网AB测试。通过逆概率加权(IPTW)等方法,MSM能有效剥离混杂效应,准确评估长期干预效果。文章结合跨领域案例,详细解析MSM的核心原理、实施步骤及在推荐算法效果评估中的实战应用,帮助读者掌握这一先进因果推断工具。

weixin_28725949的博客 206

Microsoft Speech SDK 使用过程中女声改为男声遇到的问题

问题将女生改为系统自带男声(Kangkang)根据上面的步骤我的播放声音是改变了,但是还是女生,是yaoyao的女生。是因为下面注册表路径中VoicePath这个配置的路径指向了yaoyao的文件。 如何使用Microsoft Speech SDK,请参考https://blog.youkuaiyun.com/daoming1112/article/details/77542562 使用系统自带男声语音,不需...

u012161365的博客 7538

linux下软中断[si]负载均衡

最近在生产环境的服务器上发现如下问题: 多进程服务的用户负载[us]可以均匀分配在各个CPU上运行,但软中断负载[si]只集中在CPU0上,导致CPU0的[si]段的负载达到70%,而其他几个核的si段负载为0%,为何会出现此现象呢? 首先,我们查看一下,是哪一个软中断占用的比较高(watch -d -n 1 'cat /proc/softirqs'): 从图中可以看出:

vipzhxsh的专栏 5096

Matcap与菲涅尔

菲尼尔效果(简化版公式):fresnel = base + scale*((1-v*n)^power)透明队列为后前渲染,不关闭深度写入则会覆盖之前的像素,导致混合不了。y的值为0~1,根据x3返回对应y值。两色混合做个demo看看!混合为什么要关闭深度写入?

weixin_62773441的博客 371

preempt-RT patches

原文地址:http://jinsuo2007.blog.163.com/blog/static/1922799520114279642747/ 关于RT-Preempt Patch   本文档描述了安装并使用针对Linux内核的Realtime Preemption patch的过程,而且还讨论了如何开始编写硬实时的程序。本文档针对于目前最成熟的x86体系结构。

forestarmy的专栏 4394

大数据数据埋点技术面试题及参考答案(持续更新)

事件:指的是用户执行的具体动作,如页面浏览、按钮点击、商品购买等。事件是触发数据记录的直接原因,是分析用户行为的关键点。属性:是与事件相关的额外信息,可以提供关于事件的更多上下文。例如,用户点击的按钮颜色、大小、页面位置等。属性有助于更细致地分析用户行为,理解事件发生的具体情境。事件和属性共同构成了数据埋点的数据模型,它们使得收集的数据具有可分析性,从而可以用于深入理解用户行为和优化产品。

大模型大数据攻城狮的专栏 2097

基于R-CNN深度学习的常见手势识别系统:数据集、模型和UI界面的完整实现

卷积神经网络(CNN):用于从图像中提取特征。区域提议网络(RPN):用于生成可能包含手势的候选区域。:将候选区域调整为固定大小,并进行进一步的分类和回归。接下来,我们需要加载一个预训练的Faster R-CNN模型,并对其进行微调。我们将使用# 加载预训练的Faster R-CNN模型# 获取分类器的输入特征数# 替换分类器头部,设置为我们数据集的类别数(假设有5类手势)

YOLO 999

MYSQL数据库网卡软中断不平衡问题及解决方案

原创文章,转载请注明: 转载自系统技术非业余研究 本文链接地址: MYSQL数据库网卡软中断不平衡问题及解决方案 最近公司在MySQL的数据库上由于采用了高速的如PCIe卡以及大内存,去年在压力测试的时候突然发现数据库的流量可以把一个千M网卡压满了。随着数据库的优化,现在流量可以达到150M,所以我们采用了双网卡,在交换机上绑定,做LB的方式,提高系统的吞吐量。 但是在最近压

shen1936的专栏 2435

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C语言为何仍是操作系统内核开发的首选?内存管理与硬件交互的绝对优势

在计算机系统编程领域,内存管理和硬件交互是两大核心基础概念。内存管理涉及程序如何分配、使用和释放内存资源,直接关系到程序的性能和稳定性;硬件交互则决定了软件能否直接、高效地控制底层硬件设备。这些底层技术原理构成了操作系统、驱动程序和嵌入式系统等关键基础设施的基石,其技术价值在于实现对计算资源的极致控制和高效利用。在操作系统内核、嵌入式固件、高性能中间件等对性能、资源消耗和确定性要求极高的应用场景中,开发者需要一种能够提供直接内存访问、最小运行时开销和高效硬件抽象的语言。C语言凭借其指针操作、内存布局控制和贴

android_mylove的专栏 442

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

对Linux 网卡软中断做负载均衡

        测试中发现服务器整体负载较低,但有cpu负载特别高,其中一个cpu几乎一半是软中断si,特别忙,而还有的cpu特别空闲。 top - 16:12:08 up 31 days, 3:52, 1 user, load average: 0.11, 0.11, 0.06 Tasks: 242 total, 4 running, 238 sleeping, 0 sto...

fishermen 598

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

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

网卡软中断绑定优化

今天刚发测试发现一个关于

Love_shift 4833

Quartz-中断正在执行的任务

概述 示例 示例源码概述由于业务需要,停止Quartz中正在执行的任务 任务类只需要实现InterruptableJob类,然后实现interrupt()方法。 在这个方法中进行标记的改变,在执行中进行这个标记判断,就可实现中断任务了 另外在调度器上调用方法:sched.interrupt(job.getKey()) 示例示例源码代码已托管到Github—> https://github.com/y

小工匠 4万+

LWN网站patch使用方法,给Linux内核打patch,编译内核,安装内核,启动时手动选择内核一条龙

LWN网站patch使用方法 如果是从LWN网站下载内核: 邮件格式的patch,直接把所有diff的部分复制下来保存在一个文档里,文档不需要有后缀,就是所谓的patch包了。 给Linux内核打patch 首先下载对应的Linux内核源码。5.x版本的内核源码下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ 首页地址: https://www.kernel.org/ 当然这个网站上也有官方版本的patch包可以下载。 解压缩后进入源码

weixin_43101609的博客 1470

LWN:滚动发布的稳定版内核!

关注了就能看到更多这么棒的文章哦~Rolling stable kernelsBy Jake EdgeOctober 6, 2021OSSNADeepL assisted translat...

Linux News搬运工 535

LWN:内核开发者的更好的工具!

关注了就能看到更多这么棒的文章哦~Better tools for kernel developersByJonathan CorbetFebruary 6, 2020原文来自:htt...

Linux News搬运工 2448

LWN:6.0开发周期数据!

关注了就能看到更多这么棒的文章哦~Some 6.0 development statisticsBy Jonathan CorbetOctober 3, 2022DeepL assisted translationhttps://lwn.net/Articles/909625/Linus Torvalds 在 10 月 2 日发布了内核 6.0 版本。在这个版本中,有 15402 个 non-me...

Linux News搬运工 525

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 331

Linux 磁盘满了怎么排查?df / du / find 三步定位大文件

Linux 磁盘满排查三步法:df -h 定位分区、du 逐层下钻、find 按大小和时间抓大文件,附 inode 耗尽、文件已删未释放、du 与 df 不一致等经典坑的解决方案。

weixin_38291577的博客 218

Linux-iostat命令详解

Linux命令学习记录

m0xin的博客 97

Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位

iptables 四表五链模型、firewalld zone 信任级别、云安全组与主机防火墙的关系与优先级,避坑改了防火墙把自己挡在服务器外面的翻车事故。

2502_91473995的博客 287

【Linux】APT 本地 deb 安装与 `-f` 参数总结笔记

apt install ./xx.deb 可自动解析并安装依赖,无需 -f;-f 仅用于修复已损坏的依赖状态,非首次安装时必需。apt install -f 可单独运行,修复 broken dependencies。两者职责不同:前者是安装与依赖解决,后者是故障修复。完全离线时需提前准备依赖包或本地源。

hknaruto的专栏 209

Linux rm 误删文件恢复实操教程

Linux使用rm删除文件时,并不会直接抹除磁盘上的数据,只是移除文件索引,让系统不再识别这块空间。只要没有写入新数据,原有扇区内容就会保留。新文件写入才有可能覆盖这些区域,一旦覆盖就很难找回。恢复的本质就是扫描磁盘,找到这些还存在、但索引丢失的数据条目,再把它们导出保存到其他分区。越早停止写入,恢复成功的概率越高。

海天数据恢复-winhex数据恢复教程 225
上一篇: LWN:magic 消失了!
下一篇: LWN:针对完整性保护以及数据共享设计的Composefs!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值