免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 604 | 回复: 0

[桌面虚拟化] linux-CPU分析 [复制链接]

论坛徽章:
2
黑曼巴
日期:2019-07-02 13:59:0215-16赛季CBA联赛之山东
日期:2019-10-08 12:31:56
发表于 2019-09-24 13:57 |显示全部楼层
第一种:用top命令 中的cpu 信息观察
Cpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% siTasks: 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]$ uptime09: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 stKiB Mem : 16267564 total,   271608 free,  9033932 used,  6962024 buff/cacheKiB 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 stKiB Mem : 16267564 total,   271024 free,  9034476 used,  6962064 buff/cacheKiB 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

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,早鸟票抢购!

PostgreSQL中国大会,早鸟票抢购!
2019年11月29~11月30日,由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。




----------------------------------------

点击报名>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP