ksoftirqd 单核 100% 是因 net_rx 软中断积压所致,需通过 /proc/softirqs、top -H、/proc/interrupts 和 ethtool 等工具定位网卡 IRQ 绑定不均或 NAPI 负载过重问题。

ksoftirqd 占用单核 100%,尤其是绑定在 net_rx 或 softnet 软中断上,是 Linux 网络高负载场景下的典型性能瓶颈。根本原因不是进程本身“吃 CPU”,而是内核持续调度该线程处理积压的网络软中断(softirq),说明网卡收包路径出现拥塞或处理不及时。
确认是否真是 net_rx 软中断瓶颈
先验证问题根源,避免误判:
- 运行 watch -n 1 'cat /proc/softirqs',观察 NET_RX 行数值是否持续飙升(尤其对比其他 CPU 核)
- 用 top -H -p $(pgrep ksoftirqd) 查看具体哪个 ksoftirqd/N 线程 CPU 高,并记下其绑定的 CPU 编号 N
- 检查该 CPU 对应的 /proc/irq/*/cpulist 和 /proc/interrupts,确认网卡 IRQ 是否集中落在该核(IRQ 绑定不均会加剧 softirq 偏斜)
检查网卡收包队列与 NAPI 负载
NAPI 是 net_rx softirq 的执行主体。若 NAPI poll 循环未及时退出或轮询量过大,会导致 softirq 长时间占用 CPU:
- 查看网卡队列状态:ethtool -S eth0 | grep -i "rx\|drop\|queue",重点关注 rx_queue_0_drops、rx_missed_errors、rx_long_length_errors
- 确认 NAPI 是否被频繁唤醒:cat /sys/class/net/eth0/device/msi_irqs/*/name 2>/dev/null | grep napi,再结合 echo 128 > /sys/class/net/eth0/napi_weight,观察是否缓解(慎用于生产,需测试稳定性)
优化 IRQ 亲和性与 RPS/RFS
让收包中断和 softirq 处理尽量分散到多核,避免单核打满:
- 均衡 IRQ 分布:用 sudo bash -c 'echo 0-3 > /proc/irq/*/smp_affinity_list'(按实际 CPU 数调整),确保网卡多队列 IRQ 均匀绑定
- 启用 RPS(软件层面分发 rx softirq):echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(十六进制掩码,f=0-3核)
- 启用 RFS(提升 cache 局部性):先设 net.core.rps_sock_flow_entries=32768,再为每 rx 队列配 flow_cnt:echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
排查上层诱因与协议栈行为
软中断压满往往是结果,需回溯上游流量或应用行为:
- 检查是否有异常流量:用 tcpdump -i eth0 -c 100 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0' 快速抓包,看是否存在 SYN Flood、大量短连接、RST 扫描等
- 确认 socket 接收队列是否溢出:ss -s 中关注 recv-q 持续非零、full connections dropped 计数增长
- 检查 netfilter 规则(iptables/nftables)是否过于复杂,特别是 PREROUTING 链中大量 match 或 LOG,会显著拖慢 ingress 路径










