[問題] 想要降低load average

作者: icetofux   2021-01-19 23:01:25
我近期在類似樹梅派這樣的單板電腦上架構了一個應用,大約由10支程式獨立程式構
成,程式部分以C++跟python編寫,主要用途是藉由板子上的UART與外部設備通訊、
讀取ADC,用GPIO控制周邊電路。
程式跟程式間我使用redis進行資料交換,程式架構的虛擬碼大致如下:
while(true) {
// 從redis讀取別的程式產生的資料
...
// UART通訊 or 讀ADC or 操作GPIO
...
// 將讀到的值或執行的結果寫入redis
...
// 延遲若干時間讓CPU得以休息
// C++用std::this_thread::sleep_for()
// Python用time.sleep()
delay(n);
}
這種結構是我以前寫MCU或RTOS常使用的程式架構。
今天查資料時偶然知道uptime跟free這類效能監控命令,結果發現load average
異常的高,在單核心CPU下1、5、30分鐘的監測值都落在8.x~10.x之間,至於記憶
體使用量倒是還好,平均都還有25%的閒置(free)空間。以top觀看CPU使用率較高
的程式都是我編寫的,其他service等使用量都不高。我有嘗試去加長delay時間,
delay要直到秒級才有比較明顯的效果,但這麼長的delay有點不實際。
由於接觸linux程式設計時間並不長,不太知道這類問題要怎麼下關鍵字找資料比
較正確,所以想請問各位先進尋求建議,讓我有個方向可以解決這個現象。
謝謝。
作者: ketrobo (貓蘿蔔)   2021-01-20 00:29:00
你瞭解load average數字代表的意義嗎?只有這個數字其實看不出什麼,還需要配合CPU/IO等等
作者: s678131 (Mu)   2021-01-20 09:31:00
profilers
作者: leolarrel (真.粽子無雙)   2021-01-20 12:54:00
可以google unix 的select/poll/epoll,或許可以幫助你
作者: Bencrie   2021-01-21 01:17:00
睡到秒才有效果那應該不是 I/O 那邊的問題吧掛個 perf 上去跑看看
作者: james732 (好人超)   2021-01-22 19:38:00
通常寫MCU的不是會用interrupt base的架構嗎
作者: dces4212 (flawless)   2021-02-02 00:03:00
io_uring

Links booklink

Contact Us: admin [ a t ] ucptt.com