0

0

perf top 显示 [kworker]/[ksoftirqd] 热点时的下一步分析路径

冷炫風刃

冷炫風刃

发布时间:2026-01-24 16:21:08

|

177人浏览过

|

来源于php中文网

原创

kworker或ksoftirqd占CPU高是内核响应压力的表象,需通过perf抓栈、/proc/softirqs、/proc/interrupts等定位真实源头,而非盲目绑核或kill。

perf top 显示 [kworker]/[ksoftirqd] 热点时的下一步分析路径

看到 kworkerksoftirqd 占 CPU 高,先别急着调优

它们不是“问题本身”,而是内核在响应某种压力的信号。比如 ksoftirqd/0 持续跑满一个核,大概率是软中断积压;kworker/1:0H 高,可能是某个设备驱动或文件系统操作在后台密集工作。直接 kill 或绑核只会掩盖根源。

  • 先确认是否真异常:用 top -1 看单个 CPU 核是否被长期独占(而非瞬时毛刺)
  • 区分类型:ksoftirqd 专处理软中断(网络收包、定时器、tasklet);kworker 是通用工作队列,来源更杂(块设备、电源管理、fsnotify、驱动回调等)
  • 注意后缀含义:/1:0H 中的 H 表示 high-priority 工作队列,u8:0 表示 unbound(不绑定 CPU),这类线程可能跨 NUMA 节点调度,带来额外开销

perf record -g 抓调用,定位真正触发者

perf top 只显示当前运行函数,但 ksoftirqd热点函数(如 __do_softirq)或 kworker 的入口(如 process_one_work)都是壳,必须看它“被谁推着跑”。

  • 快速抓 10 秒: perf record -g -e cpu-clock -- sleep 10
  • 导出火焰图看源头:perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > ksoftirqd_flame.svg
  • 重点关注火焰图底部(leaf functions):如果是 net_rx_actionigb_pollskb_copy_datagram_iter,就是网卡收包路径过载;如果是 blk_mq_run_hw_queuescsi_queue_rq,就要查磁盘 I/O 或存储驱动

结合系统指标交叉验证,避免误判

单靠 perf 容易断章取义。比如 kworker/u8:0 高,可能只是因为大量 inotify 事件(如 IDE 实时扫描文件),未必是性能瓶颈

蕉点AI
蕉点AI

AI电商商品图生成平台 | 智能商品素材制作工具

下载
  • 查软中断分布:cat /proc/softirqs,重点看 NET_RXNET_TXHITIMER 列是否持续增长(对比两次采样差值)
  • 查硬中断来源:cat /proc/interrupts | grep -E "(eth|enp|nvme|ioapic)",确认是否某块网卡或 NVMe 设备 IRQ 过于集中
  • 查 RPS/RFS 是否启用:cat /sys/class/net/eth0/queues/rx-0/rps_cpus,若为 0 且单核处理所有软中断,就是典型的单点瓶颈
  • 查 NUMA 分布:numastat -c ksoftirqd/0,若远端内存访问(numa_foreign)高,说明软中断处理和网卡不在同一 NUMA 节点

常见误操作与绕不开的底层约束

很多“优化”反而让问题更隐蔽。比如简单把 ksoftirqd/0 绑到 CPU 1,结果流量全涌向 CPU 1,其他核空闲——这不是均衡,是转移瓶颈。

  • 不要手动 taskset 绑定 ksoftirqd:它的调度由内核自动完成,手动干预会破坏 softirq 负载均衡逻辑
  • RPS 配置需配合网卡 RSS:仅开 RPS 不开 RSS,软中断仍全落一个 CPU;RSS 未开启硬件多队列,RPS 也无队列可分
  • kworker 的高负载常来自用户态行为:比如频繁 inotify_add_watch、大量 sync_file_range、或容器 runtime 频繁调用 cgroup 接口,得回溯上层应用
  • 某些场景无法根治:如高吞吐 DPDK 应用关闭了中断聚合,必然导致 NET_RX 软中断飙升——这时应换 polling 模式,而非硬压 softirq

真正的难点从来不是怎么让 kworker 消失,而是看懂它背后那条从硬件中断、到协议栈、再到用户态应用的完整链路。漏掉任何一环,分析就只剩表象。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1052

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

127

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

737

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

13

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

574

2023.08.10

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

468

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
svg中文手册
svg中文手册

共0课时 | 0人学习

SVG 教程
SVG 教程

共20课时 | 10.6万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号