PREEMPT-RT 系统cpu使用率周期CPU飙高问题

背景

在22年进行PREEMPT-RT系统问题的调试时,之前文章在CPU性能优化小记-使用火焰图定位性能问题只是定位解决了其中一个问题,还有一个潜在的问题当时没有续写。然而,最近几乎所有PREEMPT-RT产品上都出现了该问题,影响了非实时任务的CPU吞吐量,引起了大家的广泛关注。因此,有必要对这个问题进行简单记录,希望对大家有所帮助。

本文只说明原因和结论,省略了问题定位流程。

现象

在PREEMPT-RT系统的某些应用场景下,即使没有运行特定的应用程序,整个系统的CPU负载在间隔一段时间后会突然飙升几百毫秒甚至几秒钟。不同机器上的持续时间和间隔时间会有所不同。

无论使用top还是pidstat进行观察,只能确定system CPU使用率飙升,且相关线程不定,与具体线程无关。

复现条件

找到一台具有良好实时性的机器,可以是PREEMPT-RT系统或是xenomai+rtnet系统,创建一个高实时任务。该任务使用raw socket周期性地向目标机器发送广播帧,周期可以是500us、1ms或2ms,但发帧周期必须非常准确。

原因

该问题为PREEMPT-RT通病(至少我当前接触到的内核从3.2到5.10均有该问题),整个系统中存在一个以上外部周期事件时就会出现,比如接收PLC发送的周期以太网帧、外部FPGA触发的周期IO中断事件、EtherCAT主站同步到从站参考时钟后中断收发以太网帧等等。

由于外部周期事件(中断)基于的时钟源与PREEMPT-RT系统调度时钟源不同,这两个时钟存在时钟漂移,周期事件会和PREEMPT RT本身的系统调度事件发生周期交越,当两个事件逐渐接近的时候,两个事件都要处理,频繁的上下文导致cpu飙高,系统实时任务的抖动会微微增大。这是PREEMPT-RT系统为了保证外部事件实时性而牺牲CPU吞吐量的机制所导致的。

解决措施

尽管没有彻底解决的方法,但可以尝试以下缓解措施:

  • 对于单CPU核系统,系统tick无法关闭,该问题无解;
  • 对于SMP多核系统,使能CONFIG_NO_HZ_FULL,降低系统周期Tick,同时设置周期事件中断的亲和性到使能CONFIG_NO_HZ_FULL且没有周期任务运行的CPU上来缓解。

关于Linux时钟子系统,详见本博客之前的文章 linux时间子系统简介

下一篇文章,我们将探讨由PREEMPT-RT实时机制导致的网络风暴下系统死机问题。

【原创】PREEMPT-RT 系统cpu使用率周期CPU飙高问题的更多相关文章

  1. CPU 使用率低 but负载高

    一.关于负载 什么是负载:负载就是cpu在一段时间内正在处理以及等待cpu处理的进程数之和的统计信息,也就是cpu使用队列的长度统计信息,这个数字越小越好(如果超过CPU核心*0.7就是不正常) 负载 ...

  2. 06 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?

    上一节我讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过 ...

  3. 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?

    上一节讲了 CPU 使用率是什么,并通过一个案例教你使用 top.vmstat.pidstat 等工具,排查高 CPU 使用率的进程,然后再使用 perf top 工具,定位应用内部函数的问题.不过就 ...

  4. 某个应用的CPU使用率居然达到100%,我该怎么做?(三)

    某个应用的CPU使用率居然达到100%,我该怎么做?(三) 1. 引 你们好,可爱的小伙伴们^_^! 咱们最常用什么指标来描述系统的CPU性能呢?我想你的答案,可能不是平均负载,也不是CPU上下文切换 ...

  5. Linux:CPU使用率100%排查方法

    Linux作为一个多任务操作系统,将每个CPU的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉. CPU使用率 Linux作为一个多任务操作系统,将每个CPU ...

  6. 05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?

    通过前两节对平均负载和 CPU 上下文切换的学习,我相信你对 CPU 的性能已经有了初步了解.不过我还是想问一下,在学这个专栏前,你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平 ...

  7. 某个应用的CPU使用率居然达到100%,我该怎么办?

    > 本文是通过学习极客时间专栏<Linux性能优化实战>05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办? ## CPU 使用率 *** 为了维护 CPU 时间, ...

  8. CPU使用率和平均负载

    转载: https://mp.weixin.qq.com/s?__biz=MzU4NzU0MDIzOQ==&mid=2247487782&idx=3&sn=3f04bb053d ...

  9. 一文秒懂CPU使用率

    目录 CPU:Cores, and Hyper-Threading  超线程(Hyper-Threading ) 多核(multi-cores) CPU使用率计算 CPU使用率测试 如何计算CPU使用 ...

  10. Cisco WS-C4503-E CPU使用率高问题排查

    现状描述: 办公网环境下由2台VSS模式下WS-C4503-E 作为核心交换机,下接若干台WS-C2960X-48LPS-L作为接入.行政同事在进行工位改造的时候为方便将原工位网线下联若干台hub. ...

随机推荐

  1. Win32 拆分窗口

    前两天学习了MFC的拆分窗口,今天来学习Win32 SDK下如何拆分窗口. win32是没有像MFC那样直接有函数方法拆分窗口,只能自己处理了. 1.在WM_CREATE消息中创建两个控件,TreeV ...

  2. Win32封装对话框类

    [主程序入口.cpp] #include <windows.h> #include <tchar.h> #include "resource.h" #inc ...

  3. 微信小程序中使用Echarts展示折线图

    效果图 主要实现的功能输入地区和频次查询油价的调整消息 1.从echarts-for-weixin官网下载文件 2.项目中引入echarts 将整个文件夹放在项目pages同级的目录下面 import ...

  4. Java异常详解(全文干货)

    介绍 Throwable Throwable 是 Java 语言中所有错误与异常的超类. Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常 ...

  5. Docker的数据卷与数据卷容器操作

    一.数据卷 数据卷(Data Volumes)是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount动作. 数据卷可以提供很多有用的特性: 数据卷可以在容器之 ...

  6. chrome.tabs.sendMessage和chrome.runtime.sendMessage的用法及区别

    在 Chrome 扩展开发中,chrome.tabs.sendMessage 和 chrome.runtime.sendMessage 是用于不同目的的消息发送 API,它们的主要区别在于消息的目标对 ...

  7. Charles的https抓包方法及原理/下载ssl/http证书【转】

    Charles的https抓包方法及原理/下载ssl/http证书   本文的Charles,适应windows/MAC/IOS/Android,避免抓包HTTPS失败和乱码: charles如果不配 ...

  8. 支付宝小程序swiper video的坑

    在使用uniapp 开发多端应用的时候,踩了一个坑,有一个页面,是使用swiper作为滑动容器,然后每个swiper-item 嵌套不同的内容, 代码示意: <template> < ...

  9. 深度学习Python代码小知识点(备忘,因为没有脑子)

    现在是2024年4月24日16:58,今天摸鱼有点多,备忘一下,都写到一篇内容里面,免得分散. 1. np.concatenate()函数'np.concatenate'是NumPy库中用来合并两个或 ...

  10. CSS & JS Effect – Textarea Autoresize

    前言 这是一个很普遍的体验, 而且实现起来也很简单哦 参考 YouTube – How to Auto Resize Textarea using HTML CSS & JavaScript ...