浅谈Linux内核的实时性优化

原创 Linux阅码场 2025-05-10 11:00


作者简介

邓世强,一线码农,从事通信行业,目前在一家通信公司担任内核工程师,日常喜欢钻研学习Linux内核知识。



阅码场目前已创建两个专业技术交流群,由阅码场资深讲师主持,主要是为了更好的技术交流与分享,两个群分别为:

彭伟林-阅码场内核性能与稳定性
甄建勇-Perf Monitor&Perf Counter

有意加入请私信客服小月(小月微信号:linuxer2016)



1.实时系统的概念 

1.1什么是实时操作系统

 

什么是实时操作系统?接触过嵌入式的小伙伴可能会知道,实时操作系统是指在嵌入式领域广泛应用的各类RTOS(Real Time Operating System)。其中最具代表性的有国外的μC/OS-IIIFreeRTOSVxworks等,国内的代表有RT-ThreadLiteOS
 


1:常见的实时操作系统


在这些众多的RTOS系统里面既有开源的也有商业的,同时还有一些是行业专用的,比如enea公司推出的OSE系统就是通信行业早期的基站设备应用比较广泛的系统。无论是开源或是商业,这类系统都有一个最显著的特点,就是它们都具有很高的实时性。也是因为这个特点,它们都被集中应用在了嵌入式领域,特别是工控领域,例如工业制造控制、导弹飞机导航、电力设备监控等。历史上有很多著名的航空航天设备都使用到了实时的操作系统。比如登陆火星的凤凰号、好奇号火星探测器,它们所采用的操作系统就是美国WindRiver公司推出的Vxworks那什么是系统的实时性呢?Linux系统在嵌入式领域也有大量使用,那Linux系统支不支持实时性呢?

1.2 Linux实时性、软实时和硬实时
 
实时性指的是一个操作系统能够在规定的时间点内完成指定的任务操作,一旦超过这个时间点会对整个系统带来不可估量的后果。与此相对的是一般操作系统,它更注重用户体验,系统偶尔卡顿不会给用户带来灾难性后果。实时性反映了一个系统行为控制的精准能力,具体体现在定时器的精准度高,中断响应及时以及系统的行为固定且可预估等。Linux系统最初是按照分时系统设计并推出的,再加上在历史版本中使用的调度算法目的是公平的分配和使用各种系统资源,保证CPU被各进程公平的使用,所以早期并不支持实时性。但是在后来的2.6版本开始,加入了内核抢占的功能,使它的实时性得到了提升,在某种程度上具备了软实时的能力。软实时指的是系统对于时限要求并不是十分的严格,在一些情况下允许系统超限完成。举个例子,我们在PC机上使用鼠标操作,偶尔会出现卡顿延迟,这种情况除了让我们抓狂影响使用体验之外并不会给我们带来严重的影响,大家平时在使用电脑时遇到鼠标图标转圈圈同时界面不响应操作就是一个例子。再比如视频信号采集,偶尔丢失几个数据帧,并不会对视频最后的播放带来严重的画面缺失。但是硬实时就不一样,它对操作系统的行为有着严格的时限要求,超出时限往往会带来灾难性后果。比如在我们日常生活中使用的汽车都配备了安全气囊,汽车在发生激烈碰撞时可能会在0.2s内停下,那就要求气囊在0.02s内充气完毕并弹出,超出这个时间乘客可能就会面临生命危险。再比如导弹防御系统,当敌方导弹来袭时拦截系统必须做出100%的精准反应并计算出弹道轨迹进行拦截,稍有延迟就会造成拦截失败,这种后果是不可接受的。这就是硬实时系统和软实时系统的区别。但是由于Linux系统内核过于庞大且模块众多,内核中仍然有不少影响实时性的因素,比如使用大量自旋锁、中断禁止、时钟粒度等,使其距离us级别的控制精度还有很大的距离。但是也不能因此认定Linux系统今后就不能用于实时控制领域。
 
