本文首次發表於 實時 Linux 抖動分析 Step by steplinux
前段時間有同窗問到:工具
你們有顯卡方面實時性調優經驗交流嗎?我如今是 x86,不加顯示任務實時性能夠保持在 20us 內,若是加上顯示,抖動就飆升到 70us,其實顯示是輔助功能。性能
其實形成抖動的緣由已經清楚了,可是要解決問題還得定位到具體的代碼,究竟是哪段代碼形成了這麼大的抖動呢?優化
從問題自己來看,這個應該是可復現的,因此接下來就是要解決它。spa
解決這類問題一般是用專屬工具 Ftrace 的 Max Latency Tracing,大致用法可參考 Documentation/trace/ftrace.rst
。線程
大致分析過程以下:debug
若是用普通內核,請在內核 General setup
下 preemption model
開啓 low-latency desktop
。調試
CONFIG_PREEMPT=y
複製代碼
從問題來看,應該是已經用上了實時搶佔內核,這時須要打開以下配置:日誌
CONFIG_PREEMPT_RT_FULL=y
複製代碼
若是沒有使用,得參考 實時 Linux 一文從 發佈地址 找到相應版本的 patch 打上,並針對所用板子作進一步優化,並且要關閉不少可能影響實時性能的調試選項。code
在內核配置 Kernel Hacking
下 Tracers
--- Tracers
[*] Kernel Function Tracer
[*] Kernel Function Graph Tracer
[*] Interrupts-off Latency Tracer
[*] Preemption-off Latency Tracer
[*] Scheduling Latency Tracer
[*] Enable upbrobed-based dynamic events
[*] enable/disable function tracing dynamically
複製代碼
先確保能復現問題的場景是一直在跑的,而後就是參考上面 ftrace.rst 用法開始 tracing。
稍微補充幾點小技巧:
sys/kernel/tracing 掛載
默認這個目錄可能沒掛載,
$ mount -t tracefs none /sys/kernel/tracing
複製代碼
早期內核可能用的 /sys/kernel/debugfs/tracing
目錄,須要先掛載 debugfs
以下:
$ mount -t debugfs none /sys/kernel/debugfs
複製代碼
tracers:irqsoff, preemptoff, preemptirqsoff
建議先用第三個,再逐步用第一個和第二個。第三個是兩個的或,若是先用第一個或者第二個,即便解決了發現的問題,也可能不是形成 max latency 的熱點路徑。
開始 tracing 前,清空歷史記錄
啓動新的 tracing
以前,記得清空上次記錄,避免形成誤判,以 irqsoff
爲例:
echo 0 > options/function-trace
echo irqsoff > current_tracer
echo 1 > tracing_on
echo 0 > tracing_max_latency
do something for repeat the issue scene
echo 0 > tracing_on
cat trace > trace.log
複製代碼
最後就是分析日誌和解決問題,緣由不外乎是長時間關了搶佔或者關了中斷,這個就得具體問題具體分析,看狀況是要作中斷線程化仍是主動加調度點等等。
對於 tracing 日誌分析,相似 Android 上的 Systrace
圖形化分析工具,Linux 上有 kernelshark
。