Linux怎么解决CPU占用率100%问题

夏晨姑娘_3276

夏晨姑娘_3276

2026-06-25

605人浏览

原创

应优先用pidstat -u 1 1,因其输出稳定、可分离%usr(用户态)和%sys(内核态)消耗,便于判断是应用逻辑问题还是系统调用异常,而top适合快速扫视但易受交互干扰。

linux怎么解决cpu占用率100%问题

直接杀掉占用最高的进程往往治标不治本,甚至可能中断关键服务;真正要解决 Linux CPU 100% 问题,得按「进程 → 线程 → 代码」三级穿透,否则容易反复。

怎么快速定位到高 CPU 进程(top 和 pidstat 选哪个)

top 适合第一眼扫视,但默认刷新干扰多、排序不稳定;pidstat -u 1 1 更干净,能直接分离用户态(%usr)和内核态(%sys)消耗——这对后续判断是代码问题还是系统调用问题很关键。

  • 如果 %usr 高(比如 >80%),大概率是应用逻辑问题:死循环、低效算法、频繁对象创建
  • 如果 %sys 高(比如 >30%),重点查锁竞争、上下文切换(pidstat -w 1 看 %ctxt)、或驱动/内核模块异常
  • 别只看 %CPU 总值,ps -eo pid,ppid,cmd,%cpu --sort=-%cpu | head -n 5 能绕过 top 的交互干扰,输出更稳定

为什么 top -H -p PID 找到的线程 ID 要转成十六进制

因为 Java 的 jstack、Go 的 pprof、甚至内核级工具如 perf 在堆栈中显示的线程 ID 默认是十六进制(小写),而 top -H 显示的是十进制。不转换就 grep 不到对应线程的调用栈。

Linux Journey
Linux Journey

当用户想学习Linux基础、命令行、文件系统等时,在LabEx查找并推荐免费的Linux Journey课程。

下载
  • 正确命令是:printf "%x\n" <tid></tid>,不是 echo "obase=16; <tid>" | bc</tid>(后者可能输出大写,jstack 匹配失败)
  • 常见坑:线程 TID 和进程 PID 在 Linux 下共享命名空间,但 jstack 输出里看到的是线程的 tid 字段,不是 nid;确认时用 jstack <pid> | grep -A 5 "nid=0x.*"</pid> 对照
  • 如果进程不是 Java,比如是 Node.js 或 Python,优先用 pstack <pid></pid> 或 gdb -p <pid> -ex "thread apply all bt" -ex quit</pid>,避免依赖语言特有工具

怎么判断是 CPU 真忙,还是在等 I/O(%iowait 到底怎么看)

iostat -c -x 1 输出里的 %iowait 并不表示“CPU 在等磁盘”,而是“CPU 本可运行但因无任务可做、且有 I/O 在进行中,所以空闲”。它高 ≠ 磁盘慢,反而可能是 CPU 已被其他任务占满,根本没机会去等 I/O。

  • 真正要看的是:%idle 是否持续接近 0,同时 %iowait 却很低(比如
  • 如果 %iowait > 20% 且 %idle 也高(比如 >30%),才说明磁盘响应慢、CPU 被迫空转等待
  • 混淆点:vmstat 1 中的 wa 列和 iostat 的 %iowait 含义一致,但 top 第一行的 wa 是采样统计,精度不如 iostat

为什么 renice 和 kill -9 常常无效或危险

renice 只影响调度优先级,对已进入自旋锁、死循环或陷入内核不可中断状态(D 状态)的进程完全没用;kill -9 则可能让数据库丢事务、让服务端连接半关闭、或触发进程守护机制立刻拉起新实例,导致 CPU 再次飙升。

  • 先用 ps -o pid,comm,state,wchan -p <pid></pid> 看进程状态:R(运行中)可 kill,D(不可中断睡眠)基本只能重启
  • wchan 列显示进程正在等待的内核函数名,比如 wait_event_interruptible 表示正常等待,do_wait 可能是子进程僵死
  • 真要终止,优先用 kill -15(SIGTERM)给进程留出清理时间;kill -9 是最后手段,且执行后必须检查日志确认是否留下脏数据

最易被忽略的一点:CPU 100% 很少由单一线程引起,往往是多个线程高频争抢同一把锁(如 HashMap 并发写)、或 GC 线程与业务线程反复同步——这时候光看 top 排名前几的线程,会漏掉真正拖垮系统的“协同效应”。必须结合 pidstat -t -p <pid> 1</pid> 观察线程级波动,再用 perf record -p <pid> -g -- sleep 10</pid> 抓取火焰图,才能看清调用链路中的真实瓶颈。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux性能监控 linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3630

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3153

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2213

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

5310

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

4982

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

2993

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2485

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

2699

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

277

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习