Linux 应用程序CPU调度优化

news2024/11/18 17:22:45

缘起

       实时操作系统(Real-time operating system, RTOS),又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。实时操作系统与一般的操作系统相比,最大的特色就是实时性,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。
      经常跟实时操作系统一起讲的,还有嵌入式操作系统这个概念,但实际上这是完全不同的两种东西,虽然大多数实时操作系统都是嵌入式操作系统,但嵌入式操作系统并不全都是实时的。
      对于实时操作系统有一些常见的误区,比如:速度快,吞吐量大,代码精简,代码规模小等等。其实这些都不算是实时操作系统的特性,别的操作系统也可以做到。只有实时性才是RTOS的最大特征,其它的都不算是。

       在了解了关于实时的概念后, 对于以下说描述的问题相对会更好理解一点. 本文采用的平台是RK3588 + Linux, 运行非实时操作系统编写一个C++程序, 用于从陀螺仪中读取数据并写入文件中, 陀螺仪的采样频率为 2000HZ, 也就是说0.5MS采样一次, 文件中写一行. 通过优化应用程序的CPU调度, 提高应用程序相应的实时性, 尽量接近实时操作系统.
在这里插入图片描述

过程

神奇的现象: 频繁地打印时间间隔反而缩小了!

	char buff[32];
	while(true){
		size_t read = read(fd, buff, 32);
		//-----------打印-------------
		//---------------------------
	}

打印的方式有两种, 一种是次循环里都有打印, 另一种是每个 1秒打印一次.

方式帧率
每次循环2000HZ
隔一秒1500-1900HZ

多次测试后,结果依旧, 为了保证输出的稳定性, 于是做了一些尝试, 其中一种方法就是提高线程的优先级
提高线程的优先级可以影响线程的调度顺序,使其在竞争资源时更有可能获得CPU时间片.

	pthread_t thread = pthread_self(); // 获取底层线程句柄
    struct sched_param param;
    param.sched_priority = sched_get_priority_max(SCHED_FIFO);
    if (pthread_setschedparam(thread, SCHED_FIFO, &param) != 0) {
        std::cerr << "无法设置线程的优先级" << std::endl;
    }

很幸运, 方法有效.

在前面读取数据的基础上, 加上了写入文件, 记录数据的功能, 整体性能和稳定性下降明显

原因有两个

  1. 主控运行在性能自动调节模式
  2. 程序运行在低性能的小核

第一点很好解决: 参考RK3588 CPU GPU DDR NPU定频和性能模式设置 设置高性能模式即可.
在这里插入图片描述


第二点需要用到taskset, 参考Linux性能优化(十五)——CPU绑定
     taskset用来查看和设定“CPU亲和力”,说白了就是查看或者配置进程和cpu的绑定关系,让某进程在指定的CPU核上运行,即是“绑核”。
RK3588: CPU – 4x Cortex-A76 @ 2.4/2.6 GHz和 4x Cortex-A55 内核@ 1.8 GHz, 4个大核, 4个小核.
需注意的是, 4个小核在0-3, 4个大核在4-7, 刚开始使用taskset是一直设置在小核上, 导致修改后效果不明显.

  • 指定CPU运行程序:
#程序运行在 CPU 7上.
taskset -c 7 /my_program
  • 修改运行中的程序
#修改指定进程运行到 CPU 7 上
taskset -pc 7 pid

修改后可以通过命令查看, 参考判断Linux进程在哪个CPU核运行的4个方法

## 方法1
$ taskset -cp pid
pid pid's current affinity list: 0-15

## 方法2
$ ps -eo pid,cmd,psr 4597
   4597 cat                          15

Timer 与 Thread 的sleep

为了稳定帧率, 减少帧误差, 稳定采样间隔在0.5MS, 尝试使用了线程和定时器的方法, 从测试结果看定时器的精度跟高

#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#include <signal.h>
#include <time.h> 


void  handle(union sigval v){
    time_t t;
    char p[32];
    time(&t);
    strftime(p, sizeof(p), "%T", localtime(&t));
    printf("%s thread %lu, val = %d, signal captured.\n", p, pthread_self(), v.sival_int);
    return;
}

int main(int argc, char *argv[]){

    struct sigevent evp;
    struct itimerspec ts;
    timer_t timer;
    int ret;
    memset   (&evp, 0, sizeof(evp));
    evp.sigev_value.sival_ptr = &timer;
    evp.sigev_notify = SIGEV_THREAD;
    evp.sigev_notify_function = handle;
    evp.sigev_value.sival_int = 3;   //作为handle()的参数
    ret = timer_create(CLOCK_REALTIME, &evp, &timer);
    if( ret){
        perror("timer_create");
    }
   
    ts.it_interval.tv_sec = 1;
    ts.it_interval.tv_nsec = 0;
    ts.it_value.tv_sec = 3;
    ts.it_value.tv_nsec = 0;
    ret = timer_settime(timer, TIMER_ABSTIME, &ts, NULL);
    if( ret )
    {
        perror("timer_settime");
    }

    while(1);

}

结语

整个过程下来, 有效的优化有以下几点:

  1. 提高硬件工作频率, 如CPU, DDR, EMMC等
  2. 优化CPU调度, 把进程放到高性能的核上去运行
  3. 错开进程, 避免CPU资源抢占
  4. 提高线程优先级
  5. Timer的精确度优于 Thread 的 sleep

另外还有内核实时补丁方法,有待验证

---------------------------------------------------------

    “有更好的方法或建议, 欢迎不吝指教”

---------------------------------------------------------

引用

RK3588 CPU GPU DDR NPU定频和性能模式设置
判断Linux进程在哪个CPU核运行的4个方法
Linux性能优化(十五)——CPU绑定
什么是实时操作系统(RTOS)
Linux 系统上最常用的定时器

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

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

相关文章

如何通过员工工时管理降低企业成本?

作为当今快节奏商业环境的领导者或管理者&#xff0c;掌握员工的工作时间对于控制企业成本和确保每个人都各尽其责至关重要。 员工工时表软件就是这样一款工时跟踪管理解决方案&#xff1a;数字化的工时表有助于保护企业的财务不会被无节制的开支冲垮。然而&#xff0c;引入此…

windows PC virtualBox 配置

效果&#xff1a; oracle vitualbox 可以访问通PC主机&#xff0c;可以访问外网: 注意&#xff0c;如果docker0网络地址&#xff0c;和PC主机的网络地址冲突了&#xff0c;需要变更docker的网络地址&#xff1a; root/home/mysqlPcap/anti-tamper $ cat /etc/docker/daemon.js…

C++初阶1

目录 介绍&#xff1a; 一&#xff0c;命名空间 1-1&#xff0c;命名空间的定义 1-2&#xff0c;命名空间的使用 1-3&#xff0c;C标准官方命名空间 二&#xff0c;缺省参数 2.1&#xff0c;缺省参数分类 三&#xff0c;函数重载 四&#xff0c;引用 4-1&#xff0c;…

论文阅读——ELECTRA

论文下载&#xff1a;https://openreview.net/pdf?idr1xMH1BtvB 另一篇分析文章&#xff1a;ELECTRA 详解 - 知乎 一、概述 对BERT的token mask 做了改进。结合了GAN生成对抗模型的思路&#xff0c;但是和GAN不同。 不是对选择的token直接用mask替代&#xff0c;而是替换为…

中国两轮“技术派”绿源,为全球电动市场带来跨越式方案

历史越长的行业&#xff0c;遇到变革之时&#xff0c;需要经历的考验、做出的突破就越多。两轮电动车&#xff0c;这个非常本土化的赛道&#xff0c;就是如此。 中国是两轮电动车产销大国&#xff0c;自上世纪晚期开始&#xff0c;中国两轮电动车迅速发展&#xff0c;绿源等一…

【Linux】虚拟机部署与发布J2EE项目(Windows版本)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

优思学院|精益管理的八步法

精益管理是什么&#xff1f;所谓的精&#xff0c;即少而精&#xff0c;不投入多余的生产要素&#xff0c;只是在适当的时间生产必要数量的市场急需产品&#xff08;或下道工序急需的产品&#xff09;&#xff1b;所谓的益&#xff0c;即所有经营活动都要有益有效&#xff0c;具…

【C语言】字符函数与字符串函数

简单不先于复杂&#xff0c;而是在复杂之后。 目录 0. 前言 1. 函数介绍 1.1 strlen 1.1.1 介绍 1.1.2 strlen 函数模拟实现 1.1.2.1 计数器方法 1.1.2.2 递归方法 1.1.2.3 指针 - 指针方法 1.2 strcpy 1.2.1 介绍 1.2.2 strcpy 函数模拟实现 1.3 strcat 1…

TSINGSEE青犀睡岗离岗检测算法——确保加油站安全运营

