硬件延迟检测器¶
简介¶
追踪器 hwlat_detector 是一个特殊用途的追踪器,用于检测由某些底层硬件或固件的行为引起的、独立于 Linux 本身的大系统延迟。该代码最初开发用于检测 x86 系统上的 SMI (系统管理中断),但此补丁集没有任何 x86 特定的东西。它最初是为“RT”补丁而编写的,因为实时内核对延迟高度敏感。
SMI 不由 Linux 内核处理,这意味着它甚至不知道它们正在发生。 SMI 由 BIOS 代码设置,并由 BIOS 代码处理,通常用于“关键”事件,例如热传感器和风扇的管理。 但有时,SMI 用于其他任务,这些任务可能会在处理程序中花费过多的时间(有时以毫秒为单位测量)。 显然,如果您尝试将事件服务延迟保持在微秒范围内,这是一个问题。
硬件延迟检测器的工作原理是:将一个 CPU 占用可配置的时间量(禁用中断),轮询 CPU 时间戳计数器一段时间,然后查找 TSC 数据中的间隙。 任何间隙都表明轮询被中断的时间,并且由于中断被禁用,唯一可以做到这一点的是 SMI 或其他硬件故障(或 NMI,但可以跟踪这些故障)。
请注意,hwlat 检测器*绝对不应*在生产环境中使用。 它旨在手动运行,以确定硬件平台是否存在系统固件服务例程过长的问题。
用法¶
将 ASCII 文本“hwlat”写入追踪系统的 current_tracer 文件(挂载在 /sys/kernel/tracing 或 /sys/kernel/tracing)。 可以重新定义阈值,以微秒 (us) 为单位,高于该阈值的延迟峰值将被考虑在内。
示例
# 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 小于 1 毫秒(与 window 相比),也要允许系统不完全匮乏。
如果启动 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 - 指定在 window 内自旋的时间量(微秒)
hwlat_detector/window - (width) 运行之间的时间量(微秒)
hwlat_detector/mode - 线程模式
默认情况下,一个 hwlat 检测器的内核线程将在新 window 开始时,以循环方式跨越 cpumask 中指定的每个 CPU。 可以通过更改线程模式来更改此行为,可用选项为
none:不强制迁移
round-robin:跨越 cpumask 中指定的每个 CPU 迁移 [默认]
per-cpu:为 tracing_cpumask 中的每个 cpu 创建一个线程