基础

对于CPU层面的监控主要以下几个点:

  • 是否系统态CPU的占用率高
  • CPU运行队列中待运行的任务数
  • 是否CPU停滞多,每时钟指令数(IPC)少(高级点,对于计算密集型的应用需要关注)

系统态CPU占用率高意味着共享资源有竞争或者有大量的I/O交互,因为这两类都会导致频繁的线程切换,所以会有大量的操作系统调用。

CPU调度程序运行队列中就是那些已准备好运行,正等待可用CPU的任务数(线程)。运行队列长度等于处理器个数时,不会有明显的性能下降。长度达到处理器个数的1倍时,则需要警惕了。而如果在较长的一段时间内,运行队列的长度达到处理器个数的3~4倍或者更多是,系统相应就会很慢了。

CPU停滞是指执行CPU指令所需的数据不在寄存器或者高速缓存中,需要从内存中调换,这时候就会导致CPU的停滞,但它仍然占用了CPU的时钟周期,所以会显示CPU还是很繁忙。

标准

一般不超出下面指标的情况都可以任务CPU处于合理的运行状态中

  • 运行队列——每个处理器的运行队列不应多于1-3个。例如一个双核处理器的运行队列不应当多于6个进程。
  • CPU利用率——如果CPU充分利用,应该达到一下的平衡比例

    – 65-70%的用户时间

    – 30-35%的系统时间

    – 0-5%的空闲时间
  • 上下文切换——上下文切换的数量直接决定了CPU的利用率。如果CPU利用率保持在上述的平衡比列,那么大量的上下文切换是正常的

监控工具

监控使用率

对于使用率的健康常用的工具有:vmstat,mpstat,top

vmstat

输入如下:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 4710712 369028 1433668 0 0 11 22 380 70 15 3 82 0 0
0 0 0 4710892 369032 1433764 0 0 0 26 161 361 0 0 99 0 0
0 0 0 4710768 369040 1433764 0 0 0 8 150 292 0 0 100 0 0

输出的最后一列,即为cpu的占用率。

mpstat

mpstat用于观察多核CPU每一核的状态,同时它包含了更多的输出信息,例如

Linux 3.13.0-43-generic (X230) 	2014年12月14日 	_x86_64_	(4 CPU)

17时24分18秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17时24分18秒 all 15.03 0.01 3.05 0.02 0.00 0.00 0.00 0.00 0.00 81.89
17时24分18秒 0 11.35 0.02 2.39 0.02 0.00 0.00 0.00 0.00 0.00 86.21
17时24分18秒 1 16.29 0.01 3.24 0.02 0.00 0.00 0.00 0.00 0.00 80.44
17时24分18秒 2 18.19 0.01 3.84 0.01 0.00 0.01 0.00 0.00 0.00 77.95
17时24分18秒 3 16.36 0.01 3.11 0.01 0.00 0.00 0.00 0.00 0.00 80.51 17时24分18秒 CPU intr/s
17时24分18秒 all 500.49
17时24分18秒 0 36.19
17时24分18秒 1 30.58
17时24分18秒 2 34.01
17时24分18秒 3 30.69 17时24分18秒 CPU 0/s 1/s 8/s 9/s 12/s 16/s 23/s 40/s 41/s 42/s 43/s 44/s 45/s 46/s NMI/s LOC/s SPU/s PMI/s IWI/s RTR/s RES/s CAL/s TLB/s TRM/s THR/s MCE/s MCP/s ERR/s MIS/s
17时24分18秒 0 0.00 0.08 0.00 0.00 0.21 0.17 0.00 0.00 1.32 0.00 0.02 21.08 3.41 0.00 0.00 102.20 0.00 0.00 1.03 0.00 18.50 0.01 1.08 0.00 0.00 0.00 0.00 0.00 0.00
17时24分18秒 1 0.00 0.00 0.00 0.01 0.22 0.07 0.00 0.00 0.37 0.00 0.12 0.00 12.64 0.00 0.00 76.54 0.00 0.00 0.87 0.00 16.62 0.01 0.94 0.00 0.00 0.00 0.00 0.00 0.00
17时24分18秒 2 0.00 0.00 0.00 0.00 0.10 0.24 0.00 0.00 0.40 0.00 0.00 0.01 0.73 0.00 0.00 113.41 0.00 0.00 0.99 0.00 21.63 0.01 1.02 0.00 0.00 0.00 0.00 0.00 0.00
17时24分18秒 3 0.00 0.00 0.00 0.00 0.09 0.43 0.00 0.00 0.50 0.00 0.00 0.00 0.80 0.00 0.00 83.13 0.00 0.00 0.78 0.00 17.68 0.01 0.88 0.00 0.00 0.00 0.00 0.00 0.00 17时24分18秒 CPU HI/s TIMER/s NET_TX/s NET_RX/s BLOCK/s BLOCK_IOPOLL/s TASKLET/s SCHED/s HRTIMER/s RCU/s
17时24分18秒 0 0.17 18.95 0.01 0.04 1.31 0.00 0.25 9.62 0.15 5.69
17时24分18秒 1 0.07 16.35 0.01 0.23 0.37 0.00 0.08 8.38 0.11 4.99
17时24分18秒 2 0.24 18.77 0.01 0.02 0.40 0.00 0.24 8.62 0.14 5.57
17时24分18秒 3 0.43 16.23 0.01 0.01 0.50 0.00 0.43 8.05 0.11 4.92
top

