本工具用途為量化 scheduling latency / OS jitter。
在各個處理器核上綁定 (pin) 一個執行緒,並以 clock_nanosleep()
進行 1 us 的 sleep。
在 sleep 結束後,呼叫 clock_gettime()
獲取當下 timestamp,並將其與原先指定的 wakeup 時間相減,所得的差即為 scheduling latency / OS jitter。
從上述介紹,我們可推斷 jitterdebugger 生成的 task 為 interactive task,因為其相關 task 大部分時候在 sleep。
取得原始程式碼:
$ git clone https://github.com/igaw/jitterdebugger
執行 make
命令編譯專案。
預期可以在專案目錄下看到 jitterdebugger
執行檔。
使用以下命令執行可動態觀察輸出,倘若不使用參數 -v
則會在結束 (Ctrl + C) 時印出相關統計:
$ sudo ./jitterdebugger -v
(會需要 sudo
的原因是 jitterdebugger 在測量期間會關閉處理器的 C-state,避免處理器進入省電模式進而增加 jitter 的可能性,而只有 root 才有權限操作相關檔案)
預期可以看到類似以下輸出:
affinity: 0-15 = 16 [0xFFFF]
T: 0 (313591) A: 0 C: 3222 Min: 1 Avg: 1.03 Max: 9
T: 1 (313593) A: 1 C: 3221 Min: 1 Avg: 1.04 Max: 4
T: 2 (313594) A: 2 C: 3219 Min: 1 Avg: 1.04 Max: 3
T: 3 (313595) A: 3 C: 3218 Min: 1 Avg: 1.03 Max: 4
T: 4 (313596) A: 4 C: 3217 Min: 1 Avg: 1.25 Max: 11
T: 5 (313597) A: 5 C: 3216 Min: 1 Avg: 1.02 Max: 4
T: 6 (313598) A: 6 C: 3214 Min: 1 Avg: 1.04 Max: 4
T: 7 (313599) A: 7 C: 3213 Min: 1 Avg: 1.05 Max: 24
T: 8 (313600) A: 8 C: 3212 Min: 1 Avg: 1.05 Max: 4
T: 9 (313601) A: 9 C: 3211 Min: 1 Avg: 1.01 Max: 3
T:10 (313602) A:10 C: 3210 Min: 1 Avg: 1.05 Max: 3
T:11 (313603) A:11 C: 3208 Min: 1 Avg: 1.05 Max: 4
T:12 (313604) A:12 C: 3207 Min: 1 Avg: 1.01 Max: 3
T:13 (313605) A:13 C: 3206 Min: 1 Avg: 1.03 Max: 4
T:14 (313606) A:14 C: 3205 Min: 1 Avg: 1.05 Max: 4
T:15 (313607) A:15 C: 3203 Min: 1 Avg: 1.07 Max: 4
C
表示執行次數
T
表示 pin 到 percpu 執行的 thread 的 id
輸出結果的時間單位為 -N
將單位更改為 nanosecond)
值得注意的是,-c
這個參數可讓我們在背景執行自訂的工作負載,例如若想在背景執行 stress,可透過以下命令:
$ sudo ./jitterdebugger -v -c 'stress -c 20'
此外,本工具還支援以圖片方式輸出量測結果,不過首先需要安裝以下 Python 套件:
以 PIP 套件管理工具安裝相關套件的話可使用以下命令:
$ pip install pandas matplotlib
首先我們需將 jitterdebugger
的輸出導向至一目錄,例如:
$ sudo ./jitterdebugger -o result
接著執行 jitterplot
將數據輸出為 JPG 格式:
$ ./jitterplot --output out.jpg hist result
預期可得到類似以下圖片: