LWN:软中断处理的启发式规则!

Linux Swap 子系统:架构、内存管理与虚拟化 Swap Linux Swap机制通过将不活跃内存页移至磁盘或压缩内存,扩展系统有效内存容量,缓解内存压力。传统架构中,逻辑Swap槽与物理存储绑定,导致资源浪费,尤其在使用Zswap等压缩技术时。为此,Vswap与Xswap提出虚拟化方案:前者以XArray实现灵活映射,支持多后端迁移;后者采用稀疏映射,简化管理但容量固定。二者在架构设计、资源记账与动态扩展上各有权衡,反映了内核开发中对性能、可维护性与灵活性的深层考量。 阅读详情

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

Heuristics for software-interrupt processing

By Jonathan Corbet
March 13, 2023
DeepL assisted translation
https://lwn.net/Articles/925540/

内核的软中断机制("softirq", software-interrupt)机制是在 1.0 内核发布之前就加入了的,它其实实现了一个在 Linux 诞生时就已经出现很久的系统中的设计方案。在那段时间里,软中断机制一直是内核社区实现可扩展性和响应时间目标的一个障碍,但事实证明很难把这个障碍清除掉。最近提出的一个新的启发式方法(仅仅是调整它的操作参数)来减轻与软中断有关的性能问题的讨论,可能重新激发了对这个子系统整体的兴趣。

当系统中的某些组件需要 CPU 关注时就会产生硬件中断,例如,完成了一个 I/O 操作的时候。处理硬件中断是内核中优先级最高的任务之一。中断处理几乎会抢占其他所有正在运行的工作,所以中断处理程序的工作量尽量少,以避免对系统的其他部分产生不利影响。softirq 机制,就是设计出来把硬件中断处理程序的一部分不那么紧急的工作搁置起来,从而尽快完成当前硬件处理。

使用软中断的子系统包括了网络、定时器、块设备子系统、读-复制-更新(RCU)和 tasklet 任务等。当这些子系统中的有某个需要把工作委托给软中断处理程序时,它会设置一个特别的 bitmask 来 "发起(raise)"一个软中断。当内核运行到打算处理软中断的位置时(通常是在硬件中断处理结束时或从系统调用返回时),就会对发起的软中断进行处理,并为每个软中断来调用合适的处理程序。

在实践中,从硬件中断处理程序中引发的 softirq 通常会在该硬件处理程序结束后立即运行,但情况并不总是如此。Softirqs 也可以从任何一个内核上下文中发起,而不仅仅是在响应硬件中断的时候;比如,RCU softirq 就跟任何硬件中断都没有关系。

这里的问题是,软中断处理程序可能有很多工作要做。它们被调用的原因包括:从网络上收到的数据包和 RCU 的回调处理,在这个处理程序运行时,可能有成千上万的数据包在等待处理。因此,softirq 处理可能会持续很长时间,从而影响到系统要做的其他工作。如果在 Softirq 处理过程中出现了太多的工作,这个问题就会变得很严重,这种情况很容易发生。

Managing softirq handling

为了避免 softirq 处理让系统不堪重负的这个问题,随着时间的推移,已经在内核中添加了一些启发式机制,包括:

  • 通常处理软件中断的函数(__do_softirq())将传递所有提出的 softirqs 并处理它们。在完成之后,它将检查是否有更多的软中断在等待处理;如果是这样的话就回到起点,但最多也只能处理 10 次。如果超过了这个数字,内核就会停止处理 softirq,而唤醒每个 CPU 的内核线程 softirqd 来继续工作。

  • 同样地,如果 softirq 的处理持续超过(大约)2ms,那么剩余的工作也将被推给 softirqd 去做。

  • 当 ksoftirqd 线程在一个给定的 CPU 上运行时,内核甚至不会尝试处理那里的软中断;而是直接把它们留给线程处理。

  • 当内核处理软中断时,时不时地会检查当前进程(被抢占来处理 softirqs 的进程)的 TIF_NEED_RESCHED 标志,如果有置位的话,表明有一个更高优先级的进程已经准备运行。在这种情况下就会停止处理 softirqs,来尽快回到该进程执行。

