0

服务器负载过高排查方法:从CPU到内存的完整实战指南

2026.05.20 | youres | 17次围观

导语

服务器负载过高是运维工作中最常见的故障之一。当CPU、内存或磁盘I/O持续高负荷运行时,系统响应变慢甚至宕机。掌握一套完整的排查方法,能在故障发生时快速定位根因并恢复服务。

一、如何判断服务器负载过高

在深入排查之前,首先要能准确判断服务器是否真的负载过高。Linux系统提供了多个工具来监控服务器状态。

1. 使用uptime查看系统负载

uptime命令显示系统的平均负载(load average),三个数值分别代表1分钟、5分钟、15分钟的平均负载。一般规则是:如果平均负载持续超过CPU核心数的70%,说明服务器负载偏高,需要关注。

2. 使用top/htop实时监控

top命令是最常用的实时监控系统工具。关注以下几个关键指标:

  • %Cpu(s):CPU使用率,用户态(us)和系统态(sy)之和超过80%需警惕
  • MiB Mem:内存使用情况,重点关注available列(可用内存)
  • 进程列表:按P键按CPU排序,按M键按内存排序,找出资源消耗大户

3. 使用vmstat分析系统瓶颈

vmstat 2 5 命令每2秒输出一次,共输出5次。重点看两列:

  • r列:等待CPU的进程数,持续大于CPU核心数说明CPU不够用
  • wa列:等待I/O的CPU时间百分比,过高说明磁盘或网络I/O有瓶颈

4. 检查磁盘空间

df -h 命令查看磁盘使用情况。任何分区使用率超过80%都可能影响系统正常运行,尤其是根分区和日志分区。

二、CPU占用率过高的排查方法

CPU使用率持续过高是最直观的负载过高表现。按以下步骤排查:

1. 找出最耗CPU的进程

运行 top -c,按P键按CPU使用率排序。记录最耗CPU的进程PID和命令名。

2. 定位进程内最耗CPU的线程

找到高CPU进程后,用 top -H -p 查看该进程内各线程的CPU使用情况。记录最耗CPU的线程ID(TID)。

3. 分析线程调用栈(针对Java应用)

如果是Java应用,将线程ID转换为16进制(printf "%x\n" ),然后用 jstack | grep -A 20 <16进制TID> 查看该线程的调用栈,就能定位到具体的代码行。

4. 常见CPU过高的原因

  • 死循环:业务代码逻辑错误导致无限循环
  • 频繁GC:Java应用内存分配过快,垃圾回收频繁
  • 加密/压缩等计算密集型操作:属于正常业务,但可能需要限流或升级CPU
  • 恶意进程:被植入挖矿程序等恶意软件

三、内存泄漏的排查与修复

内存使用量持续增长且不回落,是典型的内存泄漏特征。即使业务低谷期内存也不下降,重启后正常但运行一段时间后又涨上去。

1. 确认内存分布

free -h 查看内存概况。关注available列(真正可用的内存)。buffer/cache列高不一定是有问题,Linux会利用空闲内存做缓存,这部分内存在需要时可以被释放。

2. 找出最耗内存的进程

top -c 后按M键按内存使用率排序。记录最耗内存的进程PID。

3. 分析内存泄漏(针对C/C++应用)

使用valgrind等工具可以检测C/C++程序的内存泄漏。对运行中的进程,可以通过定期采样内存使用量来确认是否存在泄漏。

4. 临时缓解与根本解决

  • 临时:重启问题进程或释放缓存(echo 3 > /proc/sys/vm/drop_caches)
  • 根本:修复代码中的内存泄漏bug,优化内存分配策略
  • 扩容:如果业务增长导致,增加服务器内存是必要投资

四、磁盘I/O和空间问题排查

磁盘I/O等待(wa)过高,或磁盘空间耗尽,也会导致服务器负载过高。

1. 排查磁盘I/O瓶颈

iostat -x 2 5 命令查看磁盘I/O详情。重点关注:

  • %util:磁盘利用率,持续接近100%说明磁盘I/O已满负荷
  • await:I/O平均等待时间,超过100ms说明磁盘响应慢

2. 找出最耗磁盘I/O的进程

iotop 命令可以实时查看各进程的磁盘读写速率。如果没有iotop,可以用 pidstat -d 2 查看。

3. 排查磁盘空间问题

df -h 查看磁盘空间使用率。如果某分区已满,用 du -sh /* | sort -rh | head -10 找出占用空间最大的目录,逐层排查大文件。

常见的大文件来源:

  • 日志文件未轮转(/var/log下)
  • 数据库未清理的历史数据
  • 应用产生的临时文件未删除

4. 日志清理策略

配置logrotate对日志文件进行轮转和压缩,避免日志占满磁盘。对大型日志,可以用 echo "" > huge.log 清空(不要用rm删除正在写入的文件,会造成磁盘空间不释放)。

五、查看系统日志定位异常

系统日志往往记录了导致负载过高的根本原因。

1. 查看系统日志

journalctl -p err --since "30 min ago" 查看最近30分钟的错误级别日志。也可以直接查看 /var/log/messages、/var/log/syslog 等文件。

2. 查看应用日志

根据前面找到的高资源消耗进程,查看其对应的应用日志。关注ERROR、WARN级别的日志,以及OutOfMemoryError(OOM)等关键字。

3. 查看dmesg内核日志

dmesg | tail -50 查看最近的内核日志。OOM Killer杀进程的记录会在这里显示,帮助判断是否有进程因内存耗尽被系统强行终止。

六、总结与建议

服务器负载过高的排查是一个系统工程,需要结合多个工具和指标综合判断。总结一下标准的排查流程:

  1. 定位现象:用uptime、top、free、df快速确认是CPU、内存还是磁盘的问题
  2. 找出进程:用top/htop找出具体哪个进程消耗资源最多
  3. 深入分析:对问题进程用strace、jstack、valgrind等工具深入分析
  4. 查看日志:从系统日志和应用日志中找到导致问题的具体原因
  5. 修复验证:修复后持续监控,确认问题不再复现

预防胜于治疗。建议部署Zabbix、Prometheus等监控工具,对CPU、内存、磁盘、网络等关键指标设置告警阈值,在问题发生初期就能收到通知。同时定期检查日志轮转配置,避免磁盘空间被日志占满。

相关推荐:

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
881文章数 0评论数
作者其它文章