Linux 实时调度案例:系统启动时被限制带宽的实时进程

文章目录

  • 1. 前言
  • 2. 今天的德芙,不那么丝滑
  • 3. 后记

1. 前言

限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。

2. 今天的德芙,不那么丝滑

最近的工作不是很丝滑,本以为三两下会解决的问题,结果还是缠缠绵绵好久;当然,生活有苦也有甜,有时候以为会很难搞的问题,结果没两下又豁然开朗。

甜蜜的经历笔者就不厚道地独享了,这里分享一个不那么丝滑的经历。这两天,遇到这样一个问题,有一个用来音频处理的单线程程序,运行于一个带 4 核ARM64 平台上,程序启用了实时优先级。开发阶段,都是通过在命令行手工输入来启动,调试的差不多了,就准备使用开机自启动的方式,做进一步地测试,于是在 /etc/init.d 目录下加入启动脚本,然后重启系统,结果就傻眼了,系统启动十次,就有九次播放音频卡顿,这完全出乎笔者意料之外。踅摸踅摸,看看哪里出了差错,一时没有头绪。折腾几次,突然一条内核日志引起了笔者的注意:

sched: RT throttling activated

这个似乎让笔者看到一些光亮,既然有线索,那就不能轻易放过。一番调查,发现确实是笔者的音频测试程序触发的该条内核日志。但是为什么?只有在开机自启动方式才会触发该条内核日志、才会出问题?一时间不得要领。查看屡次启动的内核日志,结合到并非每次都会出现问题,朦朦胧胧的似乎抓到了什么,但又看不真切。笔者知道,胡乱推测,除了浪费时间不会得到什么。还是得从唯二线索入手。目前手头有两条线索:

1. 内核日志sched: RT throttling activated2. 并非每次都会出问题

对于第 2 条线索,暂时不知道能得出什么结论,暂时先放一边;对于第 1 条线索的内核日志,结合笔者了解对 Linux 实时进程带宽 的理解,笔者推断,可能是因为在开机自启动的场景下,系统运行进程很少,因此音频实时进程没有什么竞争,很快达到了系统默认实施进程 CPU 资源上限的 95%,触发了实时进程限制的内核日志。顺着这个思路往下想,那是不是可以推迟音频测试程序的启动时间,越是往后越好,等到启动足够多的进程后,再启动音频测试程序,就不会引发系统对实时进程的限制,从而解决问题?再结合第 2 条线索,在偶尔的不出现问题的那些次数,发现音频进程的 PID,对比其它开机自启动程序,都是 PID 较大的几个之一,这基本可以表明音频测试程序的启动时间,在开机自启动程序里面是靠后的,这样,第 2 条线索也能够对起来了。

既然有了合理地推测(至少看起是这样),又对上了已有的线索。那有了足够的理由去进行验证了,笔者想办法延迟了音频测试程序的启动时间:

1. 按 /etc/init.d 下脚本的启动排序方式,更改了音频程序启动脚本名称,让它更靠后启动。
2. 插入一个无用的 busy loop 无用程序的启动脚本,让这个脚本在音频程序启动脚本之前执行。这个 busyloop 得花点心思,它有和 CPU 核心数相同的线程数,每个线程绑定一个核心。这么做的目的是保证每个 CPU 核心上都有一定的工作量,这样不管单线程的音频测试程序在哪个 CPU 核心上运行,都不会达到 Linux 对该 CPU 核心上实时进程占有资源上限。
3. 音频程序启动脚本启动音频测试程序前,插入几秒钟的延迟。

经测试验证,光是采用 1. ,几乎没有太大效果,大多数时候都还是会有问题;如果同时结果策略 2. ,有较大改善,但还是有较高概率出问题;再结合策略 3. ,则很少会出问题,但还是无法完全避免。这时候只得从代码本身入手,使用策略

4. 在适当的地方插入适量的睡眠时间

同时移除策略 1.,2.,3.,经过一段时间测试,目前没有再重现问题。

3. 后记

音频程序开机自启动方式引发的问题,最终通过在代码插入适量的睡眠时间,解决了问题(至少目前看来如此);但手工从命令行启动的方式,即使不加入睡眠时间,也没有引发 RT throttling,这是个值得进一步深思的问题,一个可能合理的推测是:系统负载上来后,即使实时进程,也没法达到 CPU 对实施进程资源的上限了。当然,这需要更衣进一步的证据,等笔者有了结论,再来与大家一起分享,我们今天的故事,到这里就结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/7020.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Webserver(4.9)本地套接字的通信

目录 本地套接字 本地套接字 TCP\UDP实现不同主机、网络通信 本地套接字实现本地的进程间的通信&#xff0c;类似的&#xff0c;一般采用TCP的通信流程 生成套接字文件 #include<arpa/inet.h> #include<stdio.h> #include<stdlib.h> #include<unistd.h&…

ubuntu22.04 docker-compose搭建apisix高可用

首先你得先确保每台主机安装了docker和docker-compose 3台主机 没有安装docker和docker-compose的可以看我前两篇博客 可以先克隆仓库 git clone https://github.com/apache/apisix-docker.git 进入example目录 拷贝dashboard配置文件 将all-in-one中apisix-dashboard文件夹拷…

stable diffusion 大模型

本节内容&#xff0c;给大家带来的是stable diffusion的基础模型课程。基础模型&#xff0c;我们有时候也称之为大模型。在之前的课程中&#xff0c;我们已经多次探讨过大模型&#xff0c;并且也见识过一些大模型绘制图片的独特风格&#xff0c;相信大家对stable diffusion大模…

AI-Prompt、RAG、微调还是重新训练?选择正确的生成式AI的使用方法

生成式人工智能正在快速发展&#xff0c;许多人正在尝试使用这项技术来解决他们的业务问题。一般情况下有4种常见的使用方法&#xff1a; Prompt Engineering Retrieval Augmented Generation (RAG 检索增强生成) 微调 从头开始训练基础模型(FM) 本文将试图根据一些常见的…

数字化装配助力柔性制造与快速换型,驱动效率飞跃

数字化装配是利用先进的数字化技术&#xff0c;如三维建模、仿真分析、物联网、大数据、人工智能等&#xff0c;对装配过程进行精确设计、优化控制和智能管理的一种现代化生产方式。它打破传统装配依赖于人工经验和物理样机的局限&#xff0c;通过模拟环境进行预装配验证&#…

软件测试学习笔记丨Vue常用指令-输入绑定(v-model)

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/23461 指令 指令是将一些特殊行为应用到页面DOM元素的特殊属性 格式都是以v-开始的&#xff0c;例如&#xff1a; v-model&#xff1a;双向绑定v-if和v-else&#xff1a;元素是否存在v-sho…

关于“浏览器”上不了网的问题

一、起因 小编的笔记本电脑浏览器又坏了&#xff0c;所有浏览器都上不了网&#xff1f;&#xff1f;&#xff1f;&#xff08;当然了WIFI已连接&#xff09; 但是微信可以正常发消息 因为上次也有过&#xff0c;这次又出现了&#xff0c;所以小编写篇文章记录一下解决方法 二…

自动化神器:如何用Markdown写自动化用例!

01 什么是Gauge Gauge是一款用于编写和运行验收测试的BDD框架&#xff0c;它有如下的特点&#xff1a; 使用Markdown的简单、灵活的语法来描述行为 支持多平台&#xff08;Windows、Linux、macOS&#xff09;、多语言(C#、Java、Javascript、Python、Ruby&#xff09; 支持插…

Facebook定位不准是什么原因?

不知道出海获客的小伙伴有没有人跟我遇到一样的问题&#xff1a;Facebook账号定位与IP地位不一致。定位不准确会导致无法看到账号好友&#xff0c;并且账号可能很快受限&#xff0c;无法正常使用。所以解决这个问题是当务之急&#xff0c;下面分享一下可能出现这个情况的原因以…

从计划到完成:最佳Todolist任务管理软件全指南

在工作节奏越来越快的今天&#xff0c;如何有效地管理任务&#xff0c;清晰安排每一步骤&#xff0c;成了每个职场人士提升效率的关键。特别是对于任务繁杂、需要多团队协作的互联网企业来说&#xff0c;一款好用的任务管理软件无疑是提升生产力的利器。本文将为大家深入测评几…

Mysql的行锁,改一行锁一行

目录标题 前言行级锁1. 共享锁&#xff08;Shared Lock&#xff09;2. 排他锁&#xff08;Exclusive Lock&#xff09; 行级锁中的死锁&#xff08;Dead Lock&#xff09;现象行级锁虽好&#xff0c;但有时候会升级成表级锁第一种情况&#xff0c;当未命中索引时&#xff0c;行…

十五 MyBatis的逆向工程

十五、MyBatis的逆向工程 所谓的逆向工程是&#xff1a;根据数据库表逆向生成Java的pojo类&#xff0c;SqlMapper.xml文件&#xff0c;以及Mapper接口类等。 要完成这个工作&#xff0c;需要借助别人写好的逆向工程插件。 思考&#xff1a;使用这个插件的话&#xff0c;需要…

易快报与金蝶云星空无缝集成的技术实现

易快报与金蝶云星空无缝集成的技术实现 易快报员工对接金蝶员工&#xff1a;数据集成技术案例分享 在企业信息化建设中&#xff0c;数据的高效流动和准确对接是实现业务流程自动化的关键。本文将聚焦于一个具体的系统对接集成案例——易快报员工数据集成到金蝶云星空&#xff…

day-81 排序链表

思路 用一个List存储链表中的值&#xff0c;然后进行升序排序&#xff0c;最后将链表中值依次改为排序后的值即可 Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { …

【零基础小白】 window环境下安装RabbitMQ

RabbitMQ环境安装 RabbitMQ是用Erlang语言编写的&#xff0c;因此在安装RabbitMQ之前&#xff0c;需要先安装Erlang环境。 一、 安装Erlang环境 1、准备工作 确定Erlang版本&#xff1a;根据具体需求以及必须和RabbitMQ版本一致安装符合的Erlang版本。 RabbitMQ 和 Erlang 的版…

【MySQL系列】区分大小写与支持表情字符的考量

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【科普】简述机器学习和深度学习及其相关的算法

文章目录 机器学习1. 基本概念2. 机器学习的分类3. 机器学习的常用方法4. 应用领域5. 挑战与未来6. 未来趋势 机器学习算法 深度学习1.深度学习的基本概念2.深度学习的主要架构3.深度学习的应用4.深度学习的挑战 深度学习算法 机器学习 机器学习是人工智能的一个重要分支&…

232转485模块测试

概述 常用的PLC一般会有两个左右的232口&#xff0c;以及两个左右的485口&#xff0c;CAN口等&#xff0c;但是PLC一般控制的设备可能会有很多&#xff0c;会超出通讯口的数量&#xff0c;此时我们一般会采用一个口接多个设备&#xff0c;这种情况下要注意干扰等因素&#xff0…

STM32外设之SPI的介绍

### STM32外设之SPI的介绍 SPI&#xff08;Serial Peripheral Interface&#xff09;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;主要用于EEPROM、FLASH、实时时钟、AD转换器等外设的通信。SPI通信只需要四根线&#xff0c;节约了芯片的管脚&#x…

LLM——10个大型语言模型(LLM)常见面试题以及答案解析

今天我们来总结以下大型语言模型面试中常问的问题 1、哪种技术有助于减轻基于提示的学习中的偏见? A.微调 Fine-tuning B.数据增强 Data augmentation C.提示校准 Prompt calibration D.梯度裁剪 Gradient clipping 答案:C 提示校准包括调整提示&#xff0c;尽量减少产生…