1. 课程导入与性能问题定位
VxWorks 作为典型的硬实时操作系统,其性能问题往往不是“慢一点”那么简单:一个任务抖动 200 μs,可能就让运动控制环失稳;一次中断延迟超标,可能直接导致数据采集丢帧。因此,本课程讨论的“性能追踪与调优”,目标不是把平均指标做得好看,而是在确定的时限内,让关键路径的响应时间、抖动和资源占用可预测、可复现、可验证。换句话说,调优的终点是“确定性”,而不是“平均值”。
要达成这个目标,先要建立一套可操作的定位思路。VxWorks 的性能问题大致可以归为四类,它们的现象、根因和排查入口差别很大,混在一起看很容易走错方向。
- 时序类问题:任务周期抖动大、中断到任务唤醒的延迟超标、信号量争用导致优先级反转。典型现象是“偶发超时”,用平均耗时看不出来,必须看最坏值和分布。
- 吞吐类问题:CPU 长期高占用、消息队列积压、网络或存储带宽打满。这类问题通常有持续的高负载特征,容易观测但难定位到具体任务。
- 资源类问题:内存碎片、内存池耗尽、文件描述符或信号量泄漏、栈溢出。它们往往在系统运行数小时或数天后才暴露,属于“慢性病”。
- 配置与集成类问题:优先级分配不合理、tick 频率与任务周期不匹配、缓存与内存布局冲突、驱动中断处理过长。这类问题在集成阶段集中出现,改配置往往比改代码更有效。
这四类问题对应的观测手段并不相同。时序类要看时间戳和直方图,吞吐类要看占用率和队列深度,资源类要看池水位和碎片统计,配置类则要对照设计意图检查实际参数。因此,调优工作流的第一步不是“打开工具”,而是先把问题归到某一类,再选择能观测该类特征的入口。
下面这张图给出了从问题现象到工具入口、再到验证判据的定位路径。它把四类问题与 VxWorks 常用的观测手段对应起来,便于在实际项目中快速选择切入点。
有了定位路径,还需要一套工具链来支撑采集与验证。VxWorks 自带的观测能力大致分三层:系统级用 spy 查看任务占用率、用 memPartShow 查看内存分区状态;任务级用 taskHook 挂接任务切换钩子,记录每次切换的时间戳,从而算出任务的实际执行时间和等待时间;事件级则依赖高精度计时器和自定义埋点,在中断入口、信号量获取、消息发送等关键位置打时间戳。三层工具不是替代关系,而是从粗到细逐层下钻。
举个具体的教学示例。假设某运动控制任务要求 1 ms 周期、抖动不超过 50 μs,实测发现偶发超时。按上面的路径,先归为时序类,用 taskHook 记录该任务每次被调度的时间戳,计算相邻两次执行起点的差值。若发现差值在 1 ms 附近波动,但偶尔跳到 1.3 ms,说明任务被更高优先级任务或中断抢占。此时再检查中断服务程序时长和优先级分配,往往能找到根因。这里的关键是:先量化抖动,再定位抢占源,而不是凭经验直接改优先级。