打印
[应用]

专核专用——提升树莓派实时性的一种方法

[复制链接]
2299|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tobot|  楼主 | 2022-1-4 21:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tobot 于 2022-1-13 21:58 编辑

#申请原创#  
这个话题的是从上一个帖子
https://bbs.21ic.com/forum.html?mod=viewthread&tid=3186340#pid12522916)引入的。
我们知道linux是一个比较典型的非实时操作系统,支持多用户和多进程,通过进程调度分享CPU时间,在CPU“忙”的时候,每个进程都只能等待到属于它自己的时间片才能使用CPU资源,虽然分时操作系统已经尽量缩短系统的平均响应时间并提高系统的吞吐率,在单位时间内为尽可能多的用户请求提供服务,且可以通过分配进程的优先级,使重要任务可以尽可能的获取更多CPU时间片,但对于一般任务来说,内核中仍然有大量不可抢占区域,因此在Linux系统中,单纯提升任务的优先级,仍然不能避免抢占的问题。
而从其衍生出来的raspbian则是树莓派主要使用的操作系统,优化以后注重平均表现性能,整体相对流畅,而对于某单个任务来说,其响应时间就比较玄学了。而对于某些传感器器件(比如我们之前提到的DHT11),如果某次特定执行的响应时间超时,任务就失败了,而即使在某个单次任务中执行更快,也并没有意义,我们更希望的是能够稳定的执行每次任务。
基于上述弊端,这里介绍一种“专核专用”的思路来试图优化树莓派操作系统中的任务抢占。
我们知道树莓派使用多核的MCU,我们可以考虑让某个特定任务在单个核中运行,其它任务在其它核里运行,这样虽然牺牲了性能,但无疑可以提升这个任务的可靠性。
以树莓派4B为例,安装raspbian系统后,使用cat /proc/cpuinfo命令,可以看到它有四个核,分别是以0123为序号的ARMv7 Processor rev 3 (v7l),四个核性能相同,同时运行,共同为整个系统所用。
输入htop命令可以查看到,当前时刻四个核上的cpu占用率分别为1.3%4.6%8.1%6.3%。虽然每个核的cpu占用各有不同,但就每一个核来说,都没有闲置不用。
当执行某个任务时,如果不是特别指明,系统会随机指派一个核运行,此时我们并不知道该任务使用了哪个核,这是因为各核间是采用优先级加权轮转调度的。换句话说,我们运行某个程序或者执行某个任务的时候,它可能跑在任意一个核上,同时这个核也可能同时给其它的任务使用,选择的时候通过比较优先级来确定分配的时间片,如此一来,实时性的确不太好保证。
关于raspbian的配置文档里面有一段介绍,大意是可以在cmdline.txt配置中,使用isolcpus屏蔽某个核被任务进程调用,按照文档所说,我们尝试在/boot/cmdline.txt中增加isolcpus=3
修改后,保存重启,再次查看,发现第四个核的cpu利用率为0.0%,为了进一步验证任务只使用了前3个核,我们使用stress-ng -c 4产生4cpu压力进程。
在另起一个窗口查看htop
可以看到4个核(序号是3)中cpu利用率仍然为0.0%,因此可以证明修改是有效的。
ps -ao pid,args,psr命令查看任务进程(包括各任务所在的核):
看到除开执行命令的pid 1219进程(推测此任务cpu占用率较低)外,产生cpu压力的pid 1220122112221223使用的psr分别为0112,下一次重复,可能是0012,总之,不会出现在核3中。意味着stres-ng -c 4命令已经成功“避开”了核3
接下来尝试使用taskset命令,将特定任务进程指派给预留出来的核3资源。
执行taskset -c 3 python3 rasp4b_dht11.py命令,让python3 rasp4b_dht11.py运行在核3上,因为这个任务本身并不太消耗资源,使用htop,看不出核3cpu利用率有明显变化。但是可以再次使用ps -ao pid,args,psr命令:
可以看到新增的python3 rasp4b_dht11.py任务被强制指派由3核运行,实现了我们的专核专用的目标。
虽然从验证效果来看,读取DHT11的准确率,似乎并没有得到太大改善,依然经常出错。但发现在系统中新开stress-ng -c 4任务也不会让本来经常DHT11失败的任务,读取准确率进一步下降。有充分理由可以相信,经过这种修改,的确对系统的“非实时”的问题有所改善。

使用特权

评论回复
沙发
闻则123| | 2023-12-13 15:25 | 只看该作者
看看,学习下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

3834

帖子

7

粉丝