故障处理手册:ksoftirqd / migration CPU 高
文档信息
- 文档类型:故障处理 / 性能排障
- 适用范围:Linux 物理机、虚拟机、容器宿主机
- 适用对象:运维、SRE、值班工程师、平台工程师
- 关键词:
ksoftirqd、migration、softirq、IRQ、CPU 迁移、网络中断、调度
目录
- 1. 故障定义
- 2. 故障现象
- 3. 影响范围
- 4. 背景说明
- 5. 快速判断
- 6. 标准处理步骤
- 7. 常见根因与处理建议
- 8. 常用优化项
- 9. 回滚方案
- 10. 验证方法
- 11. 风险提示
- 12. 附录:排查命令与脚本
1. 故障定义
当 Linux 服务器出现以下现象之一时,可归类为本类故障:
top -H中ksoftirqd/N持续高 CPUtop -H中migration/N持续高 CPU- 某些 CPU 核长期接近 100%
- 业务出现高延迟、丢包、吞吐下降、连接异常
- 伴随
%soft、%irq、cs、in、steal等指标异常
本手册用于处理以下典型问题:
ksoftirqd高migration高- 两者同时高
- 虚拟机中看似系统忙但根因在宿主争抢
2. 故障现象
2.1 系统现象
常见表现:
top -H中出现:ksoftirqd/0ksoftirqd/1migration/0migration/1
mpstat -P ALL显示:%soft高%irq高%sys高- 个别 CPU 特别忙
vmstat显示:in很高cs很高r增大
/proc/softirqs中:NET_RX、NET_TX、SCHED快速增长
/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/softirqs中NET_RX高/proc/interrupts中网卡中断偏斜ip -s link显示 PPS 高或 dropped 增加
情况 B:migration 高
同时满足以下几项时,优先判断为调度迁移压力:
migration/N高vmstat中cs高- CPU 负载不均衡
- 线程数很多或绑核复杂
- 网络软中断不突出
情况 C:两者都高
通常判断为:
- 网络包处理压力大
- 局部 CPU 过热
- 调度器开始频繁迁移任务
情况 D:steal 高
若 %steal 或 st 高,优先考虑:
- 宿主机争抢
- 云主机资源超卖
- 虚拟化层面 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
重点观察
incsrst
判断
in高:中断压力重cs高:调度/上下文切换重r高:CPU 资源竞争st高:宿主机争抢
步骤 4:确认软中断类型
cat /proc/softirqs
watch -n 1 cat /proc/softirqs
重点观察
NET_RXNET_TXSCHEDRCUTIMER
判断
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 高
- 小包场景明显
处理建议
- 开启/检查
irqbalance - 检查 RSS 队列数
- 必要时启用 RPS
- 调整 IRQ affinity
- 适度调大 ring buffer
- 适度调大
net.core.netdev_max_backlog - 排查攻击流量和异常流量
7.2 根因:中断分布不均
典型特征
- 只有某几个
ksoftirqd/N高 /proc/interrupts中中断集中在少数 CPU- 其他 CPU 比较空闲
处理建议
- 启动
irqbalance - 检查多队列网卡配置
- 调整 RSS
- 必要时手工设置 IRQ affinity
- 避免 NIC IRQ 都落在 CPU0/CPU1
7.3 根因:任务迁移和调度压力过高
典型特征
migration/N高cs高- runnable 多
- 线程数很多
- CPU 分布不均
处理建议
- 检查线程数与线程池大小
- 调整应用绑核
- 检查 cpuset/cgroup 配置
- 避免业务线程与中断线程抢同一组 CPU
- 优化容器 CPU request/limit
7.4 根因:网络与调度叠加
典型特征
ksoftirqd/N和migration/N同时高NET_RX高cs高- 某些 CPU 热点明显
处理建议
- 先处理网卡中断分布问题
- 再处理绑核和线程数问题
- 最后观察
ksoftirqd与migration是否同时回落
7.5 根因:虚拟化宿主争抢
典型特征
%steal高- 业务压力一般,但来宾机 CPU 表现异常
- 内部中断/流量未必显著异常
处理建议
- 记录
%steal证据 - 联系宿主/云平台排查
- 检查 vCPU 配额与宿主超卖情况
- 必要时迁移实例或扩容
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/NCPU 是否下降migration/NCPU 是否下降%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现象持续存在
结论
当前故障疑似由宿主机资源争抢引起,需结合虚拟化平台侧资源使用进一步确认。
处理
已保留来宾机侧指标证据,建议平台侧配合排查宿主资源超卖/争抢情况。