服务器CPU居高不下?排查思路详解
现象确认与初步定位
当服务器CPU持续处于高负载状态(如长期超过80%),首先需通过监控工具确认现象真实性。使用top、htop或vmstat命令观察CPU使用率、用户态/系统态占比、等待I/O时间等指标。同时查看是否存在大量僵尸进程或频繁上下文切换。
进程级深入分析
使用top命令定位高消耗进程
执行top -c,按P键以CPU使用率降序排列,记录PID、进程名称及命令行参数。重点关注消耗异常的进程,如Web服务、数据库、脚本解释器等。
使用ps命令补充分析
运行ps aux --sort=-%cpu | head -20,获取更详细的CPU时间、内存占用及进程状态。若发现多个同名进程,检查是否存在 fork 炸弹或配置不当的 worker 数量。
系统资源与配置检查
查看CPU相关信息
使用lscpu确认物理核心数、超线程状态。执行cat /proc/loadavg比较负载与核心数的合理比例(通常负载不应超过核心数*0.7)。若负载远高于核心数,表明存在严重的资源争用。
检查系统瓶颈
- 内存不足:使用free -h观察可用内存,若swap频繁使用,物理内存不足会导致频繁内存交换,引发CPU飙升。
- 磁盘I/O:使用iostat -x 1查看磁盘利用率(%util)和等待时间(await),高I/O等待会消耗大量CPU时间。
- 网络中断:检查cat /proc/interrupts,看是否有网卡中断集中在单一CPU核心上。
应用层面深度排查
分析Java应用(如Tomcat、Spring Boot)
使用jstack获取线程堆栈,结合top -H查看具体线程ID,转换为十六进制后在堆栈中定位热点方法。常见原因:死循环、锁竞争、Full GC频繁。
分析数据库
MySQL可使用SHOW PROCESSLIST查看当前查询,重点关注长时间运行的SELECT或慢查询。对于PostgreSQL,用pg_stat_activity。调整innodb_buffer_pool_size、max_connections等参数。
分析脚本语言(如PHP、Python)
使用strace -p 跟踪系统调用,查看是否频繁执行文件操作或网络请求。对于Python,可结合py-spy或cProfile定位性能瓶颈。
常见诱因与解决方案
- 突发流量:检查Web服务器访问日志,通过ddos-deflate或限流措施缓解。
- 定时任务重叠:调整cron任务执行时间,避免多个任务同时触发。
- 软件版本bug:检查应用或内核已知缺陷,考虑升级或回滚。
- 挖矿病毒:使用netstat -anp查看异常外联IP,配合clamav查杀。
长期监控与预防
部署prometheus + grafana建立CPU使用率、进程数、等待时间的历史曲线。设置告警阈值(如持续5分钟CPU>90%触发通知)。定期进行压力测试,优化应用代码与系统参数。