1. 课程导入

在嵌入式与服务器领域,Linux 驱动的性能往往决定了整个系统的吞吐、时延与功耗表现。很多工程师能写出“能跑”的驱动,却难以写出“跑得快、跑得稳”的驱动。本课程的目标,就是帮助你把驱动开发从“功能正确”推进到“性能可控”,建立一套可测量、可分析、可优化的工程方法。

一、学习目标:从功能实现到性能工程

本课程围绕四个层次展开能力建设。第一层是可观测:能定位驱动在 CPU、内存、I/O、中断、锁竞争上的真实开销。第二层是可分析:能区分瓶颈属于算法、数据结构、并发模型还是硬件交互。第三层是可优化:掌握零拷贝、批处理、NAPI、DMA、无锁化、缓存友好等典型手段。第四层是可验证:用基准测试与回归对比证明优化有效,而不是凭感觉。

学习完成后,你应当能够回答三个问题:这个驱动的性能瓶颈在哪里?为什么它慢?改动之后是否真的变快了,代价是什么?

二、核心概念:驱动性能的五个关键维度

Linux 驱动性能不是单一指标,而是多个维度相互制约的结果。理解这些维度之间的关系,是后续所有优化的基础。

  • 时延(Latency):一次请求从发起到完成的时间,中断处理、调度延迟、锁等待都会放大它。
  • 吞吐(Throughput):单位时间处理的数据量,受带宽、批处理能力和 CPU 占用影响。
  • CPU 占用:驱动消耗的 CPU 周期,过高的软中断或轮询会挤压应用。
  • 内存与缓存:DMA 一致性、缓存行伪共享、频繁分配释放都会拖慢路径。
  • 并发与锁:自旋锁、互斥锁、RCU 的选择直接决定多核扩展性。

这五个维度常常互相冲突。例如提高吞吐可能增加时延,降低 CPU 占用可能牺牲响应速度。因此优化的本质是在约束下做权衡,而不是追求单点极致。

三、整体知识框架:一条从测量到落地的链路

下图给出本课程的整体知识框架。它把驱动性能优化组织为一条信号链式的路径:从性能指标出发,经过观测工具、瓶颈定位、优化手段,最终回到基准验证,形成闭环。

Linux 驱动性能优化知识框架 性能指标 时延 / 吞吐 / CPU 观测工具 perf / ftrace / bpftrace 瓶颈定位 热点 / 锁 / 中断 优化手段 零拷贝 / NAPI / DMA 实战项目:虚拟字符设备 + 网络收发驱动 从基线测量 → 定位瓶颈 → 逐项优化 → 回归对比 闭环验证:基准测试 → 数据对比 → 代价评估 → 回归防退化 性能优化不是一次性动作,而是持续迭代的工程习惯

框架的核心思想是:先测量,再优化,最后验证。跳过测量直接改代码,往往只是把瓶颈从一个地方搬到另一个地方。

四、实战项目与典型场景

课程配套一个贯穿始终的实战项目:一个虚拟字符设备驱动,逐步扩展为具备中断处理、DMA 传输和并发访问的完整驱动。我们会用真实工具采集数据,例如:

# 采集驱动函数热点
perf record -g -a -- sleep 5
perf report

# 观察中断与软中断分布
cat /proc/interrupts
cat /proc/softirqs

# 跟踪内核函数耗时
ftrace -p function_graph -l my_driver_*

典型场景包括:字符设备在高并发下的锁竞争、网络驱动在高速率下的中断风暴、DMA 缓冲区频繁映射导致的 CPU 开销。每个场景都对应一组可量化的优化前后数据。

五、常见误区与复盘

误区一:只测平均值,不看 P99 时延。平均值好看不代表用户体验好。
误区二:过早优化,在功能未稳定时引入复杂机制,反而增加维护成本。
误区三:忽略代价,用 CPU 换吞吐却不评估功耗与散热。
误区四:没有基线,优化后无法证明收益,也无法防止回归。

下表汇总了本课程将反复使用的性能维度与对应观测手段,建议在学习过程中持续对照。

性能维度关键指标常用观测手段典型优化方向
时延P50 / P99 / 最大延迟ftrace、bpftrace、cyclictest减少锁等待、缩短中断处理
吞吐MB/s、IOPSiperf、fio、自定义基准批处理、NAPI、零拷贝
CPU 占用sys%、softirq%perf top、mpstat降低轮询、合并中断
内存与缓存分配次数、cache missslabtop、perf cache对象池、缓存行对齐
并发扩展多核加速比perf lock、lockstatRCU、无锁队列、分片锁
建议从今天起建立自己的“性能日志”:每次改动记录基线、改动点、测量结果和代价。这个习惯比任何单一技巧都更有价值。

本章建立了课程的整体认知:性能优化是一条从指标到验证的闭环链路,核心概念是时延、吞吐、CPU、内存与并发的权衡,实战项目提供可操作的载体,而误区提醒我们保持工程理性。接下来的章节将沿着这条链路逐层深入,把每个环节变成你手中的具体能力。