Linux系统负载过高问题排查

当Linux系统的load average(平均负载)过高时,通常意味着系统在某段时间内处于较高的运行压力下。load average反映的是处于可运行状态(Running或Uninterruptible Sleep)的进程平均数量,它不仅与CPU使用有关,还与I/O、内存、锁资源等密切相关。

以下是一套系统性的排查思路和常用命令,帮助你定位高负载原因:

一、确认当前负载情况

uptime
# 或
cat /proc/loadavg

输出示例如下:

16:30:00 up 10 days, 22:11,  2 users,  load average: 12.45, 8.92, 5.30
  • 若1分钟负载远高于CPU核心数(如8核机器负载 > 8),说明系统可能正在经历突发压力。

二、查看CPU核心数量

nproc
# 或
lscpu | grep "CPU(s)"

对比负载值与CPU核心数,判断是否真正过载。

三、使用 top/htop 查看占用高的进程

top

top 中关注:

  • %CPU:CPU占用率
  • RES:物理内存使用
  • STATE:进程状态(如 D = uninterruptible sleep,常因磁盘I/O卡住)

1 查看每个CPU核心的使用情况。

推荐使用 htop(更直观):

htop

四、检查是否因I/O等待导致高负载

iowait 表示CPU在等待I/O完成,可能是磁盘瓶颈。

vmstat 1 5

关注 us, sy, id, wa 列:

  • wa(I/O wait)持续较高(如 >20%),说明I/O是瓶颈。

进一步排查I/O:

iostat -x 1 3

检查 %util(设备利用率)和 await(I/O平均等待时间):

  • %util 接近 100% 表示设备饱和
  • await 高(如 >10ms)可能表示磁盘慢或过载

使用 iotop 查看具体进程I/O:

iotop -o    # 显示正在进行I/O的进程

五、检查内存与交换使用

内存不足会导致频繁swap和kswapd占用CPU:

free -h

关注 available 内存是否充足。

swap 使用率高,说明物理内存不足。

六、检查是否存在大量进程或线程

高负载也可能因进程/线程数过多(如fork炸弹、应用bug):

ps aux --sort=-%cpu | head -10
ps -eLf | wc -l    # 查看总线程数

正常线程数一般几百以内,若超过几千需警惕。

七、使用其他工具辅助分析

1. dmesg 检查内核日志

dmesg -T | tail -50 | grep -i 'oom\|kill\|error'

查看是否因内存不足触发OOM(Out-of-Memory)被kill。

2. sar 命令(需安装 sysstat)

sar -u 1 3     # CPU使用率
sar -q         # 历史load average
sar -r         # 内存使用

3. pidstat 查看具体进程资源使用

pidstat -u 1 3    # 按进程查看CPU
pidstat -d 1 3    # I/O使用

八、常见原因与解决方案

原因 现象 解决方案
CPU密集型进程 top中%CPU高 优化程序、限制资源(cgroups)
磁盘I/O瓶颈 iowait高,iotop显示高I/O进程 优化磁盘访问、升级SSD、限流
内存不足 swap使用高,kswapd占用CPU 增加内存、优化程序内存使用
进程/线程泄漏 进程数激增 重启服务、修复代码bug
锁竞争或D状态进程 load高但CPU不高 检查D状态进程,排查I/O或NFS问题

九、快速命令汇总

uptime
top
htop
vmstat 1 5
iostat -x 1 3
iotop -o
free -h
dmesg -T | tail -50
ps aux --sort=-%cpu | head -10

总结

高load average ≠ 高CPU使用!
务必结合 CPU、内存、I/O、进程状态 综合判断。建议按以下流程:

  1. 看load与CPU核数对比
  2. top/htop 找占用高的进程
  3. vmstat/iostat 判断I/O瓶颈
  4. 检查内存和swap
  5. 分析具体进程行为

如问题持续,建议结合应用日志进一步分析。

posted @ 2026-01-26 19:39  如.若  阅读(0)  评论(0)    收藏  举报