【AI生成】【linux性能】故障处理手册:`ksoftirqd` / `migration` CPU 高

蛋蛋 2026年03月30日 1 0

故障处理手册:ksoftirqd / migration CPU 高

文档信息

  • 文档类型:故障处理 / 性能排障
  • 适用范围:Linux 物理机、虚拟机、容器宿主机
  • 适用对象:运维、SRE、值班工程师、平台工程师
  • 关键词ksoftirqdmigration、softirq、IRQ、CPU 迁移、网络中断、调度

目录


1. 故障定义

当 Linux 服务器出现以下现象之一时,可归类为本类故障:

  • top -Hksoftirqd/N 持续高 CPU
  • top -Hmigration/N 持续高 CPU
  • 某些 CPU 核长期接近 100%
  • 业务出现高延迟、丢包、吞吐下降、连接异常
  • 伴随 %soft%irqcsinsteal 等指标异常

本手册用于处理以下典型问题:

  1. ksoftirqd
  2. migration
  3. 两者同时高
  4. 虚拟机中看似系统忙但根因在宿主争抢

2. 故障现象

2.1 系统现象

常见表现:

  • top -H 中出现:
    • ksoftirqd/0
    • ksoftirqd/1
    • migration/0
    • migration/1
  • mpstat -P ALL 显示:
    • %soft
    • %irq
    • %sys
    • 个别 CPU 特别忙
  • vmstat 显示:
    • in 很高
    • cs 很高
    • r 增大
  • /proc/softirqs 中:
    • NET_RXNET_TXSCHED 快速增长
  • /proc/interrupts 中:
    • 网卡中断集中在少数 CPU

2.2 业务现象

可能表现为:

  • 接口 RT 抖动
  • 吞吐下降
  • 丢包增加
  • 建连慢
  • SYN backlog 堆积
  • TCP 重传增加
  • 短连接服务不稳定
  • 网关 / Nginx / 代理实例 CPU 异常高

3. 影响范围

3.1 直接影响

  • CPU 被内核路径消耗,业务线程可用 CPU 减少
  • 网络包处理延迟增加
  • 调度开销增加
  • 包丢失、建连失败、请求超时

3.2 间接影响

  • SLA 波动
  • 实例被错误判定为应用 CPU 高
  • 容器/Pod 频繁抖动
  • 自动扩缩容误判
  • 集群内热点节点持续恶化

3.3 高风险业务

以下业务更容易受影响:

  • Nginx / Envoy / API 网关
  • 长短连接混合服务
  • 高 PPS 网络业务
  • 安全防护或流量接入层
  • 虚拟化密集部署环境
  • 高并发短连接业务

4. 背景说明

4.1 ksoftirqd 是什么

ksoftirqd/N 是 Linux 每个 CPU 上负责处理软中断的内核线程。

它 CPU 高通常表示:

  • 网络软中断压力大
  • 中断处理不均衡
  • 小包 PPS 高
  • 软中断无法在中断返回路径及时处理

4.2 migration 是什么

migration/N 是 Linux 调度器相关线程,负责任务在 CPU 间迁移和负载均衡。

它 CPU 高通常表示:

  • 任务迁移频繁
  • 调度器负担大
  • CPU 热点明显
  • 线程数多或绑核不合理

4.3 它们与“软中断 / 上下文切换”的关系

  • ksoftirqd 和软中断:强相关,但不是同一个东西
  • migration 和上下文切换:有关联,但不是同一个东西

可简单理解为:

  • ksoftirqd 高 → 往往说明软中断工作多
  • migration 高 → 往往说明任务搬迁和调度工作多

5. 快速判断

目标:在 1~3 分钟内初步判断属于哪一类问题。

5.1 快速命令

top -H -b -n 1 | head -80
mpstat -P ALL 1 3
vmstat 1 5
cat /proc/softirqs
cat /proc/interrupts
ip -s link
ss -s

5.2 快速判断规则

情况 A:ksoftirqd

同时满足以下几项时,优先判断为网络软中断压力:

  • ksoftirqd/N
  • %soft
  • /proc/softirqsNET_RX
  • /proc/interrupts 中网卡中断偏斜
  • ip -s link 显示 PPS 高或 dropped 增加

情况 B:migration

同时满足以下几项时,优先判断为调度迁移压力:

  • migration/N
  • vmstatcs
  • CPU 负载不均衡
  • 线程数很多或绑核复杂
  • 网络软中断不突出

情况 C:两者都高

通常判断为:

  • 网络包处理压力大
  • 局部 CPU 过热
  • 调度器开始频繁迁移任务

情况 D:steal

%stealst 高,优先考虑:

  • 宿主机争抢
  • 云主机资源超卖
  • 虚拟化层面 CPU 不足

6. 标准处理步骤


步骤 1:确认高 CPU 线程类型

top -H -b -n 1 | head -80
ps -eLo pid,ppid,tid,psr,%cpu,comm --sort=-%cpu | head -30

处理目标

  • 判断是 ksoftirqd 高还是 migration
  • 判断是单核热点还是多核普遍高

步骤 2:确认 CPU 构成

mpstat -P ALL 1 5

重点观察

  • %soft
  • %irq
  • %sys
  • %steal
  • 各 CPU 是否均衡

处理判断

  • %soft 高:走网络中断/软中断排查
  • %steal 高:升级排查到虚拟化层
  • 个别 CPU 高:优先看 IRQ 分布和绑核

步骤 3:确认中断和调度压力

vmstat 1 10

重点观察

  • in
  • cs
  • r
  • st

判断

  • in 高:中断压力重
  • cs 高:调度/上下文切换重
  • r 高:CPU 资源竞争
  • st 高:宿主机争抢

步骤 4:确认软中断类型

cat /proc/softirqs
watch -n 1 cat /proc/softirqs

重点观察

  • NET_RX
  • NET_TX
  • SCHED
  • RCU
  • TIMER

判断

  • NET_RX 高:重点排查网卡收包、中断分配、小包流量
  • NET_TX 高:重点排查发送路径
  • SCHED 高:重点排查线程和调度

步骤 5:确认网卡中断是否分布不均

cat /proc/interrupts
grep -iE 'eth|ens|eno|enp|virtio|mlx|bond' /proc/interrupts

判断

  • 中断集中在少数 CPU:优先调整 irqbalance / RSS / IRQ affinity
  • 多队列未均匀分散:优先检查网卡队列配置

步骤 6:确认网络流量与丢包

ip -s link
sar -n DEV 1 5
sar -n EDEV 1 5

判断

  • PPS 高:可能是小包流量导致
  • dropped/errors 高:网卡、队列、CPU、驱动存在瓶颈
  • 接口异常突增:重点关注对应业务或攻击流量

步骤 7:确认连接状态

ss -s
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c
ss -ant state syn-recv | wc -l

判断

  • SYN-RECV 高:怀疑 SYN flood 或建连拥塞
  • TIME-WAIT 多:短连接压力大
  • 连接不多但 PPS 很高:重点怀疑 UDP、小包或扫描流量

步骤 8:确认是否存在绑核/cpuset 问题

taskset -pc <pid>
cat /proc/<pid>/status | egrep 'Cpus_allowed|Mems_allowed'

判断

  • 业务进程被压在少量 CPU
  • IRQ 也压在同样 CPU
  • 容器 CPU 配置过窄

步骤 9:确认是否为虚拟化层问题

top
mpstat -P ALL 1 5
vmstat 1 5

判断

  • %steal 高:宿主机 CPU 争抢
  • 来宾机内部指标不夸张,但现象明显:联系虚拟化/云平台侧排查

7. 常见根因与处理建议

7.1 根因:网络软中断压力过大

典型特征

  • ksoftirqd/N
  • %soft
  • NET_RX 增长快
  • PPS 高
  • 小包场景明显

处理建议

  1. 开启/检查 irqbalance
  2. 检查 RSS 队列数
  3. 必要时启用 RPS
  4. 调整 IRQ affinity
  5. 适度调大 ring buffer
  6. 适度调大 net.core.netdev_max_backlog
  7. 排查攻击流量和异常流量

7.2 根因:中断分布不均

典型特征

  • 只有某几个 ksoftirqd/N
  • /proc/interrupts 中中断集中在少数 CPU
  • 其他 CPU 比较空闲

处理建议

  1. 启动 irqbalance
  2. 检查多队列网卡配置
  3. 调整 RSS
  4. 必要时手工设置 IRQ affinity
  5. 避免 NIC IRQ 都落在 CPU0/CPU1

7.3 根因:任务迁移和调度压力过高

典型特征

  • migration/N
  • cs
  • runnable 多
  • 线程数很多
  • CPU 分布不均

处理建议

  1. 检查线程数与线程池大小
  2. 调整应用绑核
  3. 检查 cpuset/cgroup 配置
  4. 避免业务线程与中断线程抢同一组 CPU
  5. 优化容器 CPU request/limit

7.4 根因:网络与调度叠加

典型特征

  • ksoftirqd/Nmigration/N 同时高
  • NET_RX
  • cs
  • 某些 CPU 热点明显

处理建议

  1. 先处理网卡中断分布问题
  2. 再处理绑核和线程数问题
  3. 最后观察 ksoftirqdmigration 是否同时回落

