【Linux 网络子系统深度拆解】软中断与 ksoftirqd:网络包处理的调度引擎
💡
原文中文,约17300字,阅读约需42分钟。
📝
内容提要
本文探讨了Linux内核中的软中断机制,重点分析了网络数据包的处理。软中断是一种不可抢占的延迟执行机制,主要用于网络和块设备。文章讨论了软中断的调度、执行路径及其与ksoftirqd线程的关系,并指出在高负载情况下可能出现的延迟问题。通过引入Threaded NAPI和PREEMPT_RT内核,改善了网络处理的实时性和调度公平性,并提供了在高PPS场景下的性能调优建议。
🎯
关键要点
- 软中断是一种不可抢占的延迟执行机制,主要用于网络和块设备。
- 软中断的调度机制包括硬中断返回路径、local_bh_enable() 返回和 ksoftirqd 线程。
- ksoftirqd 线程以 SCHED_NORMAL 优先级运行,调度延迟是尾延迟的主要来源。
- Threaded NAPI 为每个 NAPI 实例创建独立的内核线程,改善了调度公平性和实时性。
- CONFIG_PREEMPT_RT 内核将所有 softirq 转为内核线程执行,适用于对延迟敏感的场景。
- time_squeeze 是关键指标,反映 CPU 处理网络包的能力,持续增长意味着 CPU 算力不足。
❓
延伸问答
什么是软中断,它的主要用途是什么?
软中断是一种不可抢占的延迟执行机制,主要用于网络和块设备的处理。
ksoftirqd线程的作用是什么?
ksoftirqd线程用于处理软中断的调度,作为兜底机制,确保在高负载情况下软中断能够被执行。
Threaded NAPI与传统软中断有什么区别?
Threaded NAPI为每个NAPI实例创建独立的内核线程,改善了调度公平性和实时性,而传统软中断是全局的,所有网卡共享同一个NET_RX_SOFTIRQ。
在高PPS场景下,如何优化网络处理性能?
可以通过增大netdev_budget、分散中断到更多CPU或启用busy polling来优化网络处理性能。
time_squeeze指标的意义是什么?
time_squeeze是一个关键指标,反映CPU处理网络包的能力,持续增长意味着CPU算力不足。
如何测量ksoftirqd的调度延迟?
可以使用bpftrace工具追踪ksoftirqd从唤醒到上CPU的延迟,记录调度延迟的时间。
➡️