天天看點

實時優化: Linux實時的一些小概念1. 排程實時2. 程式執行實時3. 總結4. 附錄

實時優化: Linux實時的一些小概念1. 排程實時2. 程式執行實時3. 總結4. 附錄

我們都知道對于機器人應用來說實時性很重要, 以及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. 相關資料

實時優化: Linux實時的一些小概念1. 排程實時2. 程式執行實時3. 總結4. 附錄
實時優化: Linux實時的一些小概念1. 排程實時2. 程式執行實時3. 總結4. 附錄

4.1. Tips

以下兩條指令, 可以看程式主動/被動施放cpu的次數.

sar -w 1 3
pidstat -w           

繼續閱讀