rtla-timerlat-top¶
測量作業系統定時器延遲¶
- 手冊章節:
1
概要¶
rtla timerlat top [選項] ...
描述¶
rtla timerlat 工具是 timerlat 跟蹤器的一個介面。 timerlat 跟蹤器為每個 CPU 排程一個核心執行緒。這些執行緒設定一個週期性定時器來喚醒自己,然後再次進入睡眠。喚醒後,它們收集並生成有用的資訊,用於除錯作業系統定時器延遲。
timerlat 跟蹤器以兩種方式輸出資訊。它會週期性地列印定時器 IRQ 處理程式和 Thread 處理程式處的定時器延遲。它還透過 osnoise: 跟蹤點啟用最相關資訊的跟蹤。
rtla timerlat 工具設定 timerlat 跟蹤器的選項,並收集和顯示結果摘要。預設情況下,資料收集是透過附加到 timerlat 跟蹤器的專用 BPF 程式在核心空間同步完成的。如果 BPF 或其所附加的 osnoise:timerlat_sample 跟蹤點不可用,則 rtla timerlat 工具會回退到使用 tracefs 在使用者空間非同步處理資料。
rtla timerlat top 顯示 timerlat 跟蹤器週期性輸出的摘要。它還透過 osnoise: 跟蹤點為每個作業系統噪聲提供資訊,這些資訊可以透過 -T 選項檢視。
選項¶
-a, --auto 微秒
設定自動跟蹤模式。此模式在除錯系統時設定一些常用選項。它等同於使用 -T 微秒 -s 微秒 -t。預設情況下,timerlat 跟蹤器對 timerlat 執行緒使用 FIFO:95,因此等同於 -P f:95。
-p, --period 微秒
設定 timerlat 跟蹤器週期,單位為微秒。
-i, --irq 微秒
如果 IRQ 延遲高於引數值(單位:微秒),則停止跟蹤。
-T, --thread 微秒
如果 Thread 延遲高於引數值(單位:微秒),則停止跟蹤。
-s, --stack 微秒
如果 Thread 延遲高於引數值(單位:微秒),則在 IRQ 處儲存堆疊跟蹤。
-t, --trace [檔案]
將停止的跟蹤儲存到 [檔案|timerlat_trace.txt]。
- --dma-latency 微秒
將 /dev/cpu_dma_latency 設定為 微秒,旨在限制退出空閒狀態的延遲。 cyclictest 預設將此值設定為 0,使用 --dma-latency 0 可獲得類似結果。
- --deepest-idle-state n
停用執行 timerlat 執行緒的 CPU 上高於 n 的空閒狀態,以減少退出空閒狀態的延遲。如果 n 為 -1,則停用所有空閒狀態。退出 timerlat 時,空閒狀態設定將恢復到執行 timerlat 之前的原始狀態。
要求 rtla 使用 libcpupower 構建。
-k, --kernel-threads
使用 timerlat 核心空間執行緒,與 -u 相反。
-u, --user-threads
設定 timerlat 在沒有工作負載的情況下執行,然後排程使用者空間工作負載在 timerlat_fd 上等待。一旦工作負載被喚醒,它會再次進入睡眠,從而將核心到使用者和使用者到核心的測量結果新增到跟蹤器輸出中。除非使用者指定 -k,否則將使用 --user-threads。
-U, --user-load
設定 timerlat 在沒有工作負載的情況下執行,等待使用者排程一個每個 CPU 的任務,該任務在 tracing/osnoise/per_cpu/cpu$ID/timerlat_fd 上等待新的週期。有關使用者負載程式碼示例,請參閱 linux/tools/rtla/sample/timerlat_load.py。
-q, --quiet
僅在會話結束時列印摘要。
-c, --cpus cpu-列表
設定 osnoise 跟蹤器在 cpu-列表 中執行示例執行緒。
-H, --house-keeping cpu-列表
僅在給定的 cpu-列表 上執行 rtla 控制執行緒。
-d, --duration 時間[秒|分|小時|天]
設定會話持續時間。
-D, --debug
列印除錯資訊。
-e, --event 系統:事件
在跟蹤 (-t) 會話中啟用一個事件。引數可以是特定事件,例如 -e sched:sched_switch,或系統組的所有事件,例如 -e sched。允許多個 -e。僅當設定了 -t 或 -a 時才啟用。
--filter <過濾器>
使用 <過濾器> 過濾上一個 -e 系統:事件 事件。有關事件過濾的更多資訊,請參閱 https://kernel.linux.club.tw/doc/html/latest/trace/events.html#event-filtering。
- --trigger <觸發器>
為上一個 -e 系統:事件 啟用跟蹤事件觸發器。如果 hist: 觸發器被啟用,輸出直方圖將自動儲存到名為 system_event_hist.txt 的檔案中。例如,命令
rtla <command> <mode> -t -e osnoise:irq_noise --trigger=”hist:key=desc,duration/1000:sort=desc,duration/1000:vals=hitcount”
將自動儲存與 osnoise:irq_noise 事件關聯的直方圖內容到 osnoise_irq_noise_hist.txt。
有關事件觸發器的更多資訊,請參閱 https://kernel.linux.club.tw/doc/html/latest/trace/events.html#event-triggers。
-P, --priority o:優先順序|r:優先順序|f:優先順序|d:執行時:週期
設定 osnoise 跟蹤器執行緒的排程引數,設定優先順序的格式為
o:優先順序 - 使用 SCHED_OTHER 和 優先順序;
r:優先順序 - 使用 SCHED_RR 和 優先順序;
f:優先順序 - 使用 SCHED_FIFO 和 優先順序;
d:執行時[微秒|毫秒|秒]:週期[微秒|毫秒|秒] - 使用 SCHED_DEADLINE 和納秒單位的 執行時 和 週期。
-C, --cgroup[=cgroup]
為跟蹤器的執行緒設定一個 cgroup。如果 -C 選項不帶引數,跟蹤器的執行緒將繼承 rtla 的 cgroup。否則,執行緒將被放置在傳遞給該選項的 cgroup 上。
--warm-up 秒
啟動工作負載後,讓其執行 秒 秒,然後才開始收集資料,以允許系統預熱。預熱期間生成的統計資料將被丟棄。
- --trace-buffer-size KB
設定每個 CPU 的跟蹤緩衝區大小(單位:KB),用於跟蹤輸出。
-h, --help
列印幫助選單。
--dump-tasks
如果滿足停止條件,列印所有 CPU 上執行的任務(取決於 !--no-aa)
--no-aa
停用自動分析,減少 rtla timerlat 的 CPU 使用。
--aa-only 微秒
設定停止跟蹤條件並執行,而不收集和顯示統計資料。如果系統達到停止跟蹤條件,則列印自動分析結果。此選項有助於減少 rtla timerlat 的 CPU 使用,從而在沒有收集統計資料開銷的情況下啟用除錯。
示例¶
在下面的示例中,timerlat 跟蹤器在自動跟蹤模式下被分派到 CPU 1-23,指示跟蹤器在發現 40 微秒 或更高的延遲時停止。
# timerlat -a 40 -c 1-23 -q
Timer Latency
0 00:00:12 | IRQ Timer Latency (us) | Thread Timer Latency (us)
CPU COUNT | cur min avg max | cur min avg max
1 #12322 | 0 0 1 15 | 10 3 9 31
2 #12322 | 3 0 1 12 | 10 3 9 23
3 #12322 | 1 0 1 21 | 8 2 8 34
4 #12322 | 1 0 1 17 | 10 2 11 33
5 #12322 | 0 0 1 12 | 8 3 8 25
6 #12322 | 1 0 1 14 | 16 3 11 35
7 #12322 | 0 0 1 14 | 9 2 8 29
8 #12322 | 1 0 1 22 | 9 3 9 34
9 #12322 | 0 0 1 14 | 8 2 8 24
10 #12322 | 1 0 0 12 | 9 3 8 24
11 #12322 | 0 0 0 15 | 6 2 7 29
12 #12321 | 1 0 0 13 | 5 3 8 23
13 #12319 | 0 0 1 14 | 9 3 9 26
14 #12321 | 1 0 0 13 | 6 2 8 24
15 #12321 | 1 0 1 15 | 12 3 11 27
16 #12318 | 0 0 1 13 | 7 3 10 24
17 #12319 | 0 0 1 13 | 11 3 9 25
18 #12318 | 0 0 0 12 | 8 2 8 20
19 #12319 | 0 0 1 18 | 10 2 9 28
20 #12317 | 0 0 0 20 | 9 3 8 34
21 #12318 | 0 0 0 13 | 8 3 8 28
22 #12319 | 0 0 1 11 | 8 3 10 22
23 #12320 | 28 0 1 28 | 41 3 11 41
rtla timerlat hit stop tracing
## CPU 23 hit stop tracing, analyzing it ##
IRQ handler delay: 27.49 us (65.52 %)
IRQ latency: 28.13 us
Timerlat IRQ duration: 9.59 us (22.85 %)
Blocking thread: 3.79 us (9.03 %)
objtool:49256 3.79 us
Blocking thread stacktrace
-> timerlat_irq
-> __hrtimer_run_queues
-> hrtimer_interrupt
-> __sysvec_apic_timer_interrupt
-> sysvec_apic_timer_interrupt
-> asm_sysvec_apic_timer_interrupt
-> _raw_spin_unlock_irqrestore
-> cgroup_rstat_flush_locked
-> cgroup_rstat_flush_irqsafe
-> mem_cgroup_flush_stats
-> mem_cgroup_wb_stats
-> balance_dirty_pages
-> balance_dirty_pages_ratelimited_flags
-> btrfs_buffered_write
-> btrfs_do_write_iter
-> vfs_write
-> __x64_sys_pwrite64
-> do_syscall_64
-> entry_SYSCALL_64_after_hwframe
------------------------------------------------------------------------
Thread latency: 41.96 us (100%)
The system has exit from idle latency!
Max timerlat IRQ latency from idle: 17.48 us in cpu 4
Saving trace to timerlat_trace.txt
在這種情況下,主要因素是處理 timerlat 喚醒的 IRQ 處理程式 所遭受的延遲:65.52%。這可能是由當前執行緒遮蔽中斷引起的,這可以在阻塞執行緒的堆疊跟蹤中看到:當前執行緒 (objtool:49256) 在 mem cgroup 內部透過 raw spin lock 操作停用了中斷,同時在 btrfs 檔案系統中執行寫系統呼叫。
原始跟蹤儲存到 timerlat_trace.txt 檔案中以供進一步分析。
請注意,rtla timerlat 在排程時沒有更改 timerlat 跟蹤器執行緒的優先順序。這通常不是必需的,因為這些執行緒預設具有 FIFO:95 的優先順序,這是即時核心開發人員用於分析排程延遲的常用優先順序。
另請參閱¶
rtla-timerlat(1), rtla-timerlat-hist(1)
timerlat 跟蹤器文件:<https://kernel.linux.club.tw/doc/html/latest/trace/timerlat-tracer.html>
報告錯誤¶
向 <linux-kernel@vger.kernel.org> 和 <linux-trace-devel@vger.kernel.org> 報告錯誤
許可證¶
rtla 是根據 GNU GPLv2 許可的自由軟體
版權¶
版權所有 (C) 2021 Red Hat, Inc. 依據 GNU 通用公共許可證 (GPL) 的條款,授予本軟體的自由使用權。