# [jitterdebugger](https://github.com/igaw/jitterdebugger) 介紹 本工具用途為量化 [scheduling latency](https://source.android.com/devices/audio/latency/contrib?hl=en#schedLatency) / [OS jitter](https://researcher.watson.ibm.com/researcher/view_group.php?id=3868)。 ## 量化方法 在各個處理器核上綁定 (pin) 一個執行緒,並以 `clock_nanosleep()` 進行 1 us 的 sleep。 在 sleep 結束後,呼叫 `clock_gettime()` 獲取當下 timestamp,並將其與原先指定的 wakeup 時間相減,所得的差即為 [scheduling latency](https://source.android.com/devices/audio/latency/contrib?hl=en#schedLatency) / [OS jitter](https://researcher.watson.ibm.com/researcher/view_group.php?id=3868)。 從上述介紹,我們可推斷 jitterdebugger 生成的 task 為 interactive task,因為其相關 task 大部分時候在 sleep。 ## 使用方式 取得原始程式碼: ```shell $ git clone https://github.com/igaw/jitterdebugger ``` 執行 `make` 命令編譯專案。 預期可以在專案目錄下看到 `jitterdebugger` 執行檔。 使用以下命令執行可動態觀察輸出,倘若不使用參數 `-v` 則會在結束 (Ctrl + C) 時印出相關統計: ```shell $ sudo ./jitterdebugger -v ``` (會需要 `sudo` 的原因是 jitterdebugger 在測量期間會關閉處理器的 [C-state](https://www.wikiwand.com/en/Advanced_Configuration_and_Power_Interface#/Processor_states),避免處理器進入省電模式進而增加 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 輸出結果的時間單位為 $\mu s$ (可指定參數 `-N` 將單位更改為 nanosecond) 值得注意的是,`-c` 這個參數可讓我們在背景執行自訂的工作負載,例如若想在背景執行 [stress](https://linux.die.net/man/1/stress),可透過以下命令: ```shell $ sudo ./jitterdebugger -v -c 'stress -c 20' ``` 此外,本工具還支援以圖片方式輸出量測結果,不過首先需要安裝以下 Python 套件: - Matlibplot - Pandas 以 [PIP](https://www.w3schools.com/python/python_pip.asp) 套件管理工具安裝相關套件的話可使用以下命令: ```shell $ pip install pandas matplotlib ``` 首先我們需將 `jitterdebugger` 的輸出導向至一目錄,例如: ```shell $ sudo ./jitterdebugger -o result ``` 接著執行 `jitterplot` 將數據輸出為 JPG 格式: ```shell $ ./jitterplot --output out.jpg hist result ``` 預期可得到類似以下圖片: ![](https://i.imgur.com/hwuvAyJ.jpg)