7.5 根因:虚拟化宿主争抢

典型特征

  • %steal
  • 业务压力一般,但来宾机 CPU 表现异常
  • 内部中断/流量未必显著异常

处理建议

  1. 记录 %steal 证据
  2. 联系宿主/云平台排查
  3. 检查 vCPU 配额与宿主超卖情况
  4. 必要时迁移实例或扩容

8. 常用优化项


8.1 irqbalance

查看

systemctl status irqbalance

开启

systemctl enable irqbalance
systemctl start irqbalance

适用

  • 通用型多核服务器
  • 网卡中断明显偏斜

风险

  • 若已有手工 IRQ 规划,自动平衡可能打乱策略

8.2 RSS

查看网卡队列

ethtool -l eth0

调整示例

ethtool -L eth0 combined 8

作用

  • 让收包处理在多个硬件队列分散
  • 缓解单核 ksoftirqd 热点

8.3 RPS

查看

for f in /sys/class/net/eth0/queues/rx-*/rps_cpus; do echo "$f: $(cat $f)"; done

设置示例

echo ffffffff > /sys/class/net/eth0/queues/rx-0/rps_cpus

风险

  • 可能增加 CPU 间转发和缓存开销

8.4 IRQ affinity

查看

cat /proc/irq/<IRQ>/smp_affinity_list

设置示例

echo 2-3 > /proc/irq/<IRQ>/smp_affinity_list

适用

  • 中断明显集中
  • 需要中断核与业务核隔离

8.5 中断合并

查看

ethtool -c eth0

设置示例

ethtool -C eth0 rx-usecs 50
ethtool -C eth0 tx-usecs 50

风险

  • 会增加一定延迟

8.6 Ring Buffer

查看

ethtool -g eth0

设置示例

ethtool -G eth0 rx 4096 tx 4096

8.7 net.core.netdev_max_backlog

设置示例

sysctl -w net.core.netdev_max_backlog=16384

8.8 建连相关参数

sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=262144
sysctl -w net.ipv4.tcp_syncookies=1

8.9 应用绑核 / 线程池调整

查看

taskset -pc <pid>

设置示例

taskset -cp 4-7 <pid>

建议

  • 降低线程数
  • 避免绑核过于集中
  • 避免中断与业务线程重叠

9. 回滚方案

所有调优必须可回滚。建议变更前先记录当前值。


9.1 irqbalance 回滚

若是本次临时开启

systemctl stop irqbalance
systemctl disable irqbalance

回滚前提

  • 原环境未启用
  • 已有手工 IRQ 亲和配置

9.2 RSS 回滚

恢复原队列数

ethtool -L eth0 combined <原值>

回滚前提

  • 变更前记录原队列数

9.3 RPS 回滚

关闭 RPS

for f in /sys/class/net/eth0/queues/rx-*/rps_cpus; do
  echo 0 > "$f"
done

恢复 flow 配置

sysctl -w net.core.rps_sock_flow_entries=<原值>
for f in /sys/class/net/eth0/queues/rx-*/rps_flow_cnt; do
  echo <原值> > "$f"
done

9.4 IRQ affinity 回滚

恢复原 CPU 绑定

echo <原 affinity> > /proc/irq/<IRQ>/smp_affinity_list

回滚前提

  • 变更前记录原 affinity

9.5 中断合并回滚

恢复原参数

ethtool -C eth0 rx-usecs <原值> tx-usecs <原值>

9.6 Ring Buffer 回滚

ethtool -G eth0 rx <原值> tx <原值>

9.7 sysctl 参数回滚

临时回滚

sysctl -w net.core.netdev_max_backlog=<原值>
sysctl -w net.core.somaxconn=<原值>
sysctl -w net.ipv4.tcp_max_syn_backlog=<原值>

