Linux 应用程序CPU调度优化

8 篇文章 0 订阅
7 篇文章 0 订阅

缘起

       实时操作系统(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 系统上最常用的定时器

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化 Linux 服务器上的服务或应用程序可以提高性能、可靠性和安全性。下面是一些常见的优化步骤: 1. 定期更新和升级:确保您的服务器上的操作系统、服务和应用程序都是最新的版本。定期进行更新和升级可以修复漏洞、改进性能和添加新功能。 2. 配置合适的硬件资源:了解您的服务或应用程序的需求,并确保为其分配足够的硬件资源,如 CPU、内存和存储空间。根据需求进行适当的扩展或升级。 3. 调整内核参数:通过调整 Linux 内核参数,可以优化服务器的性能和稳定性。这些参数控制各种系统行为,如文件系统缓存、网络连接数、进程调度等。您可以编辑 `/etc/sysctl.conf` 文件来修改参数。 4. 优化网络设置:对于网络密集型服务,调整网络设置可以改善性能。例如,调整 TCP/IP 参数、启用流量控制和拥塞控制机制等。 5. 调整服务配置:对于特定的服务或应用程序,了解其配置选项并进行调整可以提高性能。例如,数据库服务器可以通过调整缓冲区大小、查询优化和索引来提高响应速度。 6. 启用缓存和加速技术:使用适当的缓存和加速技术可以减少对后端资源的请求。例如,使用反向代理服务器、CDN、页面缓存、数据库缓存等。 7. 定期监测和调优:使用性能监测工具来监测服务器的性能指标,并基于监测结果进行调优。例如,使用工具如top、vmstat、sar等来监测系统资源的使用情况。 8. 安全优化:确保服务器的安全性,包括配置防火墙、限制远程访问、使用安全协议、定期备份数据等。安全性的提升可以减少潜在的风险和性能问题。 这些是一些常见的 Linux 服务器优化步骤。根据您特定的需求和服务/应用程序的要求,可能还有其他优化策略。建议参考相关文档、官方指南或专业资源以获取更详细和特定的优化建议。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值