其实Linux内核一路发展来,在历史的版本主线中仍然有很多技术公司或者大牛为了提升Linux系统的实时性而努力着,他们或是在某个版本上发布实时补丁,或是对内核进行一定程度上的改造,具体的代表有RTLinuxRTAI(Real-Time Application Interface)Xenomai等。RTLinux全称叫做AReal-Time Linux,它由美国新墨西哥矿业及科技学院V. Yodaiken开发。RTLinux采用了双内核的做法,可以说是开创了双内核法的先河。简单理解就是系统中存在两个内核,实时核和非实时核。底层硬件资源和实时的内核打交道绕开非实时核,来自硬件的中断源由实时核全面接管,把非实时的Linux内核当成实时核上的一个低优先级的进程来运行,通过这种方式确保实时核上的中断和任务得到优先响应,提升了实时性。Xenomai也借鉴了RTLinux的双内核做法,内部也有实时核和非实时核。但不同的是Xenomai在底层硬件和两个内核之间还加了一层硬件抽象层ADEOS(Adoptive Domain Environment for Operating System),实时核和非实时核作为硬件抽象层的两个域而存在,Xenomai内核属于实时域,Linux内核属于非实时域。ADEOS在系统的关键路径中对中断进行拦截,优先响应Xenomai实时域的中断,当没有实时任务和中断需要处理的时候才会轮到Linux内核执行。两者对比如下。
 

2RTLinuxXenomai框架对比

由于版权、技术专利等因素,RTLinux已经不再更新。而Xenomai因为注重拓展性,可移植性和可维护性,对开发者相对友好,目前还在不断推出补丁,并且在社区活跃度很高,在工控领域也有不少成功应用的案例。这些基于Linux系统去改造从而提升实时性的系统的出现,使得Linux系统在发展过程中在实时性的研究上热度不减。甚至有不少人从Linux系统实时性研究入手,深入去学习Linux内核的调度机制、中断机制、定时器机制等,逐渐发展成自己的兴趣和爱好。从我们作为普通技术族的实力来说,可能不具备像国外的公司或者一些技术组织大改并发布实时Linux的能力。而想要提升系统实时性,有的是出于自身工作的需要,有的则是带着个人的兴趣爱好去钻研,那么如果想提升Linux内核的实时性,我们该怎么做呢?

2.Linux实时性优化

2.1 实时性优化和时钟精度
 
知其然并知其所以然,知道影响实时性的因素才能很好的优化改造它。目前影响Linux内核实时性因素主要有时钟精度、系统中断、进程调度算法和内核可抢占性等。每一块都可以深入研究并做出相应的优化。首先是时钟精度,时钟就像是一个系统的脉搏,系统进程的调度切换是按照时钟节拍来进行的。目前Linux内核支持几种不同的系统节拍,可以在用户编译内核时配置。假设当前的系统节拍是100Hz,那么系统的时钟粒度就是10ms,如果提升到1000Hz,那么时钟粒度就是1ms,精度提升了10倍。
 

3:编译内核系统节拍设置

上面这张图是CentOS7.6发行版系统默认的系统节拍设置。时钟精度的提升最直接的影响就是系统中的调度动作加快了,进程的响应也更为及时,但随着而来的是时钟中断频率的加快,这也加大了系统的开销和压力,因为会频繁的响应系统的时钟中断。在某些CPU消耗型的进程上会由于系统频繁的进行进程切换而导致CPU资源浪费,CPU的时间会浪费在进程切换上,因为从进程切换到实际被调度执行之间有一个时间差,叫做进程切换开销,所以好和坏我们还是需要根据自己的系统表现来看待。
 
2.2 中断
 
