What Makes System Calls Expensive: A Linux Internals Deep Dive
8 months ago
- #Linux
- #Performance
- #System Calls
- Linux系统调用的开销很大,这包括直接和间接的开销。
- 直接开销包括内核入口/出口路径,涉及页表切换、堆栈切换以及寄存器保存/恢复。
- 间接开销来自微架构层面的副作用,如流水线清空、分支预测状态丢失以及推测执行缓解措施。
- vDSO(虚拟动态共享对象)为某些系统调用提供了用户空间的快捷方式,避免了内核入口开销。
- 基准测试表明,基于vDSO的调用(如clock_gettime)比传统系统调用快得多。
- 系统调用会破坏CPU优化,如指令流水线和分支预测,导致性能下降。
- 针对推测执行攻击(如Spectre、Retbleed)的缓解措施通过清除分支历史和返回栈缓冲区增加了开销。
- 减少系统调用的实用策略包括使用vDSO、缓存值、批量I/O操作(如io_uring)以及利用eBPF进行内核端处理。
- 系统调用的真实成本不仅限于内核执行时间,还包括CPU状态恢复和优化重建的影响。