本工具用途為量化 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
預期可得到類似以下圖片:
GitHub repo: https://github.com/firelzrd/bore-scheduler BORE 排程器著重在透過犧牲些許 fairness 來換取較低的 interactive task 的 scheduling latency。此外,其建構在 CFS 之上,並只對更新 vruntime 的程式碼做調整,整體改動相對其他非官方 CPU 排程器 (例如:CacULE, TT, Baby, Project C, MuQSS ^本文最下方提供相關超連結^) 可以說是相當小。 burst time 機制 BORE 在 sched_entity 結構體中加入一名為 burst_time 的成員,用於紀錄給定 schedule entity 總共的 CPU time (實際使用 CPU 的時間),並輔助 burst score (用於取得 task 權重值的 index) 的計算,burst score 越高 (使用越多 CPU 時間),代表 task 越不可能是 interactive task,因此 vruntime 增加的幅度就越大,以使得 interactive task 有較好的 scheduling latency 表現: @@ -885,6 +897,19 @@ static void update_curr(struct cfs_rq *cfs_rq) curr->sum_exec_runtime += delta_exec; schedstat_add(cfs_rq->exec_clock, delta_exec);
May 22, 2022BPF (Berkeley Packet Filter) eBPF (extended BPF) is traditionally used to safely and securely accelerate the network path in Linux with custom logic specified by userspace. Notable changes from cBPF (classic BPF) to eBPF: 32-bit reg -> 64-bit reg 2 general purpose reg -> 10 general purpose reg + 1 frame pointer reg introduction of JIT compiler upgraded instruction set, but remains backward-compatibility to cBPF
Oct 12, 2021contributed by < flawless0714 > 自我檢查清單 你是否詳閱 手機裡頭的 ARM 處理器:系列講座 呢?請紀錄學習過程中遇到的問題 請解釋 AArch64 個別通用暫存器的作用,依據 Linux on AArch64 ARM 64-bit Architecture 的描述,搭配實際的程式碼說明。提示: 簡報第 19 頁附有參考資訊 回答
Sep 19, 2021測驗 δ -- 1 實作缺失位於函式 con_pop 中: node_t *node = queue->first; /* Node to be removed */ node_t *new_header = queue->first->next; /* become the first in the queue */ /* Queue is empty */ if (!new_header) { mtx_unlock(queue->first_mutex); return NULL;
Jul 19, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up