hwlat_detector
是一种特殊的跟踪器,用于检测由某些底层硬件或者固件的行为引起的大型系统延迟。并且这个跟踪器数据不依赖于Linux系统。
Linux内核中的这段代码起初是为了检测x86架构上的SMIs(System Management Interrupts 系统管理中断)问题,最初是为了"RT(Real Time)"补丁编写,因为实时(RT)内核对延迟非常敏感。
上面提到hwlat_detector
的数据不依赖于Linux系统,是由于SMIs不由Linux内核提供服务,这意味着它(SMIs)甚至不知道它们正在发生什么。SMIs的服务由BIOS代码设置并提供服务,通常用于关键事件,例如热传感器和风扇的管理。有时候SMI用于其他任务,这些任务在处理过程中会花费过多的时间(有时会到毫秒级别),如果试图将SMI延迟保持在微妙级别,那这就是一个问题了(可以考虑BIOS调优或者更换硬件)。
hwlat_detector
工作原理是占用一个CPU的可配置时间量(禁用中断),轮询CPU时间戳计数器一段时间,然后查找"TSC"数据中的间隙。任何间隙都表示轮询被中断的时间,并且由于中断被禁用,唯一可以影响的就是SMI或者硬件hiccup(例如NMI,但是能够被追踪)。
使用:
enalbe: # echo hwlat > /sys/kernel/tracing/current_tracer
接口目录/sys/kernel/tracing/hwlat_detector/
中包含2个参数width
和window
- width (usec): default 500,000 (0.5秒)
- window (usec): default 1,000,000 (1秒)
默认值表示每1秒,hwlat探测器将回旋0.5秒。如果tracing_thresh
为0时,则它将更改为默认值10 usec。如果观察到任何超过阀值的延迟,则将数据写入跟踪缓存区tracing ring buffer
。
这里有个特殊设置,当tracing_thresh
为0时,如果这时加载了另外一个追踪器,则会将值设置回0。hwlat_detector
会保存tracing_thresh
最后的一个值,在hwlat_detector
再次加载时,如果thresh仍然为0,则恢复tracing_thresh
的值。
下面的tracing目录/文件将会用于hwlat_detector
: (/sys/kernel/tracing/)
- tracing_thresh: 要考虑的最小延迟值(单位:微妙)
- tracing_max_latency: 实际观察到的最大延迟值(单位:微妙)
- tracing_cpumask: 移动hwlat线程的CPU
- hwlat_detector/width: 在一个运行窗口内回旋的时间量(单位:微妙)
- hwlat_detector/window: 一个运行窗口的时间量 (单位:微妙)
- hwlat_detector/mode: 运行线程的模式 (v5.x开始的新参数)
默认情况下,一个hwlat检测器的内核线程在新窗口开始时以循环的方式在cpumask指定的CPU之间迁移,可以通过修改mode值来修改运行方式:
- none: 不强制迁移
- round-robin: 默认方式,跨cpumask中指定的每个CPU迁移
- per-cpu: 为tracing_cpumask中的每个CPU创建一个线程
Note:请不要在生产环境中使用hwlat检测器。它的目的就是手动运行以确定硬件平台是否存在系统固件服务的延迟问题。
所有数据来源: Linux Tracing Technologies