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. 2024年智能革命:HarmonyOS NEXT与盘古大模型5.0的颠覆性融合

    引言 2024年,这一年注定在全球智能设备市场的历史上写下浓墨重彩的一笔.作为全球科技巨头,华为再次以其前瞻性的布局,推动了技术与应用的深度融合.在这个充满变革的时代,华为通过不断扩展的鸿蒙生态系统, ...

  2. 【Appium】之自动化定位总结

    一.同级定位时,先定位上级 我想定位[必填]框,我先定位[姓名]的同一个上级 self.driver.find_element(MobileBy.XPATH,"//*[contains(@t ...

  3. 使用 nuxi build-module 命令构建 Nuxt 模块

    title: 使用 nuxi build-module 命令构建 Nuxt 模块 date: 2024/8/31 updated: 2024/8/31 author: cmdragon excerpt ...

  4. 使用.NET源生成器(SG)生成项目的版本号信息

    之前写过一篇 源生成器生成自动注入的代码 主要是通过SyntaxProvider查找标注特性实现 其实除了SyntaxProvider之外还有几个很重要的Provider,比如:MetadataRef ...

  5. express项目的创建

    前言 前端开发者若要进行后端开发,大多都会选择node.js,在node生态下是有大量框架的,其中最受新手喜爱的便是老牌的express.js,接下来我们就从零创建一个express项目. 安装nod ...

  6. Java 多个String(字符串)判断是否null(空值)

    Java 多个String(字符串)判断是否null(空值) 示例: String s = null; if (str1 != null) { s = str1; } else if (str2 != ...

  7. 人形动画常见IK的处理

    Unity中常见人形动画IK的处理方式 本文将尝试仅使用Untiy内置的Animator来解决常见的几种运动所需的IK.也会给出核心功能的代码实现. 效果一览:b站视频 Unity中人形角色的IK I ...

  8. 今日算法随笔:填充每个节点的下一个右侧节点指针 II

    题目链接:117. 填充每个节点的下一个右侧节点指针 II 题目描述 给定一个二叉树,填充它的每个 next 指针,让这个指针指向其下一个右侧节点.如果找不到下一个右侧节点,则将 next 指针设置为 ...

  9. 小tips:前端容易读错的单词列表

    排名第一的是width,音标/wɪdθ/,发/i/的音,不是发/ai/的音: hidden音标/ˈhɪdn/发/i/的音,不是发/ai/的音: hide音标/haɪd/,发/ai/的音: float音 ...

  10. Dart 2.12 现已发布

    作者 / Michael Thomsen Dart 2.12 现已发布,其中包含 健全的空安全 和 Dart FFI 的稳定版.空安全是我们最新主打的一项生产力强化功能,意在帮助您规避空值错误,以前这 ...