用top查看cpu信息时主要是可以查看每个java线程占用的CPU,再结合jstack的信息,可以发现占用CPU较高的线程,以及该线程当前在做的任务。

输入top命令后,按“H”键,或者直接用top -H启动top,即可按线程查看。

top - 17:37:02 up 23:14,  2 users,  load average: 0.31, 0.18, 0.13
Threads: 495 total, 1 running, 494 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.8 us, 0.6 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 7894256 total, 3353116 used, 4541140 free, 370244 buffers
KiB Swap: 8102908 total, 0 used, 8102908 free. 1486564 cached Mem
Locate string
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1305 root 20 0 342460 61712 49948 S 2.0 0.8 13:18.28 Xorg
5840 ronry 20 0 847116 45540 21932 S 2.0 0.6 0:06.96 /usr/bin/termin
2195 ronry 20 0 1487912 91888 35680 S 0.7 1.2 16:39.39 compiz
8 root 20 0 0 0 0 S 0.3 0.0 0:03.33 rcuos/0
39 root 20 0 0 0 0 S 0.3 0.0 0:00.37 ksoftirqd/3
1227 root 20 0 4368 712 536 S 0.3 0.0 0:07.59 acpid
7386 ronry 20 0 1478608 128360 63084 S 0.3 1.6 3:17.79 Chrome_IOThread
7634 root 20 0 0 0 0 S 0.3 0.0 0:01.10 kworker/u16:1
8152 ronry 20 0 29440 1992 1164 R 0.3 0.0 0:00.10 top
1 root 20 0 33900 3212 1468 S 0.0 0.0 0:01.39 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd

需要注意的是,top的pid是十进制的,与jstack的信息对比时,需要将其转换成16进制,才能找到对应线程的stack信息。

监控CPU调度程序运行队列

监控运行队列的长度使用vmstat命令,命令输出的第一行就是队列的长度。

调优

对于CPU层面的性能问题,一般可以从以下方面入手进行调优:

  • 寻找更高效的算法(减少CPU的计算量)
  • 减少线程切换(I/O等待,资源竞争)

