实时优化: Linux实时的一些小概念

简介: ![](http://blog.iotwrt.com/images/realtime2.svg) 我们都知道对于机器人应用来说实时性很重要, 以及Linux不是一个实时系统, 但是说: * 实时性到底对我的程序有什么影响? * 默认情况下, Linux的实时性怎么样? * rt-linux 有什么用? 所以这里简单的做个实验, 来直观的认识一下. 注: 下面的测试数

我们都知道对于机器人应用来说实时性很重要, 以及Linux不是一个实时系统, 但是说:

  • 实时性到底对我的程序有什么影响?
  • 默认情况下, Linux的实时性怎么样?
  • rt-linux 有什么用?

所以这里简单的做个实验, 来直观的认识一下.
注: 下面的测试数据, 都是在CPU满载的情况下得出.

1. 调度实时

1.1. 测试程序

一个简单ROS程序逻辑如下: 以100hz向外发送数据.

while (1) {
  usleep(10000);
  process();
}

我们接下来就用这个程序的循环周期间隔来评估这个程序的实时性.
PS: Robotics上常见的高频率基本也就集中在200hz~100hz, 比如说IMU传感器的周期和各种控制的采样周期

1.2. 实时调度器

默认Linux的调度器为CFS.

在CFS调度器下, ROS应用跑了5分钟, 其中出现的最大延迟为50ms

[ INFO] [1551423662.755795004]: dt: now 10893.000000 max 54892.000000

下面我们设置这个应用为rt调度策略

chrt --rr  -p <priority between 1-99> pid

跑了5分钟, 其中出现的最大延迟为13ms

[ INFO] [1551425162.716713135]: dt: now 10447.000000 max 13020.000000

1.2.1. 结论

可以看到, 在默认cfs调度器的情况, 一个程序的周期运行时间在CPU高负载的情况下是得不到保障的.
对关键的程序来说设置rt调度非常有必要.
不然叠加起来, 就有可能出现数百毫秒的延迟.
如果这是一个刹车链路, 那在80km/h的速度下刹车距离就会上下浮动10几米,

1.3. RT-Linux

在上面rt调度的情况, 可以看到最大的周期间隔13ms, 而不是严格的10ms.
造成这个3ms的原因有很多, 包括内核不支持抢占等等.
而RT-Linux补丁, 就是为了解决这些原因而产生的.

这里下载补丁, 重新编译内核

https://cdn.kernel.org/pub/linux/kernel/projects/rt/3.14/older/

上车继续执行测试程序(rt调度)

跑了5分钟, 其中出现的最大延迟为10.7ms

[ INFO] [1551434073.434294415]: dt: now 10284.000000 max 10701.000000

1.3.1. 结论

RT-Linux补丁可以解决默认Linux下毫秒级的调度误差

1.4. 其他

2. 程序执行实时

上文研究循环周期间隔所针对的都是调度上的实时性.
对实时性而言, 像process时间也要考虑起来, 这针对的是程序执行上的实时性.

一些影响程序实时性的点:

  • 内存缺页

    • Linux applications access memory by using virtual addresses. Each virtual address translates into a physical address with the help of hardware that uses translation tables. This feature makes it possible to address more virtual memory than there is physical memory available, assuming that not all applications need all their allocated memory at the same time.
  • I/O阻塞
  • 多线程同步阻塞
  • 其他......

这里不再详细描述, 有兴趣可看以下参考:

3. 总结

上文两者都做到确定后, 就可以计算任务的deadline.

4. 附录

4.1. 相关数据


4.1. Tips

以下两条命令, 可以看程序主动/被动施放cpu的次数.

sar -w 1 3
pidstat -w
相关文章
|
2月前
|
存储 Linux
Linux基础项目开发1:量产工具——改进优化(八)
Linux基础项目开发1:量产工具——改进优化(八)
34 0
Linux基础项目开发1:量产工具——改进优化(八)
|
1月前
|
缓存 Ubuntu 网络协议
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
Linux系统编程之文件I/O函数的使用:介绍文件I/O函数的基本概念、用法和实现方式
20 1
|
14天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
1月前
|
NoSQL Java Linux
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
【Linux IO多路复用 】 Linux 网络编程 认知负荷与Epoll:高性能I-O多路复用的实现与优化
60 0
|
1月前
|
消息中间件 Linux
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
22 2
|
1月前
|
算法 Linux 调度
Linux 线程介绍:介绍Linux系统中线程的基本概念、创建和调度机制
Linux 线程介绍:介绍Linux系统中线程的基本概念、创建和调度机制
15 0
|
1月前
|
消息中间件 存储 安全
Linux 进程和线程介绍:介绍Linux系统中进程和线程的基本概念、执行方式和相互关系
Linux 进程和线程介绍:介绍Linux系统中进程和线程的基本概念、执行方式和相互关系
32 1
Linux 进程和线程介绍:介绍Linux系统中进程和线程的基本概念、执行方式和相互关系
|
1月前
|
存储 Linux
Linux系统编程之Linux 信号集编程:信号集的基本概念、用法和实现方式
Linux系统编程之Linux 信号集编程:信号集的基本概念、用法和实现方式
12 0
|
1月前
|
Linux Shell
Linux中认识路径的概念
Linux中认识路径的概念
|
1月前
|
Java Linux Shell
Linux探秘之旅:透彻理解路径、命令与系统概念
Linux探秘之旅:透彻理解路径、命令与系统概念
46 1