其次是中断。无论是RTOS还是Linux,硬件中断在系统当中的响应优先级永远是最高的。RTOS由于支持中断优先级,在实际使用过程中可以根据产品的实际情况针对不同的外设场景设置不同的优先级,且高优先级的中断可以抢占低优先级的中断,使得RTOS的中断响应非常迅速。Linux系统中的中断模块远比RTOS系统复杂得多。通常,Linux系统在进入一个中断时候,会禁止本地CPU的中断。在处理具体某一个中断的时候,由于禁止了本地CPU中断(NMI类型的中断除外),当有新的中断到来的时候只好挂起,只有当前的中断处理完才打开本地中断并响应新的中断。如果系统中存在大量不同类型的中断,势必会有一些中断被延迟得不到及时响应,这种延迟现象在单核CPU上表现尤为明显。针对这种情况,就要求我们在编写实际中断处理函数的时候,尽量在中断处理函数中不做复杂的操作,坚守中断处理函数快进快出的原则。比如只读取硬件寄存器等简单操作即可,剩下的数据处理的操作放到中断下半部中去执行,这就是所谓的中断线程化传统上的中断下半部有软中断、tasklet、工作队列,它们的优先级也从高到低。软中断和tasklet工作在中断上下文不允许休眠它的优先级比工作队列高,工作队列工作在进程上下文允许休眠但是优先级最低,所以在实际编程开发中需要我们根据场景选择性的使用。如果是多核CPU,那么可以根据实际的中断情况把不同类型的中断迁移绑定到不同的CPU上,避免不同中断之间的干扰。下面以I.MX6DL硬件平台为例子介绍中断迁移的使用。首先,通过#cat /proc/interrupts指令查看系统的所有中断,如下图所示:


4:绑定中断前的系统中断分布

从上面图中可以看出,当前的硬件平台一共有4CPU,其中IMX-uartimx-i2c的中断集中发生在CPU0CPU3,从第一列可以知道它们的中断号分别是5869。接下来我们可以将IMX-uart中断全部迁移到CPU1上,让CPU0只响应imx-i2c中断。通过# echo "2" > /proc/irq/58/smp_affinity指令即可完成迁移。注意,这里的数字“2”表示CPU编号,它是从1开始。迁移后IMX-uart中断情况如下:
 

5:绑定中断后的系统中断分布

从前后两张图对比可以看出,中断迁移前,IMX-uartCPU3上的中断次数为1824次,在CPU0上中断次数为727次。中断迁移后,CPU0CPU3不再响应IMX-uart中断,CPU1IMX-uart中断次数由15次增加到了115次。我曾经在一个双核硬件平台上遇到过串口和SPI同时需要响应大量中断,它们互相影响导致中断响应不及时而出现数据丢失和输出不及时的情况,最终就是通过中断绑核解决的。中断绑核其实不能完全消除对实时性的影响,只能最大程度去降低中断对进程的影响,因为系统中NMI中断和本地时钟中断无法迁移和禁止。除了中断可以绑核,应用层的进程和线程也可以改变它们与CPU的亲和性,比如迁移到中断较少的核上,也能在一定程度上提升进程的实时性。
 
2.3进程调度算法
 
除了前面提到的时钟和中断外,还有一个影响实时性最大的因素就是操作系统的调度算法。Linux系统目前默认采用的是完全公平调度算法(CFS),它按照各个进程的权重来分配运行时间,在默认使用CFS的情况下,我们可以给有实时性需求的进程分配更高的优先级和权重,可以看做是通过赋予更高的优先级来获得更好的实时性。 Linux内核目前支持多种调度类,每一种调度类都是同一类型调度策略的集合,目前支持的调度类有:stopdeadlinerealtimeCFSidle。通常情况下进程都可选以上的几种调度类,他们的优先级依次由高到底排序,其中deadline调度类可选的调度策略有SCHED_DEADLINErealtime调度类可选的调度策略有SCHED_FIFOSCHED_RRCFS可选的调度类有SCHED_NORMAISCHED_BATCHSCHED_IDLE。在实际开发过程中,如果对时间有严格要求的实时进程可以选择deadline调度类,其他情况可以参考使用对应的调度策略,改变调度策略,是最直接的一种优化方式。其中deadline调度类的使用参考如下:

 


6deadline调度策略编程参考
 
2.4 内核其他限制
 
除了内核本身的调度算法的原因,Linux内核的调度模块当中还有其他限制因素。比如为了防止某个进程或某一个进程组长时间的占用CPU时间,Linux内核引入了一个运行带宽的概念也就是说某一个进程或进程组使用CPU的总时间不能超过这个带宽阈值,默认值是0.95s
 

7运行带宽默认值