JVM性能监控与优化笔记(CPU)的更多相关文章

  1. 性能调优之Java系统级性能监控及优化

    性能调优之Java系统级性能监控及优化   对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化 ...

  2. Linux指令--性能监控和优化命令相关指令

    原文出处:http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html.感谢作者无私分享 性能监控和优化命令相关指令有:top,free,v ...

  3. 第八章 JVM性能监控与故障处理工具(2)

    注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处 ...

  4. Linux性能监控与分析之--- CPU

    Linux性能监控与分析之--- CPU 望月成三人关注 2016.07.25 18:16:12字数 1,576阅读 2,837 CPU性能指标 用户进程使用CPU的比率 系统进程使用CPU的比率 W ...

  5. jvm性能监控与故障处理工具

    jdk为我们提供了一系列的jvm性能监控和故障处理工具,在这里根据学习进度进行整理记录.便于之后查阅 1.jps 虚拟机进程工具  类似于Linux系统中的ps命令,用于查看虚拟机进程,常用的有以下功 ...

  6. JVM性能分析与优化

    JVM性能分析与优化: http://www.docin.com/p-757199232.html

  7. JVM性能监控

    有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 这些问题在日常开发中可能被很多人忽 ...

  8. JVM性能监控与故障处理命令行工具

    JDK命令行工具 Sun公司作为”礼物“赠送给JDK使用者的工具: 这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装,主要功能代码是在tools类库(不属于java的标准API) ...

  9. 第七章 JVM性能监控与故障处理工具(1)

    1.定位系统问题 依据 GC日志 堆转储快照(heapdump/hprof文件) 线程快照(threaddump/javacore文件) 运行日志 异常堆栈 分析依据的工具 jps:显示指定系统内的所 ...

随机推荐

  1. 禁用 Windows Azure 网站中的 ARR 实例关联

    编辑人员注释: 本博客文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 在 Windows Azure 网站中设置网站的多个实例是横向扩展网站的绝佳方式,Azur ...

  2. 基于visual Studio2013解决C语言竞赛题之0305显示星期

     题目 解决代码及点评 这道题锻炼我们switch分支语句,对于条件太多时,用if符合条件分支是比较复杂的 可以使用switch代替 //5. 读入1到7之间的某个数,输出表示一星期中相应的 // ...

  3. POJ 1472 Coins (多重背包+滚动数组)

    Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 25827 Accepted: 8741 Description Pe ...

  4. 【甘道夫】使用HIVE SQL实现推荐系统数据补全

    需求 在推荐系统场景中,假设基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果非常可能达不到要求的数量. 比方,希望针对每一个item或user推荐20个item,可是通过计算仅仅得到8个 ...

  5. git 使用过程(四、回退版本)

    1.查看修改历史 命令:git log  如果嫌内容太多 可以加参数  --pretty=oneline (图一) 2.回退 命令:git reset --hard HEAD^    HEAD:代表本 ...

  6. E - Fibonacci Again(找规律)

    逐渐发现找规律的美妙之处啦,真不错,用普通方法解决很久或者很麻烦的问题,找到规律就很方便,算法最主要还是思想 Description There are another kind of Fibonac ...

  7. MFC、C++ 、Windows编程高手

    cnblogs: DoubleLi 1. DoubleLi  白手起家Win32SDK应用程序 http://www.cnblogs.com/lidabo/p/3450178.html#_Toc309 ...

  8. c++, 派生类的构造函数和析构函数 , [ 以及operator=不能被继承 or Not的探讨]

    说明:文章中关于operator=实现的示例,从语法上是对的,但逻辑和习惯上都是错误的. 参见另一篇专门探究operator=的文章:<c++,operator=>http://www.c ...

  9. 【 D3.js 入门系列 — 4 】 如何使用比例尺( scale )

    上一章中使用了一个很重要的概念 — 比例尺( scale ),本节将解说其使用方法. 1. 最大值和最小值 在介绍比例尺( scale )之前,先介绍两个经常和比例尺一起出现的函数,在[第3章]中也出 ...

  10. 转:python中函数curry化

    1 柯里化(Currying) 一个函数有多个参数,我们希望能固定其中几个参数的值. from functools import partial def foo(a,b,c): return a+b+ ...