【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的延迟,记录调度延迟的时间。

➡️

继续阅读