rtla-timerlat-top¶
测量操作系统定时器延迟¶
- 手册章节:
1
概要¶
rtla timerlat top [选项] ...
描述¶
rtla timerlat 工具是 timerlat 追踪器的接口。timerlat 追踪器为每个 CPU 分派一个内核线程。这些线程设置一个定期定时器来唤醒自己并返回睡眠状态。唤醒后,它们会收集并生成有用的信息,用于调试操作系统定时器延迟。
timerlat 追踪器以两种方式输出信息。它会定期打印定时器 IRQ 处理程序和 Thread 处理程序的定时器延迟。它还通过 osnoise: 跟踪点启用最相关信息的跟踪。
rtla timerlat top 显示来自 timerlat 追踪器的定期输出的摘要。它还通过 osnoise: 跟踪点提供每个操作系统噪声的信息,可以使用 -T 选项查看。
选项¶
-a, --auto us
设置自动跟踪模式。此模式在调试系统时设置一些常用选项。它等效于使用 -T us -s us -t。默认情况下,timerlat 追踪器对 timerlat 线程使用 FIFO:95,因此等效于 -P f:95。
-p, --period us
以微秒为单位设置 timerlat 追踪器的周期。
-i, --irq us
如果 IRQ 延迟高于参数中的 us,则停止跟踪。
-T, --thread us
如果 Thread 延迟高于参数中的 us,则停止跟踪。
-s, --stack us
如果 Thread 延迟高于参数中的 us,则在 IRQ 处保存堆栈跟踪。
-t, --trace [文件]
将停止的跟踪保存到 [文件|timerlat_trace.txt]。
- --dma-latency us
将 /dev/cpu_dma_latency 设置为 us,旨在限制从空闲状态退出的延迟。cyclictest 默认将此值设置为 0,使用 --dma-latency 0 以获得类似的结果。
- --deepest-idle-state n
禁用运行 timerlat 线程的 CPU 高于 n 的空闲状态,以减少从空闲状态退出的延迟。如果 n 为 -1,则禁用所有空闲状态。从 timerlat 退出时,空闲状态设置将恢复为运行 timerlat 之前的原始状态。
需要使用 libcpupower 构建 rtla。
-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-list
设置 osnoise 跟踪器以在 cpu-list 中运行示例线程。
-H, --house-keeping cpu-list
仅在给定的 cpu-list 上运行 rtla 控制线程。
-d, --duration 时间[s|m|h|d]
设置会话的持续时间。
-D, --debug
打印调试信息。
-e, --event sys:event
在跟踪 (-t) 会话中启用事件。参数可以是特定事件,例如,-e sched:sched_switch,或系统组的所有事件,例如,-e sched。允许使用多个 -e。仅在设置 -t 或 -a 时才激活。
--filter <过滤器>
使用 <过滤器> 过滤先前的 -e sys:event 事件。有关事件过滤的更多信息,请参见 https://linuxkernel.org.cn/doc/html/latest/trace/events.html#event-filtering。
- --trigger <触发器>
为先前的 -e sys:event 启用跟踪事件触发器。如果激活了 hist: 触发器,则输出直方图将自动保存到名为 system_event_hist.txt 的文件中。例如,命令
rtla <命令> <模式> -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://linuxkernel.org.cn/doc/html/latest/trace/events.html#event-triggers。
-P, --priority o:prio|r:prio|f:prio|d:runtime:period
设置 osnoise 追踪器线程的调度参数,设置优先级的格式为
o:prio - 使用 SCHED_OTHER 和 prio;
r:prio - 使用 SCHED_RR 和 prio;
f:prio - 使用 SCHED_FIFO 和 prio;
d:runtime[us|ms|s]:period[us|ms|s] - 使用 SCHED_DEADLINE 和以纳秒为单位的 runtime 和 period。
-C, --cgroup[=cgroup]
为追踪器的线程设置一个 cgroup。如果传递不带参数的 -C 选项,则追踪器的线程将继承 rtla 的 cgroup。否则,线程将放置在传递给该选项的 cgroup 上。
--warm-up s
在启动工作负载后,让其运行 s 秒,然后再开始收集数据,以使系统预热。在预热期间生成的统计数据将被丢弃。
- --trace-buffer-size kB
为跟踪输出设置每个 CPU 的跟踪缓冲区大小(以 kB 为单位)。
-h, --help
打印帮助菜单。
--dump-tasks
如果满足停止条件,则打印在所有 CPU 上运行的任务(取决于 !--no-aa)
--no-aa
禁用自动分析,从而减少 rtla timerlat 的 CPU 使用率
--aa-only us
设置停止跟踪条件,并在不收集和显示统计信息的情况下运行。如果系统达到停止跟踪条件,则打印自动分析。此选项有助于减少 rtla timerlat 的 CPU 使用率,从而可以在不收集统计信息开销的情况下进行调试。
示例¶
在下面的示例中,timerlat 跟踪器以自动跟踪模式在 cpu 1-23 中分派,指示跟踪器在发现 40 us 或更高的延迟时停止
# 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) 在内存 cgroup 内通过 原始自旋锁 操作禁用了中断,同时在 btrfs 文件系统中进行写系统调用。
原始跟踪保存在 timerlat_trace.txt 文件中以进行进一步分析。
请注意,分派 rtla timerlat 时没有更改 timerlat 跟踪器线程的优先级。通常不需要这样做,因为这些线程默认具有优先级 FIFO:95,这是实时内核开发人员用来分析调度延迟的常用优先级。
另请参阅¶
rtla-timerlat(1), rtla-timerlat-hist(1)
timerlat 追踪器文档:<https://linuxkernel.org.cn/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) 的条款下授予此软件的免费使用权。