第一种:用top命令 中的cpu 信息观察
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si
Tasks: 29 total 进程总数
1 running 正在运行的进程数
28 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
Cpu(s):
0.3% us 用户空间占用CPU百分比
1.0% sy 内核空间占用CPU百分比
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比
98.7% id 空闲CPU百分比
0.0% wa 等待输入输出的CPU时间百分比
0.0% hi
0.0% si
0.0% wa 的百分比可以大致的体现出当前的磁盘io请求是否频繁。如果 wa的数量比较大,说明等待输入输出的的io比较多。
CPU使用率较低但负载较高,问题描述:
Linux 系统没有业务程序运行,通过 top观察,类似如下图所示,CPU 很空闲,但是 load average 却非常高:

另外一个查看负载命令uptime
[spuser@tzddbackend01 ServerAgent-2.2.3]$ uptime
09:33:12 up 60 days, 17:00, 1 user, load average: 0.01, 0.03, 0.05
处理办法:
load average 是对 CPU 负载的评估,其值一般与cpu的核心数相当为好,其值越高,说明其任务队列越长,处于等待执行的任务越多。
出现此种情况时,可能是由于僵死进程导致的。可以通过指令 ps -axjf 查看是否存在 D 状态进程。
D 状态是指不可中断的睡眠状态。该状态的进程无法被 kill,也无法自行退出。只能通过恢复其依赖的资源或者重启系统来解决。
CPU占用过高分析,可以用top命令查看哪一个进程占用cpu高 或者哪一个占用内存大
Tasks: 161 total, 1 running, 160 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.7 us, 0.3 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16267564 total, 271608 free, 9033932 used, 6962024 buff/cache
KiB Swap: 8388604 total, 8364736 free, 23868 used. 5913400 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29433 wuuser 20 0 7805852 1.132g 19216 S 0.7 7.3 6:07.13 java
29355 wuuser 20 0 6909304 1.093g 17248 S 0.3 7.0 2:29.96 java
29558 wuuser 20 0 7763476 974788 15860 S 0.3 6.0 1:54.47 java
29945 wuuser 20 0 7793536 1.202g 21344 S 0.3 7.7 4:31.02 java
可以看到占用最高的是29433
用top -H -p pid命令查看进程内各个线程占用的CPU百分比top -H -p 29433cpu消耗情况
Threads: 132 total, 0 running, 132 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.1 us, 0.0 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16267564 total, 271024 free, 9034476 used, 6962064 buff/cache
KiB Swap: 8388604 total, 8364736 free, 23868 used. 5913044 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29433 wuuser 20 0 7805852 1.132g 19216 S 0.0 7.3 0:00.00 java
29436 wuuser 20 0 7805852 1.132g 19216 S 0.0 7.3 0:08.91 java
29437 wuuser 20 0 7805852 1.132g 19216 S 0.0 7.3 0:00.34 java
29438 wuuser 20 0 7805852 1.132g 19216 S 0.0 7.3 0:00.35 java
29439 wuuser 20 0 7805852 1.132g 19216 S 0.0 7.3 0:00.34 java
29440 wuuser 20 0 7805852 1.132g 19216 S 0.0 7.3 0:00.34 java
29441 wuuser 20 0 7805852 1.132g 19216 S 0.0 7.3 0:00.34 java
上面看到线程29436占用高时长多
接着 使用printf “%x\n” 线程号将异常线程号转化为16进制printf “%x\n” 29436
72fc
接着使用gstack 29433|grep 72fc -A90来定位出现异常的代码.
"main" prio=10 tid=0x00007f16fc00e000 nid=0x72fc in Object.wait() [0x00007f17056d9000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x0000000778044670> (a java.lang.Class for com.wu.mortgage.service.OrderServiceStartup)
at java.lang.Object.wait(Object.java:503)
at com.wu.mortgage.service.OrderServiceStartup.main(OrderServiceStartup.java:47)
- locked <0x0000000778044670> (a java.lang.Class for com.wu.mortgage.service.OrderServiceStartup)
"VM Thread" prio=10 tid=0x00007f16fc14a000 nid=0x7309 runnable
"Gang worker#0 (Parallel GC Threads)" prio=10 tid=0x00007f16fc01f800 nid=0x72fd runnable
"Gang worker#1 (Parallel GC Threads)" prio=10 tid=0x00007f16fc021800 nid=0x72fe runnable
"Gang worker#2 (Parallel GC Threads)" prio=10 tid=0x00007f16fc023000 nid=0x72ff runnable
"Gang worker#3 (Parallel GC Threads)" prio=10 tid=0x00007f16fc025000 nid=0x7300 runnable
"Gang worker#4 (Parallel GC Threads)" prio=10 tid=0x00007f16fc027000 nid=0x7301 runnable
"Gang worker#5 (Parallel GC Threads)" prio=10 tid=0x00007f16fc029000 nid=0x7302 runnable
"Gang worker#6 (Parallel GC Threads)" prio=10 tid=0x00007f16fc02b000 nid=0x7303 runnable
"Gang worker#7 (Parallel GC Threads)" prio=10 tid=0x00007f16fc02d000 nid=0x7304 runnable
"Concurrent Mark-Sweep GC Thread" prio=10 tid=0x00007f16fc106800 nid=0x7307 runnable
"Gang worker#0 (Parallel CMS Threads)" prio=10 tid=0x00007f16fc102000 nid=0x7305 runnable
"Gang worker#1 (Parallel CMS Threads)" prio=10 tid=0x00007f16fc104000 nid=0x7306 runnable
"VM Periodic Task Thread" prio=10 tid=0x00007f16fcbed800 nid=0x7314 waiting on condition
JNI global references: 522
load average值的含义
Linux系统中的Load是对当前CPU工作量的度量,简单的说是进程队列的长度。
Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。
上边0.31,0.30,0.31表示:
第一位0.31:表示最近1分钟平均负载
第二位0.30:表示最近5分钟平均负载
第三位0.31:表示最近15分钟平均负载
注:linux系统是5秒钟进行一次Load采样
1) 单核处理器
假设我们的系统是单CPU单内核的,把它比喻成是一条单向马路,把CPU任务比作汽车。当车不多的时候,load <1;当车占满整个马路的时候 load=1;当马路都站满了,而且马路外还堆满了汽车的时候,load>1
2) 多核处理器
我们经常会发现服务器Load > 1但是运行仍然不错,那是因为服务器是多核处理器(Multi-core)。
假设我们服务器CPU是2核,那么将意味我们拥有2条马路,我们的Load = 2时,所有马路都跑满车辆。
3)什么样的Load average值要提高警惕
0.7 < load < 1: 此时是不错的状态,如果进来更多的汽车,你的马路仍然可以应付。
load = 1: 你的马路即将拥堵,而且没有更多的资源额外的任务,赶紧看看发生了什么吧。
load > 5: 非常严重拥堵,我们的马路非常繁忙,每辆车都无法很快的运行
4)三种Load值,应该看哪个
通常我们先看15分钟load,如果load很高,再看1分钟和5分钟负载,查看是否有下降趋势。
1分钟负载值 > 1,那么我们不用担心,但是如果15分钟负载都超过1,我们要赶紧看看发生了什么事情。所以我们要根据实际情况查看这三个值
查看物理CPU个数
cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l
查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep “cpu cores”| uniq
查看CPU型号
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
[spuser@tzddbackend01 ServerAgent-2.2.3]$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
1 Intel(R) Xeon(R) Bronze 3106 CPU @ 1.70GHz
[spuser@tzddbackend01 ServerAgent-2.2.3]$
文章来源:www.rakbuluo.com/p73