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.mzph.cn/bicheng/58999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分立元件】贴片电阻过电压故障机理

在文章:【分立元件】贴片电阻器的故障现象和原理 中我们讲到电阻故障现象类型。其中包括了由电气过载导致的电阻体烧损。 在文章:

ubuntu-开机黑屏问题快速解决方法

开机黑屏一般是由于显卡驱动出现问题导致。 快速解决方法: 通过ubuntu高级选项->recovery模式->resume->按esc即可进入recovery模式,进去后重装显卡驱动,重启即可解决。附加问题:ubuntu的默认显示管理器是gdm3,如果重…

Java已死,大模型才是未来?

作者:不惑_ 引言 在数字技术的浪潮中,编程语言始终扮演着至关重要的角色。Java,自1995年诞生以来,便以其跨平台的特性和丰富的生态系统,成为了全球范围内开发者们最为青睐的编程语言之一 然而,随着技术的…

24小时跑2W+销售额,本地生活+数字人直播模式真好用!

本地生活AI数字人直播的模式已经火热了一段时间了,但依旧有商家还不清楚这个模式到底好不好用?这里我就给大家稍微讲解下这种模式驱动下,对于商家来说究竟会有哪些好处。 先给大家看看已经跑了20多小时的两个数字人直播间,可以看到…

基于LLaMA Factory对LLama 3指令微调的操作学习笔记

一、环境 在vscode中用连接云服务器,打开文件目录。 df -h #查看盘容量 二、下载LLaMA Factory框架和数据 下载LLaMA Factory到云服务器 git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -e . pip install -e .命令的含…

钢琴曲相关

黑键大调问题 等音调,等音的调式化 通常用bE大调来形容,毕竟只有四个# #D大调不常用,但不是不会用 重点是是要交流的,而交流是需要简洁的 ,于是乎,一组七音,的12个键,每个里面都会…

【Python】解密Python中的魔法方法:使用 __str__、__repr__、__call__等方法提升类的功能与灵活性

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 Python 中的魔法方法是一种强大的特性,它们允许开发者为类添加特殊行为,从而使类能够模拟内置对象或实现自定义行为。本文将深入探讨Python中常用的魔法方法,如 __str__、__repr__、__call__ 等,通过丰富的代…

面试高频问题:C/C++编译时内存五个分区

在面试时,C/C++编译时内存五个分区是经常问到的问题,面试官通过这个问题来考察面试者对底层的理解。在平时开发时,懂编译时内存分区,也有助于自己更好管理内存。 目录 内存分区的定义 内存分区的重要性 代码区 数据区 BSS区 堆区 栈区 静态内存分配 动态内存分配…

Nginx转发MySQL端口及添加stream模块

1.在nginx.conf的http同级添加stream配置 stream { upstream mysql_server{ server 192.168.23.25:3306; } server { listen 8560; proxy_pass mysql_server; } } http { .... } 启动nginx后发现报错…

启用 iPhone 原生的五笔输入

聊聊如何在 iOS 中使用原生的五笔输入法 本文虽然介绍的是如何添加五笔键盘,其实其他键盘(双拼,外语键盘、第三方输入法)也是类似的添加方式。 ‍ 使用原生的理由 虽然之前的文章列了不少第三方的五笔输入法,但其实…

《天文学进展》

《天文学进展》是中国天文学会所属学术期刊,季刊,发表反映国内外天文学各分支学科最新研究成果的学术性稿件,包括述评、前沿介绍、专题讲座、研究简讯、学术活动报道以及高质量的研究论文等。投给《天文学进展》的文章必须未在其他任何地方、…

GAN在AIGC中的应用

生成对抗网络(GAN)自2014年由伊恩古德费罗(Ian Goodfellow)等人提出以来,已成为推动人工智能生成内容(AIGC)领域发展的关键技术。GAN通过其独特的生成器和判别器结构,以及两者之间的…

了解DEA算法

在信息安全领域,加密算法是保护数据机密性、完整性和可用性的关键工具。随着技术的不断进步和威胁的不断演变,各种加密算法应运而生,以满足不同场景下的安全需求。其中,DEA算法(尽管“DEA”并非一个广泛认知的加密算法…

Spring Boot与gRPC的整合

一、gRPC的介绍 在gRPC中,客户机应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您更容易创建分布式应用程序和服务。与许多RPC系统一样,gRPC基于定义服务的思想,指定可以远程调用的…

代理IPv6知识分享课堂二

嗨朋友们,欢迎来到今天的代理IPv6知识分享课堂,小蝌蚪上堂课跟大家一起认识了它的概念和工作原理等基础内容,我们算是对它有了一个初步的了解,那今天这节课我们讲的会深入点,我们今天来了解了解它的应用场景和切实地教…

恋爱脑学Rust之dyn关键字的作用

在 Rust 语言中,dyn 关键字允许我们在使用特征时创建“动态派发”——即通过一个统一的接口操作多种类型的具体实现。可以把它理解成一种“浪漫的妥协”:当我们不知道未来会爱上谁,只知道对方一定具有某种特征时,dyn 就像一个协议…

android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址

Android 浏览器是一种运行在Android操作系统上的应用程序,主要用于访问和查看互联网内容。以下是关于Android浏览器的详细介绍: 1. 基本功能 Android浏览器提供了用户浏览网页的基本功能,如: 网页加载:支持加载静态…

Sketch下载安装,中文版在线免费用!

Sketch是一款轻便、高效的矢量设计工具,全球众多设计师借助它创造出了无数令人惊叹的作品。Sketch在下载安装方面,其矢量编辑、控件以及样式等功能颇具优势,不过,Sketch中文版即时设计在下载安装方面也毫不逊色。即时设计是一个一…

Golang | Leetcode Golang题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; func countArrangement(n int) int {f : make([]int, 1<<n)f[0] 1for mask : 1; mask < 1<<n; mask {num : bits.OnesCount(uint(mask))for i : 0; i < n; i {if mask>>i&1 > 0 && (num%(i1) 0 |…

8进制在线编码工具--实现8进制编码

具体前往&#xff1a;文本转八进制在线工具-将文本字符串转换为8进制编码,支持逗号&#xff0c;空格和反斜杠分隔符