一些使用软中断的子系统也在它们自己的处理程序中实现了一些限制,跟 softirq 代码集中处理的地方的逻辑没有关联(甚至都不一定知道这件事)。

在 12 月底,Jakub Kicinski 发布了一组 patch set(标题为 "毫无争议的修改"),解决了上面列出的最后一个启发式方法中遇到的问题。我们之所以希望让内核在重新进行调度决策时来推迟 softirq 的处理,主要是为了让 event 处理能尽量低延迟。例如,如果有一些音频数据进来,那么需要能启动录音机程序并尽快记录数据。但是,如果在 reschedule 后运行的进程不是一个非常快捷的动作(也就是它持续占用 CPU 很长时间),那么它就会在这很长时间内一直阻止所有 softirq 的处理。这可能会导致一些问题,如网络会卡顿、TCP 重传等。

为了解决这个问题,Kicinski 提议增加另一种启发式方法。一旦 reschedule 导致的延迟发生,那么内核将只等待 2ms,然后会再开始处理 softirqs,而不管 softirqd 是否在运行;这就可以避免一个长期运行的进程阻塞了 softirq 的处理太久。类似的 timeout 也适用于由 softirq 的过度工作而引起的延迟,也就是上面列表中的前两项。在这种情况下,内核将在 100ms 后重新开始处理 softirq。他说,这些改动会导致网络停顿的次数减少到 1/10,TCP 重传减少 50%。

Addressing the real problem

Thomas Gleixner 似乎愿意接受这个新的 timeout 方案,尽管他补充说他 "不是非常喜欢这种搅在一起的很多启发式规则"。他指出了 timekeeping 的一些问题;它使用的是 jiffies 时间变量,分辨率为 1-10ms,用于很小的毫秒数上的。这可能会导致很大的结果差异。他后来意识到,这个问题在目前的内核中也存在。但没过多久,他就对整个方案提出了反对,他说,这只会让整个 softirq 问题变得更糟。

他说,Softirqs "只是一个至少有 50 年历史的操作系统设计方式的扩充"。它们的存在,是为了允许某些代码能规避资源管理(例如 CPU 调度),因此,使人们无法完全控制系统的运行。他抱怨说,当问题出现时(不可避免会有问题),通常的做法都是增加更多的启发式规则和开关。"他问道:"我们能不能不要到处调整参数,而是正确解决这全部问题?他还承认,他心中并没有一个完整的解决方案,但承诺在不久的将来会认真考虑这个问题。

Kicinski 说,网络开发人员正在努力将处理工作从软中断中移出来,但这是一个漫长而缓慢的过程。Frederic Weisbecker 则指出了软中断的真正问题:一次只能运行一个,而有一些内核代码依赖于这个特点所提供的独占能力。这么多年过去了,没有人真正知道哪些软中断处理代码可以安全地跟其他处理程序同时运行,哪些不能。因此,禁用软中断处理的作用就类似于之前那个名声很不好的大内核锁,而且,跟它一样很难被安全地移除。

他建议的解决办法是进行类似于为大内核锁所做的推倒重建工作。所有的软中断处理都可以被放到内核线程中去以正常的方式进行调度,但它们在运行时都会持有一个类似于 softirq-disable big lock 的锁。随着特定子系统的处理程序被证明是安全的,那么就可以不再使用这个锁,直到有一天,全部都移除。他说,这项任务不适合胆小的人:

当然,这个工作量相当巨大,但它的优点是可以迭代开发,从长远来看会有回报的。此外,我相信最常使用的地方会被很快处理掉。而其中大部分可能都是在网络代码的核心部分。

所需要的是有人来真正承担这些工作。

