我正在嘗試使用 Raspberry Pi 上的 Raspbian 發行版來實現最接近的即時處理,以操作其 GPIO 引腳。我想「感受」一下我可以期待的表演。
我打算透過編寫一個簡單的 C 程式來盡可能快速地重複切換引腳,並使用邏輯分析器對其進行監控來實現此目的。
但也許還有另一種方法,透過編寫上述程序,但簡單地記錄上下文切換,以準確查看該線程/進程何時可以控制幾秒鐘的採樣週期。
上一個問題回答瞭如何查看給定進程在一段時間內進行了多少次上下文切換,但是是否有一種方法可以記錄切換的精確時間,並且可能是針對每個進程,而不僅僅是一個進程?顯然這會產生開銷,但仍然有用。顯然,資料應該儲存在 RAM 中以最小化開銷
自我提醒:可能的解決方案:
- 即時列出進程所有操作的命令
- Hacky:讓程式重複取得並儲存目前時間(一旦日誌達到一定限制,就將其儲存到檔案中)。或者,進行輕微改進以避免大量日誌:使用一種演算法,如果連續時間足夠接近,可以推斷它們沒有被其他進程搶佔,則可以消除連續時間。
答案1
我沒有答案,但你可能會在其中找到一個工具、範例和資源perf
由 Brendan Gregg 在命令和 Linux 核心 ftrace 和 debugfs上編寫或列出。
在我的 Raspberry Pi 上,這些工具位於 package 中perf-tools-unstable
。該perf
命令實際上是在/usr/bin/perf_3.16
.
感興趣的可能是這個討論和上下文切換基準作者:伯努瓦‧西古爾 (Benoit Sigoure)緯度ctx從相當舊的測試lmbench套房。
他們可能需要一些工作才能在 Pi 上運行,例如tsuna/contextswitch
我編輯timectxswws.c
get_iterations()
為,並從 中while (iterations * ws_pages * 4096UL < 4294967295UL) {
刪除。-march=native -mno-avx
Makefile
透過 ssh 在 Pi 上使用perf record
10 秒,同時while sleep .1;do echo hi;done
在另一個 ssh 中執行以下操作:
sudo timeout -10 perf_3.16 record -e context-switches -a
sudo perf_3.16 script -f time,pid,comm | less
給出這樣的輸出
sleep 29341 2703976.560357:
swapper 0 2703976.562160:
kworker/u8:2 29163 2703976.564901:
swapper 0 2703976.565737:
echo 29342 2703976.565768:
migration/3 19 2703976.567549:
sleep 29343 2703976.570212:
kworker/0:0 28906 2703976.588613:
rcu_preempt 7 2703976.609261:
sleep 29343 2703976.670674:
bash 29066 2703976.671654:
echo 29344 2703976.675065:
sshd 29065 2703976.675454:
swapper 0 2703976.677757:
大概顯示上下文切換事件發生的時間以及哪個行程。