Linux高负载需结合CPU核心数、IO等待、内存压力等多维度判断:先用uptime和nproc计算负载比值,再通过top看%Cpu(s)、r列和Mem行定位瓶颈,接着用ps、iostat、iotop等命令找异常进程,最后用strace、lsof、perf深入追踪。
Linux高负载不是单看一个数字就能下结论的事,关键得结合CPU核心数、进程状态、IO等待、内存压力这些维度交叉判断。下面分四步带你实操排查,每一步都带命令和解读,照着做就能定位问题根源。
一、确认负载是否真高
先别急着杀进程,先看负载值和CPU核数的关系:运行uptime或cat /proc/loadavg,拿到三个值(1/5/15分钟平均负载)
运行nproc或grep -c processor /proc/cpuinfo查清逻辑CPU总数计算比值:比如负载是6.2, 4.8, 2.1,CPU是4核,那1分钟负载6.2 ÷ 4 = 1.55 → 已过载;若负载是0.8, 0.9, 1.0,哪怕看起来“有1”,其实完全正常
二、快速判断瓶颈类型
打开top
,重点盯三块:
%Cpu(s) 行:看us(用户态)高?
sy(内核态)高?还是wa(IO等待)高?
→ us高:业务进程在狂算;
→ sy高:系统调用频繁(如大量fork、socket操作);
→ wa高:磁盘或网络卡住了,进程在等IO load average值持续高于CPU核数,且r列(运行队列长度)长期 > CPU核数,说明有任务在排队Mem行:如果free极低、buff/cache占比高但available也低,可能内存吃紧;再查free -h看available是否告急
三、定位具体“搞事”的进程或线程
根据上一步线索选择对应命令:Eclipse导入Android或其他的JAVA项目的正确方法 WORD版本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看下载如果是us/sy 高:→ps aux --sort=-%cpu | head -10找CPU大户→top -Hp [PID]进入线程视图,看哪个线程占CPU多(Java服务可配合jstack [PID]查堆栈)
如果是wa 高:→iostat -x 1 3看 %util 和 await,%util > 90% 或 await > 10ms 说明磁盘慢→iotop -o直接看哪些进程在刷盘(需root)
怀疑内存压力大:
→ps aux --sort=-%mem | head -10找内存大户→dmesg | grep -i "killed process"看有没有OOM Killer干掉过进程
四、深入追踪异常行为(进阶)
当常规命令看不出明显问题时,可以追加深度诊断:对某个可疑进程做系统调用追踪:strace -tt -T -p [PID] -o /tmp/trace.log(观察是否卡在 open/read/write/futex 等系统调用)
检查该进程打开的文件句柄:
lsof -p [PID] | wc -l,超限可能引发阻塞
查网络连接状况:
ss -s看总连接数、TIME-WAIT 数量;
ss -tnp | grep [PID]看它建了哪些连接
查内核级资源争用:
perf top -p [PID](需安装 perf),看热点函数在哪基本上就这些。不复杂但容易忽略的是:别只盯着 load average 数字,一定要同步看 CPU 核心数、wa 值、r 列、available 内存这四个关键信号。它们合起来,才能告诉你系统到底卡在哪一环。