Matthew Garrett 曾经说过,"'heuristic, 启发式'是一个古老的非洲词,意思是'也许 bonghits 会让这个问题更难解决'"。当然,软中断一直是那种难以解决的问题,可以促使开发人员采取这种补救措施。也许,有一天,这个古老的子系统也会被清理掉,那些急切需要进行的处理将以一种可控的方式来完成,而启发式方法将不再被需要了。但现在它们仍然是必要的,而 Kicinski 的 patch 可能是一个创可贴,使的人们在解决真正的问题的时候能先让它正常工作起来。毕竟,即使开发社区这次真的决定会处理 softirqs 问题,那么这项工作也可能需要一段时间才能有结果。

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

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

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

format,png

安装Anaconda和Labelme的教程 1 登录Anaconda官网,选择Download https://www.anaconda.com/distribution/ 2 选择你想下载的Python版本,选择你的操作系统和位数,然后点击Download按钮就开始下载了 3 开始安装 下面两个框框都勾选 点击next,等待安装成功 打开Anaconda Navigator 点击红色圈圈的按钮 在cmd中输入 (1)创建虚拟环境 conda create -n labelme python=3.6 (2)激活虚拟环境 conda activa 阅读详情

相关推荐

周立功CAN盒二次开发实录:用QT5.1.0解析汽车CAN报文(附数据可视化技巧)

本文详细介绍了基于QT5.1.0和周立功USBCAN-E-U设备进行汽车CAN总线二次开发的实战过程。核心内容包括利用CANdb++数据库解析原始报文并转换为物理值,以及通过QCustomPlot库实现高性能实时数据可视化,为车载诊断与车联网开发提供了一套完整的工程实践方案。

sugar的博客 1057

理解 Linux 动态库加载:LD_LIBRARY_PATH

flyfish

二分掌柜的 331

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记

Spatio-Temporal Graph Convolutional Networks: A Deep Learning Framework for Traffic Forecasting 论文笔记-----GCN在交通领域的应用(二) 一、论文翻译: 1、摘要: 及时准确地交通预测对于城市交通控制和指导具有至关重要的意义。由于交通流量的非线性和复杂性,传统的方法不能满足中长期预测任务的需求,并且往往会忽略时空数据的时间和空间依赖特性。在这篇论文中,为了处理在交通领域的时间序列预测问题...

cy_believ的博客 1916

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

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

weixin_38291577的博客 218

ansys命令流力磁耦合仿真

文章目录前言一、力磁耦合仿真流程二、静力学仿真三、力磁耦合模型构建四、静磁学仿真总结 前言 一、力磁耦合仿真流程 力磁耦合有限元仿真流程中,首先进行静力学仿真,经过前处理模块、分析计算模块和后处理模块提取三维模型单元应力,然后根据力磁耦合方程中,通过matlab将单元应力导入到磁导率与应力的关系式中,得到单元的相对磁导率。最后采用载荷传递耦合方式,进行静磁学模拟仿真,分析计算得到该载荷下试件的磁场分布。,如下图所示为力磁耦合仿真流程图: 二、静力学仿真 下图为中心预制条形缺陷的Q235钢板试..

wsfwsf128的博客 2661

Docker容器化部署Ceph集群:从零搭建高可用分布式存储

本文详细介绍了如何使用Docker容器化部署Ceph集群,从零搭建高可用分布式存储系统。通过环境一致性、快速扩容和资源隔离等优势,Docker显著提升了Ceph集群的部署效率和运维便捷性。文章涵盖硬件规划、镜像选择、单节点部署、多节点扩展及性能调优等实战内容,帮助开发者快速掌握分布式存储系统的容器化部署技巧。

weixin_29081101的博客 422

Linux-iostat命令详解

Linux命令学习记录

m0xin的博客 97

LabVIew串口收发的一些问题

LabView串口收发实验总结

weixin_45508826的博客 2065

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

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

2502_91473995的博客 287

【2025华为OD机考真题】- 简易内存池(B卷-200分)(C版)

