当前位置: 首页 > article >正文

Linux平台排查CPU占用高的进程和线程指南

基础排查工具

1. top命令 - 实时进程监控

top
  • 操作指令
    • P:按CPU使用率排序
    • 1:显示每个CPU核心的使用情况
    • H:切换显示线程视图
    • M:按内存使用排序
    • q:退出

2. htop命令 - 增强版top(需安装)

sudo apt install htop  # Debian/Ubuntu
sudo yum install htop  # CentOS/RHEL
htop
  • 彩色界面,支持鼠标操作
  • 树状显示进程关系
  • 可直接杀死进程(F9)

3. ps命令 - 进程快照

# 查看CPU占用前10的进程
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 10# 查看特定进程的所有线程
ps -T -p <PID># 显示线程的CPU占用
ps -eLf --sort=-%cpu | head

高级排查工具

4. pidstat - 进程统计(sysstat包)

sudo apt install sysstat  # 安装
pidstat -u 1 5           # 每1秒采样一次,共5次
pidstat -t -p <PID> 1 3  # 监控特定进程的线程

5. mpstat - 多核CPU统计

mpstat -P ALL 1  # 查看每个CPU核心的使用情况

6. perf - 性能分析

# 实时监控
sudo perf top# 记录特定进程
sudo perf record -g -p <PID>
sudo perf report

线程级排查

7. 使用top查看线程

top -H -p <PID>  # 查看特定进程的线程

8. 使用strace跟踪系统调用

strace -p <TID> -c  # 统计线程的系统调用
strace -p <TID>     # 实时跟踪

9. 查看进程的调用栈

# 安装gdb
sudo apt install gdb# 生成线程堆栈
gdb -p <PID>
(gdb) thread apply all bt  # 打印所有线程堆栈
(gdb) detach
(gdb) quit

自动化排查脚本

10. 快速定位高CPU进程

#!/bin/bash
echo "===== 高CPU进程 TOP5 ====="
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 6read -p "输入要分析的PID(直接回车跳过): " pid
if [ ! -z "$pid" ]; thenecho -e "\n===== 进程 $pid 的线程 ====="ps -T -p $pid --sort=-%cpuecho -e "\n===== 线程调用栈采样 ====="sudo gdb -p $pid -batch -ex "thread apply all bt" 2>&1 | grep -v "^New" | head -n 50echo -e "\n===== 系统调用统计 ====="sudo strace -p $pid -c 2>&1 | tail -n +2
fi

系统级检查

11. 检查系统负载

uptime        # 查看1/5/15分钟平均负载
vmstat 1 5    # 查看系统整体状态
dmesg         # 检查内核日志

12. 检查中断和软中断

cat /proc/interrupts
cat /proc/softirqs

排查流程总结

  1. 定位高CPU进程:使用top/htop/ps找出问题进程
  2. 分析进程线程:top -H/ps -T查看线程情况
  3. 检查调用栈:使用gdb/perf分析执行路径
  4. 监控系统调用:strace跟踪具体行为
  5. 检查依赖资源:查看是否因等待IO/锁等导致
  6. 分析日志:检查系统日志和应用日志

优化建议

  1. 算法优化:改进高时间复杂度算法
  2. 并发控制:调整线程池大小,避免过多线程竞争
  3. 缓存机制:减少重复计算
  4. 异步处理:将阻塞操作改为异步
  5. 分批处理:大数据集分片处理
  6. 升级版本:使用修复了性能问题的新版本

通过以上方法,您可以系统性地排查和解决Linux系统中的高CPU占用问题。对于生产环境,建议建立长期监控机制,以便及时发现性能问题。

http://www.lryc.cn/news/2398357.html

相关文章:

  • 多模态大语言模型arxiv论文略读(105)
  • 简述MySQL 超大分页怎么处理 ?
  • Pyhton中的命名空间包(Namespace Package)您了解吗?
  • Java设计模式之备忘录模式详解
  • Azure DevOps Server 2022.2 补丁(Patch 5)
  • 手摸手还原vue3中reactive的get陷阱以及receiver的作用
  • 小明的Java面试奇遇之互联网保险系统架构与性能优化
  • C++学习-入门到精通【13】标准库的容器和迭代器
  • C# 面向对象特性
  • ElasticStack技术之logstash介绍
  • 前端与后端
  • CI/CD 持续集成、持续交付、持续部署
  • 代码随想录60期day54
  • 关于easyx头文件
  • Java 中执行命令并使用指定配置文件的最佳实践
  • django入门-orm数据库操作
  • ​​食品电商突围战!品融电商全平台代运营,助您抢占天猫京东抖音红利!
  • Termux下如何使用MATLAB
  • STM32外部中断(EXTI)以及旋转编码器的简介
  • 双擎驱动:华为云数字人与DeepSeek大模型的智能交互升级方案
  • Unity Version Control UVC报错:Not connected. Trying to re-connect…
  • 场景题-1
  • Java复习Day26
  • 实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.5 R语言解题
  • 阿里云百炼全解析:一站式大模型开发平台的架构与行业实践
  • 字节新出的MCP应用DeepSearch,有点意思。
  • ​​Agentic Voice Stack 热门项目
  • 机器学习在多介质环境中多污染物空间预测的应用研究
  • 期货反向跟单运营逻辑推导思路
  • 使用 HTML + JavaScript 实现图片裁剪上传功能