众所周知&#xff0c;加油站是一个需要24小时营业的场所&#xff0c;由于夜间加油人员较少&#xff0c;员工极易处于疲劳或者睡眠状态&#xff0c;为保障安全和效率&#xff0c;通过TSINGSEE青犀睡岗离岗检测算法在加油站场景中&#xff0c;可以及时发现工作人员的疲劳状况&…

Python---while循环中else的基本语法(是同级关系)

为什么需要在while循环中添加else结构 循环可以和else配合使用&#xff0c; else下方缩进的代码指的是当循环正常结束之后要执行的代码。 强调&#xff1a; 循环 正常结束&#xff0c;else之后要执行的代码。 非正常结束&#xff0c;其else中的代码是不会执行的。&#…

【软考系统架构设计师】2023年系统架构师冲刺模拟习题之《数据库系统》

在数据库章节中可能会考察以下内容&#xff1a; 文章目录 数据库完整性约束&#x1f31f;数据库模式&#x1f31f;&#x1f31f;ER模式&#x1f31f;关系代数&#x1f31f;&#x1f31f;并发控制&#x1f31f;数据仓库与数据挖掘&#x1f31f;&#x1f31f;反规范化技术&#x…

【卖断货攻略】抢先看:美国全品类30天爆量近2亿刀!

距离10月27日黑五大促正式上线不足6小时&#xff0c;你上车了吗&#xff1f; 看到TikTok美国市场近期的GMV走势图&#xff0c;就感觉这届黑五将不简单。 为助力跨境商家在这个关键节点做好最后准备&#xff0c;本期超店有数将从选品、营销两大角度为大家盘点现阶段TikTok Shop…

体系结构评估——(三)风险承担者

风险承担者分为系统生产者、系统消费者、系统服务人员和其他四大类。 其中系统生产者有&#xff1a;软件系统架构师、开发人员、维护人员、集成人员、测试人员、标准专家、 性能工程师、安全专家、项目经理、产品线经理。 系统消费者有&#xff1a;客户、最终用户、应用开发…

特征工程优化

参考链接 https://www.bilibili.com/video/BV1WN4y1k7R1/?buvidXU0E30D0C6006B7F1EE1425156434CFEC440F&from_spmidtm.recommend.0.0&is_story_h5false&midfMtk7pz9LsVpSyGt0Mcizg%3D%3D&p1&plat_id116&share_fromugc&share_mediumandroid&sh…

政务钉钉扫码登录(前端)

前提 使用 iframe 嵌入专有钉钉二维码页面&#xff0c;本篇仅说前端&#xff1b;需要申请 client_id 应用标识&#xff0c;但这里不赘述。详见此处&#xff1b;回调地址 redirect_uri&#xff0c;与服务器相关人员确认&#xff0c;但这里不赘述&#xff1b;扫码登录官方说明 …

LeetCode 1465. 切割后面积最大的蛋糕

矩形蛋糕的高度为 h 且宽度为 w&#xff0c;给你两个整数数组 horizontalCuts 和 verticalCuts&#xff0c;其中&#xff1a; horizontalCuts[i] 是从矩形蛋糕顶部到第 i 个水平切口的距离 verticalCuts[j] 是从矩形蛋糕的左侧到第 j 个竖直切口的距离 请你按数组 horizontalC…

【优选算法系列】第二节.双指针(202. 快乐数和11. 盛最多水的容器)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;优选算法系列 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff01…

了解接口测试只需3分钟

为什么要做接口测试&#xff1f; 在公司里&#xff0c;客户端和服务端通常是由不同的团队开发的&#xff0c;在项目开发过程中&#xff0c;客户端和服务端开发的进度不一致&#xff0c;比如服务端先开发完了&#xff0c;这个时候可以先对服务端进行接口测试&#xff0c;确保服…

douyin ios 8404六神参数学习记录

玩那么久安卓了&#xff0c;也终于换一换ios终端分析分析&#xff0c;还是熟悉的x-gorgon&#xff0c;x-argus&#xff0c;x-medusa那些参数。 随便抓个抖音 ios版本的接口&#xff1a; 像评论接口&#xff1a; https://api26-normal-hl.amemv.com/aweme/v2/comment/list/?…

OpenCV官方教程中文版 —— 傅里叶变换

OpenCV官方教程中文版 —— 傅里叶变换 前言一、原理二、Numpy 中的傅里叶变换三、OpenCV 中的傅里叶变换四、为什么拉普拉斯算子是高通滤波器&#xff1f; 前言 本小节我们将要学习&#xff1a; • 使用 OpenCV 对图像进行傅里叶变换 • 使用 Numpy 中 FFT&#xff08;快速…