linux时间抖动,实时 Linux 抖动分析 Step by step

前段时间有同窗问到:工具

你们有显卡方面实时性调优经验交流吗?我如今是 x86,不加显示任务实时性能够保持在 20us 内,若是加上显示,抖动就飙升到 70us,其实显示是辅助功能。性能

其实形成抖动的缘由已经清楚了,可是要解决问题还得定位到具体的代码,究竟是哪段代码形成了这么大的抖动呢?优化

从问题自己来看,这个应该是可复现的,因此接下来就是要解决它。spa

解决这类问题一般是用专属工具 Ftrace 的 Max Latency Tracing,大致用法可参考 Documentation/trace/ftrace.rst。线程

大致分析过程以下:debug

使用抢占内核或者 preempt-rt 内核

若是用普通内核,请在内核 General setup 下 preemption model 开启 low-latency desktop。调试

CONFIG_PREEMPT=y

复制代码

从问题来看,应该是已经用上了实时抢占内核,这时须要打开以下配置:日志

CONFIG_PREEMPT_RT_FULL=y

复制代码

若是没有使用,得参考 实时 Linux 一文从 发布地址 找到相应版本的 patch 打上,并针对所用板子作进一步优化,并且要关闭不少可能影响实时性能的调试选项。code

配置内核,打开中断和抢占关闭等 tracer

在内核配置 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值