硬件延迟检测器¶
简介¶
跟踪器 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 毫秒,也要允许系统不完全饿死。
如果启动 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 创建一个线程