硬件延迟检测器

简介

hwlat_detector 追踪器是一种专用追踪器,用于检测由底层硬件或固件行为引起的重大系统延迟,这些延迟与 Linux 本身无关。该代码最初是为了检测 x86 系统上的 SMI(系统管理中断)而开发的,但该补丁集并不仅限于 x86。它最初是为“RT”补丁编写的,因为实时(Real Time)内核对延迟高度敏感。

SMI 不由 Linux 内核处理,这意味着内核甚至不知道它们正在发生。SMI 由 BIOS 代码设置并由 BIOS 代码处理,通常用于“关键”事件,例如管理热传感器和风扇。但有时,SMI 会被用于其他任务,而这些任务在处理程序中可能会花费过多的时间(有时以毫秒计)。显然,如果您试图将事件服务延迟保持在微秒范围内,这是一个问题。

硬件延迟检测器的工作原理是占用其中一个 CPU 可配置的时间(同时禁用中断),在一段时间内轮询 CPU 时间戳计数器(TSC),然后查找 TSC 数据中的间隙。任何间隙都表明轮询被中断,由于中断已被禁用,唯一能做到这一点的是 SMI 或其他硬件故障(或者是 NMI,但这些是可以追踪的)。

注意:hwlat 检测器绝不应用于生产环境。它旨在手动运行,以确定硬件平台是否存在固件服务例程过长的问题。

用法

将 ASCII 文本“hwlat”写入追踪系统的 current_tracer 文件(挂载在 /sys/kernel/tracing 或 /sys/kernel/tracing)。可以重新定义阈值(以微秒为单位),超过该阈值的延迟尖峰将被纳入考虑范围。

示例

# echo hwlat > /sys/kernel/tracing/current_tracer
# echo 100 > /sys/kernel/tracing/tracing_thresh

/sys/kernel/tracing/hwlat_detector 接口包含以下文件

  • width - 保持 CPU 时的采样时间段(微秒)

    必须小于总窗口大小(强制执行)

  • window - 采样总周期,width 包含在其中(微秒)

默认情况下,width 设置为 500,000,window 设置为 1,000,000,这意味着每 1,000,000 微秒(1秒),hwlat 检测器将循环运行 500,000 微秒(0.5秒)。如果启用 hwlat 追踪器时 tracing_thresh 为零,它将更改为默认值 10 微秒。如果观察到任何超过阈值的延迟,数据将被写入追踪环形缓冲区。

周期之间的最短睡眠时间为 1 毫秒。即使 width 与 window 之间的差值小于 1 毫秒,也要保证系统不会完全被饿死。

如果 hwlat 检测器启动时 tracing_thresh 为零,则在加载另一个追踪器时它将被设置回零。注意,hwlat 检测器之前在 tracing_thresh 中的最后一个值将被保存;如果再次启动 hwlat 检测器时该值仍为零,则该值将被恢复到 tracing_thresh 中。

hwlat_detector 使用以下追踪目录文件

位于 /sys/kernel/tracing 下

  • tracing_threshold - 需考虑的最小延迟值(微秒)

  • tracing_max_latency - 实际观察到的最大硬件延迟(微秒)

  • tracing_cpumask - hwlat 线程移动所覆盖的 CPU

  • hwlat_detector/width - 在窗口内循环的指定时间量(微秒)

  • hwlat_detector/window - (width) 运行之间的时间量(微秒)

  • hwlat_detector/mode - 线程模式

默认情况下,在一个新窗口开始时,一个 hwlat 检测器的内核线程将以轮询方式在 cpumask 指定的每个 CPU 之间迁移。可以通过更改线程模式来改变此行为,可用选项为:

  • none:不强制迁移

  • round-robin:在 cpumask 指定的每个 CPU 之间迁移 [默认]

  • per-cpu:为 tracing_cpumask 中的每个 cpu 创建一个线程