Process

記錄每個程序或執行緒上下文切換的時間

  • October 2, 2016

我正在嘗試使用 Raspberry Pi 上的 Raspbian 分發來獲得最接近實時的處理,以操縱其 GPIO 引腳。我想對我可以期待的那種表現有一種“感覺”。

我打算通過編寫一個簡單的 C 程序來做到這一點,該程序盡可能快地重複切換一個引腳,並使用邏輯分析儀對其進行監控。

但也許還有另一種方法,通過編寫上述程序,但只需記錄上下文切換,以準確查看該執行緒/程序何時控制了幾秒鐘的採樣時間。

上一個問題回答瞭如何查看給定程序在某個時間段內進行了多少上下文切換,但是有沒有一種方法可以記錄切換的精確時間,也許是每個程序,而不僅僅是一個?顯然這會產生成本,但仍然有用。顯然數據應該儲存在 RAM 中以最小化成本

自我注意:可能的解決方案:

  • 命令實時列出程序的所有動作
  • Hacky:讓程序反复獲取和儲存目前時間(一旦日誌達到一定的限制就保存到文件中)。或者,為了避免大量日誌進行輕微改進:使用一種算法來消除連續時間,如果它們足夠接近,可以推斷它們沒有被其他程序搶占。

我沒有答案,但您可能會在Brendan Gregg 編寫或列出的關於命令和 Linux 核心 ftrace 和 debugfs的工具、範例和資源中找到一個。perf

在我的 Raspberry Pi 上,這些工具在 package 中perf-tools-unstable。該perf命令實際上在/usr/bin/perf_3.16.


感興趣的可能是Benoit Sigoure 的討論和上下文切換基準測試,以及來自相當老的lm bench套件的lat_ctx測試。

他們可能需要一些工作才能在 Pi 上執行,例如tsuna/contextswitch我編輯timectxswws.c get_iterations()while (iterations * ws_pages * 4096UL < 4294967295UL) {,並-march=native -mno-avxMakefile.


通過 ssh 在 Pi 上使用perf record10 秒,同時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: 

大概顯示了上下文切換事件何時發生,對於哪個程序。

引用自:https://unix.stackexchange.com/questions/313424