🔔本文收录于「最新最全华为OD机试真题(C版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新皆可阅

**My Coding Family** 961

IGBT基础知识及应用电路仿真(Multisim)

本文系统介绍了IGBT(绝缘栅双极晶体管)及其应用电路。首先详细解析了IGBT的基本结构、工作原理和特性参数,重点阐述了其五层半导体结构、电导调制效应和电压驱动特性。随后通过Multisim仿真展示了IGBT在四种典型功率变换电路中的应用:半桥驱动电路实现隔离式互补驱动;全桥逆变电路完成DC-AC转换;三相桥式逆变电路生成三相交流电;直流斩波电路(BUCK/BOOST/BUCK-BOOST)实现电压升降变换。文章通过理论分析与仿真波形相结合,全面呈现了IGBT在中高压大功率场景下的优异性能和灵活应用。

XU157303764的博客 1217

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

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

hknaruto的专栏 209

161、车载环视系统的ISP多路同步架构——海思Hi3516DV300的4路鱼眼校正与拼接的帧同步误差控制

文章摘要: 针对海思Hi3516DV300车载环视系统四路鱼眼摄像头拼接画面动态撕裂问题,分析发现根本原因为帧同步误差(部分通道帧起始时间差1.2ms)。关键解决措施包括:1)通过VI通道主从同步模式(MASTER/SLAVE)结合软件补偿控制帧延迟;2)优化VPSS通道帧率锁定与丢帧策略确保拼接时序一致;3)严格校准鱼眼校正LUT参数与产线标定数据匹配;4)建议采用硬件同步信号(如sensor的FSIN引脚)降低软件同步压力。调试阶段需通过示波器直接测量sensor VSYNC信号,量产时需注意动态切换分

zzfmlxs的博客 136

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

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

海天数据恢复-winhex数据恢复教程 225

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Linux sudo

