硬體延遲檢測器¶
簡介¶
追蹤器 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 建立一個執行緒