持久化回滚

  • 删除或恢复 /etc/sysctl.conf
  • 删除或恢复 /etc/sysctl.d/*.conf
  • 执行:
sysctl --system

9.8 进程绑核回滚

taskset -cp <原 CPU 列表> <pid>

10. 验证方法

所有处理动作完成后,必须从“系统指标 + 业务指标”两个维度验证。


10.1 系统侧验证

验证命令

top -H -b -n 1 | head -80
mpstat -P ALL 1 5
vmstat 1 5
cat /proc/softirqs
cat /proc/interrupts
ip -s link
ss -s

验证目标

  • ksoftirqd/N CPU 是否下降
  • migration/N CPU 是否下降
  • %soft / %irq / %sys 是否下降
  • cs / in 是否回落
  • 网卡 dropped/errors 是否停止增长
  • CPU 负载是否更均衡

10.2 业务侧验证

验证目标

  • 接口 RT 是否恢复
  • 错误率是否下降
  • 建连成功率是否恢复
  • 丢包是否减少
  • 吞吐是否恢复正常
  • P99/P999 延迟是否改善

建议指标

  • QPS / TPS
  • RT(平均、P95、P99、P999)
  • 5xx 比例
  • TCP 重传率
  • 丢包率
  • upstream error rate

10.3 稳定性验证

建议至少观察:

  • 短期:5~15 分钟
  • 中期:30~60 分钟
  • 高峰期复查:1 个业务峰值周期

11. 风险提示

11.1 变更风险

以下操作有较高误调风险:

  • 手工 IRQ affinity
  • 手工绑核
  • 中断合并调优
  • 大幅增加 backlog / ring
  • 大范围启用 RPS

11.2 原则

  • 每次只改一个点
  • 每次改完都要验证
  • 线上优先选择低风险优化项
  • 高风险项尽量压测后再全量

11.3 不建议的做法

  • 未确认根因就盲目调 sysctl
  • 未记录原值就直接改参数
  • 未看中断分布就随意绑核
  • 只看 CPU,不看业务延迟和丢包

12. 附录:排查命令与脚本

12.1 一键采集脚本

cat > /tmp/check_softirq_migration.sh <<'EOF'
#!/bin/bash
echo "===== BASIC ====="
date
hostname
uptime
uname -a

echo
echo "===== TOP THREAD ====="
top -H -b -n 1 | head -80

echo
echo "===== PS THREAD CPU ====="
ps -eLo pid,ppid,tid,psr,%cpu,comm --sort=-%cpu | head -30

echo
echo "===== CPU mpstat ====="
mpstat -P ALL 1 3 2>/dev/null || echo "mpstat not found"

echo
echo "===== VMSTAT ====="
vmstat 1 5

echo
echo "===== SOFTIRQS ====="
cat /proc/softirqs

echo
echo "===== INTERRUPTS ====="
cat /proc/interrupts

echo
echo "===== IP LINK ====="
ip -s link

echo
echo "===== SAR DEV ====="
sar -n DEV 1 3 2>/dev/null || echo "sar not found"

echo
echo "===== SAR EDEV ====="
sar -n EDEV 1 3 2>/dev/null || echo "sar not found"

echo
echo "===== SS SUMMARY ====="
ss -s

echo
echo "===== TCP STATES ====="
ss -ant | awk 'NR>1{print $1}' | sort | uniq -c

echo
echo "===== SYN-RECV COUNT ====="
ss -ant state syn-recv | wc -l

echo
echo "===== IRQBALANCE ====="
systemctl status irqbalance 2>/dev/null | sed -n '1,10p' || ps -ef | grep irqbalance | grep -v grep
EOF

chmod +x /tmp/check_softirq_migration.sh
bash /tmp/check_softirq_migration.sh | tee /tmp/check_softirq_migration.out

12.2 最小命令集

如果值班时只想快速判断,执行:

top -H
mpstat -P ALL 1
vmstat 1
cat /proc/softirqs
cat /proc/interrupts
ip -s link
ss -s

故障处理结论模板

模板 A:网络软中断压力

现象

  • ksoftirqd/N 持续高 CPU
  • %soft
  • NET_RX 快速增长
  • 网卡 IRQ 分布不均

结论
当前故障主要由网络软中断压力引起,根因倾向于高 PPS、小包流量或中断分配不均。

处理
已检查/调整 irqbalance、RSS/RPS、IRQ affinity,并观察网卡丢包和 CPU 分布变化。


模板 B:调度迁移压力

现象

  • migration/N
  • cs
  • 线程数较多
  • CPU 分布不均

结论
当前故障主要由调度迁移压力引起,根因倾向于线程过多、绑核不合理或局部 CPU 热点。

处理
已检查线程池、cpuset、taskset 配置,并优化业务线程与中断线程 CPU 规划。


模板 C:虚拟化宿主争抢

现象

  • %steal
  • 来宾机内部未发现明显网络异常
  • ksoftirqd/migration 现象持续存在

结论
当前故障疑似由宿主机资源争抢引起,需结合虚拟化平台侧资源使用进一步确认。

处理
已保留来宾机侧指标证据,建议平台侧配合排查宿主资源超卖/争抢情况。

Last Updated: 2026/03/30 12:01:36
【AI生成】学霸笔记:13|智能涌现的基石:精通 Agent Skills,为 AI 植入专家能力 【AI生成】学霸笔记:12||终极扩展:深入 MCP 服务器,将 AI 连接到任何内外部系统