实际开发过程中为了提高我们进程的实时性,需要进程长时间地占用CPU资源,我们可以把这个运行带宽给禁止掉。实际上不同的产品和使用场景也会有着不同的优化措施,如果设备的CPU核数比较多,我们可以从整体上去规划系统对于CPU的使用,大量的使用中断绑核和进程、线程绑核达到对CPU的独占使用。比如DPDK,它是Intel公司开发的一种高性能网络加速组件。在Linux内核中,传统的网络数据包的收发都是经过网卡驱动和内核协议栈,网卡驱动针对大数据包场景也做了大量的应对措施,但是从本质上来说,网络包的收发在内核中也还是依赖系统给我们实现好的软中断机制。DPDK则是使用轮代替了中断,它绕过了Linux内核的网络模块(驱动和协议栈),不需要频繁的进行数据的拷贝,使得用户空间可以直接看到硬件网卡的数据,这大大减小了数据传递路程上的开销。下面这张图就是使用轮询和DPDK独占CPU的一个例子。
 

8DPDK轮询独占CPU

再比如,irqbalance,它用于中断收集分配,会根据系统的负载情况自动进入性能模式和节能模式,会将中断平均分配到不同的CPU上去处理,特殊情况下我们需要禁止这个功能。还有其他比如禁止软锁、虚拟内存管理优化等。从上面可以看出,实时性优化的方法多种多样,甚至使用使用轮询代替了中断。但是关键还是在于我们要了解Linux内核模块的一些运行机制,和这些机制在实现上本身就存在的缺点,只有这样我们才能针对具体问题作出对应的优化措施。以上提到的这些方法只是从大的方向而且很浅显去分析和介绍Linux内核的实时性影响因素和对应的优化措施。总结起来有以下几点:
  • 1. 中断优先级高,要减少中断对进程的影响;


  • 2. 进程之间有优先级之分,要合理改变优先级;


  • 3. 内核模块的实现机制限制,在特殊情况下使用轮训;


  • 4. 提升系统节拍,提升定时精度;


  • 5. 禁止irqbalance,防止进入节能或休眠模式;

 
还有其他更为深入的细节我们没有深入分析,比如Linux进程切换耗时,中断响应耗时、内存分配开销以及普通定时器精度和高精度定时器精度等,这些都是从细分的模块方向去研究并优化。进程的切换涉及到主调度器和周期调度器,它们都不可避免地涉及到定时器,目前Linux内核的高精度定时器也很难做到us级别,这也就决定了在调度的时间上也不是那么地准确,再加上内核中充斥着大量的自旋锁,而自旋锁的使用会关闭CPU的中断进而影响实时性,所以在开发过程中更加提高了对我们自身的水平要求。

3.总结


 前面列举的这些优化措施实施起来很简单,但对于我们自身来说更要理解为什么要这么做。深入去分析Linux内核的机制,实际的去阅读内核的模块源码,才会在实时性或者Linux内核的学习道路上收获更多。比如阅读内核源码才会知道taskletworkqueue的应用场景的不同,尽管它们都是中断下半部之一,但是它们在内核当中执行的优先级还是有很区别。只有阅读内核源码,才会知道tasklethrtimer也是基于软中断的,而且这个软中断也有优先级之分。也只有阅读内核源码,才会知道系统目前实现了多少种软中断,甚至我们自己也可以实现软中断获得实时性的提升,尽管Linux内核不建议我们这么做。除了阅读内核的源码,掌握调试跟踪内核的工具也必不可少,比如ftracetrace-cmdkernelsharkperf等。俗话说,工欲善其事必先利其器,熟练掌握这些工具的使用会让我们优化工作更高效。ftrace是一个很强大的调试工具,除了常用的函数跟踪器能让我们轻松知道一个函数的执行耗时之外,它强大的event机制,更是可以直接让我们在驱动或者内核中添加跟踪点,输出内核执行过程中的各类数据,让我们轻松洞察内核的执行过程。总之,实时性优化是一条漫长的道路,一路上也充满了各种未知,钻研越深越对它充满好奇,也越觉得Linux内核神奇。比如你可能会好奇在Linux内核中一个进程从被唤醒到真正去执行这个过程花了多长时间。又比如一个外部中断,从它被触发到真正走到用户注册的中断处理函数,这个过程又花了多长时间。只有自己亲自到设备上去调试,去尝试弄明白这些问题了才会发现Linux内核有趣的地方,也才会越走越充实。以上只是我自己在工作过程中积累的一点观点看法,如果读者面对Linux内核不知道从何处入手的话,个人建议不妨从实时性优化这个方向入手,逐渐深入。


