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. 通过 GitHub Actions 实现代码的自动编译和发布

    GitHub Actions 是一个非常强大的工具,可以用来实现各种自动化任务,包括自动编译和发布 release.以下是一个基本的工作流程,展示如何使用 GitHub Actions 实现这一目标: ...

  2. tar 解压文件时提示 Ignoring unknown extended header keyword

    在 Linux 上使用 tar 解压文件时出现下列提示: tar: Ignoring unknown extended header keyword 'LIBARCHIVE.xattr.com.app ...

  3. CLion 2022.2.4破解教程详细图解mac,windows,linux均适用

    下载与安装 此教程为CLion 2022.2.4 破解教程,且此教程以及下面提供的破解补丁适用与2022.2以后的新版本. 2022年11月10日亲测有效,mac与windows均测试完美破解 CLi ...

  4. CEIT算法训练-双指针部分题解(全12题)

    代码宏定义以及框架约定 #include <bits/stdc++.h> using namespace std; #define IOS ios_base::sync_with_stdi ...

  5. Centos7.9安装Docker和Docker compose

    什么是docker环境 Docker环境是指在计算机中安装和配置了Docker引擎的运行环境.Docker是一种容器化平台,它提供了一种轻量级的虚拟化技术,能够将应用程序及其依赖项打包成一个独立的容器 ...

  6. Linux IP 命令

    改MAC 地址 ip link set dev nic1 downip link set dev nic1 address 0c:42:a1:8f:a4:47ip link set dev nic1 ...

  7. 详解JVM 内存结构与实战调优总结

    详解JVM 内存结构与实战调优总结 GC优化案例做个总结: 1在进行GC优化之前,需要确认项目的架构和代码等已经没有优化空间.我们不能指望一个系统架构有缺陷或者代码层次优化没有穷尽的应用,通过GC优化 ...

  8. dfs 验证搜索二叉树——leetcode98

    代码来自leetcode官方 一开始我自己写这个代码时只注意当前节点是否会存在空指针,并没有注意到他的孩子节点也有可能为空,绕了我好久...... /** * Definition for a bin ...

  9. 伯克利函数调用排行榜(BFCL)

    自 2022 年底以来,大语言模型(LLMs)凭借其执行通用任务的强大能力,成为众人关注的焦点.不仅限于聊天应用,将这些模型应用于开发各类 AI 应用和软件(如 Langchain, Llama In ...

  10. debian 12 编译 vlc/libvlc 支持 rtsp

    debian 官方从11开始,不再提供支持 rtsp 的 VLC deb 包,通过 libvlc 播放 rtsp 也无法实现,因此需要自己编译. # 安装编译环境,编译依赖库以及 contrib 第三 ...