软中断与 ksoftirqd
网络与块设备的收尾工作在软中断中完成。压力不大时,软中断在中断返回路径上就地处理;压力大时交给每核一个的 ksoftirqd 内核线程接手。因此某核 si 偏高或 ksoftirqd 占用上升,通常意味着该核承担了过多软中断工作,常见原因是中断集中在少数核、包处理量过大或单核收包。软中断类型分布可从 /proc/softirqs 查看,其中 NET_RX 与 BLOCK 最常被关注。
基本信息
| 累计计数 | /proc/softirqs,按类型与 CPU 分列 |
|---|---|
| 内核线程 | ksoftirqd/N,每个 CPU 一个 |
| 视图 | mpstat 的 %soft、top 的 si |
| 相关参数 | netdev_budget 系列、RPS 设置 |
| 判读方式 | 两次采样比较增量 |
典型使用场景
- 单核 si 偏高而其他核空闲
- 网络收包能力受限
- 存储中断处理占用偏高
- 排查 ksoftirqd 线程 CPU 占用上升
- 收包优化(RPS、中断亲和)前后验证效果
查看增量与线程
查看增量与线程
cat /proc/softirqs # 各类软中断的每核累计计数
sleep 5; cat /proc/softirqs # 再采样一次比较增量
ps -eo pid,psr,pcpu,comm | grep ksoftirq
mpstat -P ALL 1 3 # 看 %soft 的核间分布
top -b -n1 | head -20
cat /proc/interrupts | head -10 # 硬件中断分布对照数据源读法
| 数据源 | 含义 | 判读 |
|---|---|---|
| /proc/softirqs | 按类型与 CPU 的累计处理次数 | 累计值,必须看增量 |
| mpstat 的 %soft | 软中断占用比例 | 单核显著高于其他核即为热点 |
| top 的 si | 整体软中断占用 | 粒度比 %soft 粗 |
| ksoftirqd/N | 每核对应的处理线程 | 占用上升说明该核压力大 |
/proc/softirqs 是累计值,判断当前压力必须比较两次采样的差值,单次读数看不出问题。
软中断热点应优先从网络中断亲和与 RPS 入手,把处理分散开,而不是调高内核线程的优先级。
分散软中断压力的手段
- 中断亲和:把网卡各队列的中断分散到不同的核
- RPS 与 RFS:在软件层把收包处理分发到更多核
- 提高软中断预算前先确认 dropped 与 time_squeeze 确实在增长
- 核对网卡队列数与核数是否匹配,避免大量队列挤在少数核上
判断 si 是否异常需要基线:同样的占用比例在 4 核与 64 核机器上含义完全不同,应结合核数与业务吞吐一起看。