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 和以纳秒为单位的 runtimeperiod

-C, --cgroup[=cgroup]

为追踪器的线程设置一个 cgroup。如果传递不带参数的 -C 选项,则追踪器的线程将继承 rtlacgroup。否则,线程将放置在传递给该选项的 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>

作者

由 Daniel Bristot de Oliveira <bristot@kernel.org> 编写

报告错误

将错误报告给 <linux-kernel@vger.kernel.org> 和 <linux-trace-devel@vger.kernel.org>

许可证

rtla 是在 GNU GPLv2 下许可的自由软件

复制

版权所有 (C) 2021 Red Hat, Inc.。在 GNU 公共许可证 (GPL) 的条款下授予此软件的免费使用权。