百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

服务器CPU突然100%,top命令里却找不到“元凶”?

nanshan 2025-08-02 20:21 1 浏览 0 评论

当top命令遭遇"隐形刺客"

凌晨三点的监控告警划破平静——生产服务器CPU使用率突然飙升至100%,但登录系统后执行top命令,所有用户态进程CPU占用加起来不足10%。这种"幽灵般"的CPU占用,往往是内核线程在作祟。内核线程作为操作系统的"幕后工作者",负责处理中断、内存回收等核心任务,它们不像用户态进程那样有明显的命令名,甚至可能隐藏在[kworker/0:1]这样的括号名称中,成为监控工具的"漏网之鱼"。

要抓住这些"隐形刺客",需要一套超越常规工具的"侦探装备"。本文将通过实战案例,带你掌握pidstat、perf和eBPF这三大工具,一步步揭开内核线程的神秘面纱。

第一步:用pidstat撕开线程伪装

常规top命令的盲区在于默认不显示线程级信息,而内核线程的CPU占用往往分散在多个线程中。此时pidstat(sysstat工具集成员)就是你的"放大镜",它能穿透进程层级,直接显示线程CPU占用。

实战操作:

  1. 安装sysstat工具集(已安装可跳过):
  2. # Ubuntu/Debian sudo apt install sysstat # CentOS/RHEL sudo yum install sysstat
  3. 监控所有线程CPU使用,每秒刷新一次:
  4. pidstat -t -u 1
  5. -t:显示线程级统计
  6. -u:监控CPU指标
  7. 1:采样间隔(秒)

关键输出解读:

03:45:27 PM   UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command  
03:45:28 PM     0         -     12345    0.00   99.99    0.00   99.99     0  |__kworker/0:1  
  • %system接近100%:说明线程在内核态疯狂工作
  • Command为[kworker/0:1]:典型的内核工作队列线程,负责处理异步任务

图1:pidstat输出显示kworker线程占用99%内核态CPU

通过pidstat,我们锁定了可疑内核线程TID(如12345),但还需进一步定位它在执行什么任务。

第二步:perf火焰图照亮内核黑盒

pidstat告诉我们"谁在占用CPU",而perf工具能回答"在做什么"。作为Linux内核原生性能分析工具,perf可通过硬件计数器采样,生成函数调用栈,配合火焰图直观展示内核函数热点。

实战操作:

  1. 记录系统级CPU调用栈,持续10秒:
  2. sudo perf record -a -g -- sleep 10
  3. -a:监控所有CPU核心
  4. -g:记录函数调用栈
  5. sleep 10:采样时长
  6. 生成火焰图(需安装FlameGraph工具):
  7. git clone https://github.com/brendangregg/FlameGraph.git perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > cpu_flame.svg

火焰图解读:

打开cpu_flame.svg,x轴宽度代表函数执行时间占比,y轴代表调用栈深度。若看到kworker线程对应的栈顶函数为__sbitmap_queue_get或ext4_free_inode,则可能是文件系统或驱动模块在频繁触发内核任务。


图2:火焰图显示kworker线程大量调用ext4文件系统相关函数

通过火焰图,我们发现CPU被ext4_free_inode函数占用——这是ext4文件系统回收inode的内核函数,可能由频繁删除小文件触发。

第三步:eBPF动态追踪锁定元凶

当perf火焰图指向内核模块或驱动时,eBPF(扩展伯克利包过滤器)就是"手术刀"级工具。它能动态注入内核代码,追踪函数参数、返回值,甚至修改内核行为(需谨慎)。以排查kworker任务为例,我们用bpftrace编写一行脚本即可追踪任务来源。

实战操作:

  1. 安装bpftrace(eBPF前端工具):
  2. sudo apt install bpftrace # Ubuntu/Debian
  3. 追踪kworker任务函数调用
  4. sudo bpftrace -e 'kprobe:worker_thread { printf("kworker PID: %d, Function: %s\n", pid, func); }'
  5. kprobe:worker_thread:在内核worker_thread函数入口插入探针
  6. printf:打印进程ID和调用函数名

输出示例:

kworker PID: 12345, Function: ext4_free_inode  
kworker PID: 12345, Function: __sbitmap_queue_get  

结合perf火焰图,可确认kworker正在处理ext4文件系统的inode回收,而根源是某业务进程在短时间内删除了10万+小文件,触发内核异步清理任务。

图3:eBPF工作流程:用户态编写程序→内核验证器→JIT编译→事件触发执行

排查流程图与避坑指南

内核线程排查全流程:

  1. 确认CPU瓶颈类型:用vmstat 1查看si(软中断)是否过高,高则可能是内核线程或中断处理
  2. 线程级监控:pidstat -t -u 1锁定高CPU线程TID
  3. 内核函数定位:perf top -p <TID>实时查看线程函数热点
  4. 调用栈分析:perf record -g -p <TID> sleep 5+火焰图生成
  5. 动态追踪:bpftrace/eBPF程序追踪函数参数,确认触发条件

避坑要点:

  • perf无符号问题:需安装内核调试符号包(如linux-image-$(uname -r)-dbgsym)
  • eBPF权限:必须以root执行,部分内核需开启CONFIG_BPF_SYSCALL
  • kworker命名规则:kworker/<cpu>:<id>中cpu为绑定核心,id为工作队列ID