如果输出 → 无 sudo 权限 如果输出 → 拥有全部 sudo 权限 辅助验证命令 ⚠️ 注意:在 wheel 组 ≠ 一定能 sudo,必须 开启 Ubuntu/Debian: ✅ 重要:修改组之后,用户要重新登录才生效! 或者执行 临时生效 看到这行(没有 #注释)才生效: 方式 2:visudo 直接单独给用户授权(精细化权限) 找到 ,下面添加一行: 自带语法校验,写错会告警,不要直接 vim 改 ,写错直接 sudo 炸掉! 想免密 su

fengliyang_的博客 178

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

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

Linux 磁盘 100% 但 du 查不出东西,五种情况逐个排

监控告警说根分区 100%,登录上去 du -sh /* 加起来只有 12GB,df 显示 40GB 已用。差了快 30GB,du 找不到任何东西。这种情况基本都是"文件被删了但进程还开着",但也可能是别的原因。这篇按可能性排一下顺序。

2408_89646393的博客 163

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Windows/Linux下强实时运动控制内核(二):基于Qt的Delta机械手的开发应用

强实时运动控制内核MotionRT750下Qt开发Delta机械手的完整开发流程。

weixin_57350300的博客 240

Linux 网络基础详解:IP、子网、路由与 ip、ss 命令实战

建库建表、增删改查、连接查询(内连左连右连)、聚合函数、权限控制 GRANT/REVOKE,每条命令配可运行示例,零基础也能跟着敲会 SQL 基础。

2502_91473995的博客 610

Linux、Shell、MySQL 测试卷逐题细讲(下篇:MySQL)

本文为Linux、Shell、MySQL测试卷下半段MySQL部分逐题讲解,包含填空、选择与SQL分析三类题型。填空题覆盖COUNT、HAVING、DISTINCT、事务、约束、索引等核心语法;选择题辨析存储过程、索引类型、ACID、存储引擎、用户管理等考点。SQL大题围绕员工、部门、职位、地点四张关联表,考察多表连接、分组聚合、自连接、相关子查询、NULL处理等高频写法,标注LEFT JOIN统计计数、NULL判断、子查询别名等易错坑点,同时梳理试卷OCR识别带来的干扰问题,重点提示SQL实操中的常见失误

dongziwen1的博客 181

Linux 下 OpenCode 接入自定义大模型 API 教程:以 DeepSeek-V4.1-Flash-1017 为例

本文介绍在Linux下通过Python脚本配置OpenCode接入自定义大模型API(以DeepSeek-V4.1-Flash-1017为例),实现永久化、非侵入式配置。通过修改~/.config/opencode/opencode.json文件,添加OpenAI兼容服务商BLSC,注册模型并设置APIKey。支持命令行测试、默认模型设定及安全权限控制,操作简单且不影响原有配置。适用于各类支持OpenAI接口的自定义模型服务,提升开发灵活性与安全性。

qq_15060477的博客 121

【Linux 命令实战(02):文件与目录操作,掌握 pwd、ls、cd 三个核心命令】

命令作用cd /进入根目录cd ~进入当前用户家目录cd返回当前用户家目录cd …返回上一级目录cd …/…返回上两级目录cd -返回上一次所在目录进入指定目录命令核心用途常用参数pwd查看当前目录-L、-Pls查看文件和目录cd切换目录…、~、-Linux 文件系统的基本结构。绝对路径与相对路径的区别。Tab 自动补全。Shell 通配符。使用&&组合命令。这篇文章主要解决的是如何在 Linux 文件系统中快速定位目录。

一些微不足道的见解、希望能帮助各位 192

Linux Day29——HTTP与网络排障

*实测**:`traceroute -n -m 8 8.8.8.8` 的输出:第 1 跳 `172.17.144.1`(本机网关)、第 2 跳 `10.32.0.1`、第 3 跳 `10.50.255.253`、第 4 跳 `* * *`、第 5 跳 `221.226.71.193`、第 6 跳 `* * *`、第 7、8 跳有地址但夹着星号。`ping` 和 `traceroute` 都靠它。**实测**:`ss -lta` 看到三行 `domain`,加 `-n` 后变成 `53`。

2503_94114317的博客 151

【Linux】进程间通信的基础概念及基于匿名管道的进程池

前面我们介绍了进程的创建、退出和等待,接下来看看进程之间怎样传递数据。这篇从匿名管道入手,再用管道把父子进程联系起来,写一个简单的进程池小demo。而且我把发行版从CentOS切换成Ubuntu了,主要是CentOS已经不维护了,可惜了。。。

qeen87的博客 316

Linux的渲染与显示系统链路

Linux渲染与显示链路核心为DRM/KMS + EGL直连模式,绕过传统X11/Wayland中间层,实现低延迟、高效率的直接帧提交。相比X11的粗粒度权限控制与Wayland的合成开销,该方案链路短、资源消耗低,但仅支持单进程独占显示,缺乏窗口管理与系统级兜底。EGL作为跨平台桥梁,连接OpenGL ES与原生显示系统,通过Display、Surface、Context三要素构建渲染环境。内核层DRM管理GPU资源,KMS配置显示模式,用户态GDM负责登录会话,共同构成从硬件到应用的完整图形栈。

微小的鱼的博客 205

Linux 启动流程与故障修复:GRUB、systemd 与救援模式实战

密钥登录配置替代密码、sshd_config 禁 root 禁密码改端口、fail2ban 自动封爆破 IP、端口改不改的权衡,服务器被扫描爆破时的完整加固方案。

2502_91473995的博客 459

芯参谋(88):Linux 嵌入式系统开发指南

本文为面向MPU/Linux平台的用户态系统层开发指南,聚焦启动链各环节的可测量、可判据化工程实践。涵盖交叉工具链一致性、Bootloader交接、根文件系统构建与瘦身、init/systemd服务编排、进程与IO模型、网络接入、调试可观测性、实时性优化、安全加固、电源管理及OTA升级等核心内容。强调“启动时间、镜像大小、内存峰值、断电恢复”等量化指标,提出四条读者路径:从零搭建、启动优化、线上问题排查、实时性实现。以Linux 6.1/LTS内核、glibc2.36/musl1.2、systemd252等

qq520131714的专栏 465
上一篇: LWN:内核中基于Rust 的time API!
下一篇: LWN:Linux 新的 EEVDF 调度器!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值