往期课程可扫以下二维码试听与购买



Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 北京贞光科技作为三星电机一级代理商,提供全面升级的技术支持、样品供应和供应链保障服务,为客户提供专业、可靠的一站式解决方案,满足AI基础设施不断发展的需求,支持更高效、更强大的人工智能应用计算系统的开发。如需更多产品信息或技术支持,请联系贞光科技。三星电子在被动元件技术领域取得重大突破,推出专为AI服务器应用设计的超小型高容量多层陶瓷电容器(MLCC)。这些新组件解决了现代AI计算基础设施不断增长的电力需求,同时优化了密集服务器环境中的空间利用率。 满足AI服务器电力需求现代AI服务器
    贞光科技 2025-05-20 11:38 47浏览
  • 电磁场的作用主要体现在以下几个方面:首先在能源领域,电磁场是发电、输电的基础。无论是火力发电还是核电站,*终都需要通过电磁感应原理将机械能转化为电能。高压输电线路则利用交变电磁场实现电能的远距离传输,为现代工业和生活提供动力保障。在通信技术方面,电磁波作为电磁场的传播形式,构成了无线通信的基础。从无线电广播到5G移动网络,从卫星通信到光纤传输,本质上都是对特定频段电磁场的**控制和利用。雷达系统通过发射和接收电磁波实现目标探测,在气象预报、航空管制等领域不可huo缺。在医疗领域,电磁场技术为诊断
    锦正茂科技 2025-05-19 13:19 52浏览
  • 【拆解】+TFT LCD 通用测试仪拆解 目前对于车载行业,显示屏在整车的份额越来越高。各个供应商或者下级供应商都会回针对TFT的开发做规划。那么,在TFT测试方面,他们是如何进行产品开发前的测试和有效性验证的内。是的,无非就是他们公司自己开发点亮治具或者从治具供应商那边购买点亮设备。客户只需要提供客户需求。有能力的供应商就好针对需求进行分解开发。在规定的时间内完成产品的开发和交付。今天我们就来看看用在车载显示屏或者消费电子上面的TFT点亮治具—TFT LCD通用测试仪式怎么设计出来的。 如下就
    zhusx123 2025-05-18 14:07 95浏览
  • 随着智能硬件设备的快速发展,蓝牙音频语音芯片在智能家居、穿戴设备、车载电子等领域得到广泛应用。蓝牙音频语音芯片凭借其低功耗、高集成度和灵活的通信接口,成为许多开发者的选择。然而,在实际应用中,开发者可能会遇到IC芯片通过串口或MCU通信时无响应的问题。本文将从通信接口配置与故障排查角度,普及相关知识并提供解决方案。一、通信接口基础配置串口接线规则蓝牙芯片的串口通信需遵循“交叉连接”原则:TX(发送端)→ RX(接收端)RX(接收端)→ TX(发送端)若接线错误(如TX-TX或RX-RX直连),数
    广州唯创电子 2025-05-19 09:47 31浏览
  • 电磁场是自然界中一种特殊的物质存在形式,由相互依存且能够相互转化的电场和磁场共同构成。这种无形的物理场充满整个空间,既能够传递电磁力,也能够以电磁波的形式传播能量。电场源于静止或运动的电荷,表现为对带电粒子施加作用力的能力;而磁场则产生于电流或变化的电场,能够影响运动电荷的轨迹。两者通过动态耦合形成统一的电磁场系统,其行为规律由麦克斯韦方程组完整描述。这个方程组包含四个基本方程,分别揭示了电荷如何产生电场、磁场无孤立磁荷的特性、变化磁场激发电场的规律,以及电流与变化电场共同产生磁场的机制。电磁场
    锦正茂科技 2025-05-19 13:07 49浏览
  • 在智能化、数字化与信息化的时代浪潮下,物联网凭借着多频段间的通信协同能力与多协议间的通信兼容能力构建起了一张张无缝互通的IoT设备网络。从Sub-GHz频段到2.4GHz频段,从BLE/Wi-Fi协议到LoRa/Wi-SUN协议,多种频段资源与通信协议不仅推动了智能抄表、智能家居与工业自动化等领域的繁荣发展,还为万物互联的未来愿景奠定了坚实的底层通信基础。然而,随着无线通信技术的高速发展与全球IoT设备数量的持续增长,频段资源的有限性愈发凸显,在科技园区、交通枢纽与CBD等通信密集区域,同一频段
    华普微HOPERF 2025-05-20 11:07 44浏览
  •   
    华盛恒辉l58ll334744 2025-05-20 11:41 46浏览
  • 什么是信号量信号量能干啥信号量的函数实例举例总结什么是信号量简而言之,就是发出通知,接收通知的任务获得通知后去干啥啥。通知有多有少。自定义通知数量的,叫计数型信号量;只有有无(即“0”,“1”)通知的,叫二进制信号量。信号量能干啥资源管理:控制多个任务对共享资源(如外设、内存块)的访问权限,避免竞争条件任务同步 :实现任务间的时序协调(如等待某个事件完成)中断与任务通信:在中断服务程序(ISR)中快速通知任务处理事件(需使用 xxxFromISR 版本的函数)信号量的函数创建二进制信号量函数原型
    二月半 2025-05-18 20:48 106浏览
  •   头部技术企业核心能力与行业解决方案解析   华盛恒辉科技有限公司   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次开发,CRM等领域有很多成功案例。   五木恒润科技有限公司   五木恒润科技有限公司:是一家专业的部队信息化建设服务单位
    华盛恒辉l58ll334744 2025-05-19 17:18 98浏览
  • 什么是互斥量互斥量的应用场合互斥量的API函数基本代码结构互斥量使用举例递归锁递归锁举例总结什么是互斥量在freeRTOS中,多个任务访问一块共享资源,会产生竞争现象。比如马路上只有一个很早以前的电话亭,A、B都想要打电话,然后他们就开始打架了。但是如果A先进去了然后把门锁了,B想进去打电话的话只能在外面等,必须等到A把门锁打开。互斥量的应用场合像freeRTOS的多任务系统,任务A正在使用某个资源,还没用完的时候,任务B也来使用,就可能会导致问题。就比如串口,任务A正在用串口发送数据,此时任务
    二月半 2025-05-18 20:54 104浏览
  •   北京作为全国科技创新核心,汇聚众多实力强劲的软件开发企业。它们凭借深厚技术积淀与丰富行业经验,为金融、教育、医疗、零售等领域提供多元数字化方案。以下梳理北京地区代表性企业,为企业选型提供参考。   华盛恒辉科技有限公司:是一家专注于高端软件定制开发服务和高端建设的服务机构,致力于为企业提供全面、系统的开发制作方案。在部队政企开发、建设到运营推广领域拥有丰富经验,在教育,工业,医疗,APP,管理,商城,人工智能,部队软件、工业软件、数字化转型、新能源软件、光伏软件、汽车软件,ERP,系统二次
    华盛恒辉l58ll334744 2025-05-20 11:00 61浏览
  •   作战仿真推演系统:军事训练与决策的核心驱动力   作战仿真推演系统作为现代军事的关键工具,通过虚拟战场构建实现战术至战略全维度覆盖,以数字化手段提升训练效能、辅助科学决策。以下从功能、架构、应用与趋势四方面展开分析:   应用案例   目前,已有多个作战仿真推演系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润作战仿真推演系统。这些成功案例为作战仿真推演系统的推广和应用提供了有力支持。   一、系统功能:全层级作战模拟   战术级训练   系统可模拟单兵到营级作战行
    华盛恒辉l58ll334744 2025-05-20 10:30 67浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