@@ -30,102 +30,84 @@ OPTIONS
3030
3131.. include :: common_options.rst
3232
33+ .. include :: common_timerlat_aa.rst
34+
3335EXAMPLE
3436=======
3537
36- In the example below, the *timerlat * tracer is set to capture the stack trace at
37- the IRQ handler, printing it to the buffer if the *Thread * timer latency is
38- higher than *30 us *. It is also set to stop the session if a *Thread * timer
39- latency higher than *30 us * is hit. Finally, it is set to save the trace
40- buffer if the stop condition is hit::
38+ In the example below, the timerlat tracer is dispatched in cpus *1-23 * in the
39+ automatic trace mode, instructing the tracer to stop if a *40 us * latency or
40+ higher is found::
4141
42- [root@alien ~]# rtla timerlat top -s 30 -T 30 -t
43- Timer Latency
44- 0 00:00:59 | IRQ Timer Latency (us) | Thread Timer Latency (us)
42+ # timerlat -a 40 -c 1-23 -q
43+ Timer Latency
44+ 0 00:00:12 | IRQ Timer Latency (us) | Thread Timer Latency (us)
4545 CPU COUNT | cur min avg max | cur min avg max
46- 0 #58634 | 1 0 1 10 | 11 2 10 23
47- 1 #58634 | 1 0 1 9 | 12 2 9 23
48- 2 #58634 | 0 0 1 11 | 10 2 9 23
49- 3 #58634 | 1 0 1 11 | 11 2 9 24
50- 4 #58634 | 1 0 1 10 | 11 2 9 26
51- 5 #58634 | 1 0 1 8 | 10 2 9 25
52- 6 #58634 | 12 0 1 12 | 30 2 10 30 <--- CPU with spike
53- 7 #58634 | 1 0 1 9 | 11 2 9 23
54- 8 #58633 | 1 0 1 9 | 11 2 9 26
55- 9 #58633 | 1 0 1 9 | 10 2 9 26
56- 10 #58633 | 1 0 1 13 | 11 2 9 28
57- 11 #58633 | 1 0 1 13 | 12 2 9 24
58- 12 #58633 | 1 0 1 8 | 10 2 9 23
59- 13 #58633 | 1 0 1 10 | 10 2 9 22
60- 14 #58633 | 1 0 1 18 | 12 2 9 27
61- 15 #58633 | 1 0 1 10 | 11 2 9 28
62- 16 #58633 | 0 0 1 11 | 7 2 9 26
63- 17 #58633 | 1 0 1 13 | 10 2 9 24
64- 18 #58633 | 1 0 1 9 | 13 2 9 22
65- 19 #58633 | 1 0 1 10 | 11 2 9 23
66- 20 #58633 | 1 0 1 12 | 11 2 9 28
67- 21 #58633 | 1 0 1 14 | 11 2 9 24
68- 22 #58633 | 1 0 1 8 | 11 2 9 22
69- 23 #58633 | 1 0 1 10 | 11 2 9 27
70- timerlat hit stop tracing
71- saving trace to timerlat_trace.txt
72- [root@alien bristot]# tail -60 timerlat_trace.txt
73- [...]
74- timerlat/5-79755 [005] ....... 426.271226: #58634 context thread timer_latency 10823 ns
75- sh-109404 [006] dnLh213 426.271247: #58634 context irq timer_latency 12505 ns
76- sh-109404 [006] dNLh313 426.271258: irq_noise: local_timer:236 start 426.271245463 duration 12553 ns
77- sh-109404 [006] d...313 426.271263: thread_noise: sh:109404 start 426.271245853 duration 4769 ns
78- timerlat/6-79756 [006] ....... 426.271264: #58634 context thread timer_latency 30328 ns
79- timerlat/6-79756 [006] ....1.. 426.271265: <stack trace>
80- => timerlat_irq
81- => __hrtimer_run_queues
82- => hrtimer_interrupt
83- => __sysvec_apic_timer_interrupt
84- => sysvec_apic_timer_interrupt
85- => asm_sysvec_apic_timer_interrupt
86- => _raw_spin_unlock_irqrestore <---- spinlock that disabled interrupt.
87- => try_to_wake_up
88- => autoremove_wake_function
89- => __wake_up_common
90- => __wake_up_common_lock
91- => ep_poll_callback
92- => __wake_up_common
93- => __wake_up_common_lock
94- => fsnotify_add_event
95- => inotify_handle_inode_event
96- => fsnotify
97- => __fsnotify_parent
98- => __fput
99- => task_work_run
100- => exit_to_user_mode_prepare
101- => syscall_exit_to_user_mode
102- => do_syscall_64
103- => entry_SYSCALL_64_after_hwframe
104- => 0x7265000001378c
105- => 0x10000cea7
106- => 0x25a00000204a
107- => 0x12e302d00000000
108- => 0x19b51010901b6
109- => 0x283ce00726500
110- => 0x61ea308872
111- => 0x00000fe3
112- bash-109109 [007] d..h... 426.271265: #58634 context irq timer_latency 1211 ns
113- timerlat/6-79756 [006] ....... 426.271267: timerlat_main: stop tracing hit on cpu 6
114-
115- In the trace, it is possible the notice that the *IRQ * timer latency was
116- already high, accounting *12505 ns *. The IRQ delay was caused by the
117- *bash-109109 * process that disabled IRQs in the wake-up path
118- (*_try_to_wake_up() * function). The duration of the IRQ handler that woke
119- up the timerlat thread, informed with the **osnoise:irq_noise ** event, was
120- also high and added more *12553 ns * to the Thread latency. Finally, the
121- **osnoise:thread_noise ** added by the currently running thread (including
122- the scheduling overhead) added more *4769 ns *. Summing up these values,
123- the *Thread * timer latency accounted for *30328 ns *.
124-
125- The primary reason for this high value is the wake-up path that was hit
126- twice during this case: when the *bash-109109 * was waking up a thread
127- and then when the *timerlat * thread was awakened. This information can
128- then be used as the starting point of a more fine-grained analysis.
46+ 1 #12322 | 0 0 1 15 | 10 3 9 31
47+ 2 #12322 | 3 0 1 12 | 10 3 9 23
48+ 3 #12322 | 1 0 1 21 | 8 2 8 34
49+ 4 #12322 | 1 0 1 17 | 10 2 11 33
50+ 5 #12322 | 0 0 1 12 | 8 3 8 25
51+ 6 #12322 | 1 0 1 14 | 16 3 11 35
52+ 7 #12322 | 0 0 1 14 | 9 2 8 29
53+ 8 #12322 | 1 0 1 22 | 9 3 9 34
54+ 9 #12322 | 0 0 1 14 | 8 2 8 24
55+ 10 #12322 | 1 0 0 12 | 9 3 8 24
56+ 11 #12322 | 0 0 0 15 | 6 2 7 29
57+ 12 #12321 | 1 0 0 13 | 5 3 8 23
58+ 13 #12319 | 0 0 1 14 | 9 3 9 26
59+ 14 #12321 | 1 0 0 13 | 6 2 8 24
60+ 15 #12321 | 1 0 1 15 | 12 3 11 27
61+ 16 #12318 | 0 0 1 13 | 7 3 10 24
62+ 17 #12319 | 0 0 1 13 | 11 3 9 25
63+ 18 #12318 | 0 0 0 12 | 8 2 8 20
64+ 19 #12319 | 0 0 1 18 | 10 2 9 28
65+ 20 #12317 | 0 0 0 20 | 9 3 8 34
66+ 21 #12318 | 0 0 0 13 | 8 3 8 28
67+ 22 #12319 | 0 0 1 11 | 8 3 10 22
68+ 23 #12320 | 28 0 1 28 | 41 3 11 41
69+ rtla timerlat hit stop tracing
70+ ## CPU 23 hit stop tracing, analyzing it ##
71+ IRQ handler delay: 27.49 us (65.52 %)
72+ IRQ latency: 28.13 us
73+ Timerlat IRQ duration: 9.59 us (22.85 %)
74+ Blocking thread: 3.79 us (9.03 %)
75+ objtool:49256 3.79 us
76+ Blocking thread stacktrace
77+ -> timerlat_irq
78+ -> __hrtimer_run_queues
79+ -> hrtimer_interrupt
80+ -> __sysvec_apic_timer_interrupt
81+ -> sysvec_apic_timer_interrupt
82+ -> asm_sysvec_apic_timer_interrupt
83+ -> _raw_spin_unlock_irqrestore
84+ -> cgroup_rstat_flush_locked
85+ -> cgroup_rstat_flush_irqsafe
86+ -> mem_cgroup_flush_stats
87+ -> mem_cgroup_wb_stats
88+ -> balance_dirty_pages
89+ -> balance_dirty_pages_ratelimited_flags
90+ -> btrfs_buffered_write
91+ -> btrfs_do_write_iter
92+ -> vfs_write
93+ -> __x64_sys_pwrite64
94+ -> do_syscall_64
95+ -> entry_SYSCALL_64_after_hwframe
96+ ------------------------------------------------------------------------
97+ Thread latency: 41.96 us (100%)
98+
99+ The system has exit from idle latency!
100+ Max timerlat IRQ latency from idle: 17.48 us in cpu 4
101+ Saving trace to timerlat_trace.txt
102+
103+ In this case, the major factor was the delay suffered by the *IRQ handler *
104+ that handles **timerlat ** wakeup: *65.52% *. This can be caused by the
105+ current thread masking interrupts, which can be seen in the blocking
106+ thread stacktrace: the current thread (*objtool:49256 *) disabled interrupts
107+ via *raw spin lock * operations inside mem cgroup, while doing write
108+ syscall in a btrfs file system.
109+
110+ The raw trace is saved in the **timerlat_trace.txt ** file for further analysis.
129111
130112Note that **rtla timerlat ** was dispatched without changing *timerlat * tracer
131113threads' priority. That is generally not needed because these threads hava
0 commit comments