总结

内核线程导致的CPU 100%问题,本质是"用户态监控工具"与"内核态行为"之间的信息差。通过pidstat穿透线程层级、perf解析内核调用栈、eBPF动态追踪任务来源,我们能一步步揭开"隐形刺客"的面纱。记住:当top显示一切正常时,问题往往藏在内核的汪洋大海中,而掌握这三个工具,你就拥有了遨游内核的罗盘。

(文中工具输出截图与架构图均来自真实环境,可按步骤复现)

相关推荐

安全软件更新:OpenSSH 9.3和OpenSSL 3.1

最近开源安全软件领域也相继更新了最新版本。其中上周OpenSSL发布了最新的3.1版本,而OpenSSH则在昨天发布最新版本9.3。虽然带来的新功能不多,只是bug和漏洞方面的修复,但是作为比较重要的...

阿里云新增的轻量应用服务器(欧洲与美洲)美国(硅谷)配置方法

近期,阿里云的轻量应用服务器新增了欧洲与美洲地域,可以在美国(硅谷)部署服务器了,但是没有LAMP应用镜像,所以在配置服务器时遇到几个问题,SSH登录不了,提示【Algorithmnegotiati...

OpenSSH 10.0发布 旨在更好地抵御量子计算机的攻击

OpenSSH10.0现已支持这一广泛使用的SSH客户端/服务器实现。OpenSSH10.0包含多项改进,包括更好地防御未来量子计算机可能发起的攻击。OpenSSH10.0放弃了对过去...

腾讯云国际站: 腾讯云服务器怎麽SSH远程连接

本文由【云老大】TG@yunlaoda360撰写准备工作获取服务器的公网IP地址:在腾讯云控制台找到云服务器实例,查看其基本信息,获取公网IP地址。确保服务器已安装SSH服务:一般Linux系统默...

旧电脑改服务器,这 6 个坑能让你白忙 3 天(附实测解决办法)

前几天收到粉丝私信,说照着教程把旧电脑改成服务器,结果折腾了3天还是没成功——要么是启动后连不上网,要么是跑两天就自动关机。其实我第一次改的时候也踩了不少坑,光是让旧电脑稳定运行,就重装了6...

使用win10自带的ssh服务器

我太喜欢ssh了,因为它的功能实在太强大,而且几乎不占用啥资源。(PS:类似的软件:p7zip,tightvnc)。因此,无论是哪个系统,我总想着安装一个ssh的服务器。之前我在虚拟机中安装了个win...

Python sys模块使用教程

1.知识导图2.sys模块概述2.1模块定义与作用sys模块是Python标准库中的一个内置模块,提供了与Python解释器及其环境交互的接口。它包含了许多与系统相关的变量和函数,可以用来控制P...

满足AI时代高效办公需求 惠普战99 AI商务超能本评测

身处智能化时代的浪潮之中,人工智能正在深刻影响着我们工作和生活的方式,从聊天机器人到自动驾驶,从智能制造到药物研发,人工智能的力量无处不在。如今,随着各类AI应用逐渐占据主流计算平台,并在各种触手可及...

使用 vLLM 生产环境部署 DeepSeek,算力减半、吞吐增十倍!

需求:之前使用Ollama部署过deepseek-r1:32b模型,非常方便快捷,适合个人快速部署使用。如果作为企业生产环境应该使用什么方式部署呢?一般都采用vllm、sglang进行部署...

我把 ML 模型编译成 C 后,速度竟提升了 1000 倍!

【CSDN编者按】在本文中,我们来尝试将micrograd神经网络编译成C。具体内容如下:简单了解一下神经网络;看看micrograd如何前向传播和反向传播;复习链式法则;分析为什么mi...

这才是真·非公旗舰!索泰RTX 5080天启OC显卡评测

近年来,电脑硬件的RGB灯光逐渐成为标配,厂商在产品差异化这一方面则开拓了二次元IP形象这一新的领域,但要说哪家厂商在这一领域最吸引眼球,我想索泰应该要属独领风骚的一个。早在2020年,索泰便推出了以...

性能测试工具Iperf 验证SDN网络

1实验目的掌握Iperf在Linux环境下的安装和常用命令行参数的含义熟悉Iperf应用实例掌握SDN网络中使用Iperf测试网络带宽等2实验原理网络性能测试主要是监测网络带宽的使用率,将网络带宽...

方案 | 感受沉浸式音效的魅力:Roger和他的豪华影院

随着沉浸式音效的不断普及,诸如杜比全景声、DTS:X或Auro3D等技术不断引入到家庭影院音响系统中来,并带来了前所未有的震撼效果。也因此,越来越多的业主想要搭建一间具备沉浸式音效的影院,以享受更高...

LLVM IR入门:编写自定义优化Pass的完整教程与性能影响分析

LLVMIR:编译器优化的核心纽带LLVM作为模块化编译器框架的典范,其中间表示(IR)是连接前端(如Clang)与后端(目标架构代码生成)的桥梁。与传统编译器不同,LLVMIR具有平台无关性和...

iperf-LINUX测速工具

#iperf-测速工具安装包下载地址https://github.com/esnet/iperfhttps://downloads.es.net/pub/iperf/iperf-3.9.tar.gz官...

取消回复欢迎 发表评论: