基础

对于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. 将 Java Spring Framework 应用程序迁移到 Windows Azure

    我们刚刚发布了一个新教程和示例代码,以阐述如何在Windows Azure中使用 Java 相关技术.在该指南中,我们提供了分步教程,说明如何将 Java Spring Framework 应用程序( ...

  2. Hdu 2364 Escape

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=2364 这道题的特殊之处在于能转弯时不能直走,必须转弯,所以在行走时,要判断能否转弯,不能转弯 ...

  3. ARPU_百度百科

    ARPU_百度百科 ARPU

  4. PHP - __clone 对象克隆

    <?php /** * 此例子解释什么是深克隆. * 克隆学生类. */ class Student { public $name = '张三'; public $age = 12; //所属老 ...

  5. js中的总结汇总(以后的都收集到这篇)

    点1:js中的比较字符串是否相等,js中是用"=="这个来判断是否相等,这点跟java中不一样,java中是.equals()这种方法. 在之前写的ajax的demo中,因为用了. ...

  6. ZOJ 3818 Pretty Poem 模拟题

    这题在比赛的时候WA到写不出来,也有判断ABC子串不一样不过写的很差一直WA 在整理清思路后重写一遍3Y 解题思路如下: 第一种情况:ABABA. 先判断开头的A与结尾的A,得到A的长度, 接着判断A ...

  7. HttpResponseRedirect VS HttpResponse

    当我们处理了post提交的数据之后,我们使用HttpResponseRedirect跳转到另一个页面,而不是用HttpResponse. 例如当一个投票环节时使用HttpResponse可以使用浏览器 ...

  8. 使用jquery获取ul的li的值赋值

    jquery:$('#dropdownMenu1').val(str);不jquery:document.getElementById('dropdownMenu1').value = str;

  9. 转:什么是 HTTP Headers?

    什么是HTTP Headers HTTP是“Hypertext Transfer Protocol”的所写,整个万维网都在使用这种协议,几乎你在浏览器里看到的大部分内容都是通过http协议来传输的,比 ...

  10. vnc server配置、启动、重启与连接,图形管理linux系统

    环境:RedHat Linux 5企业版.Xwindows:gnome (红帽默认安装的图形界面) 尽管我们可以使用SSH连接远程通过字符界面来操作Linux,但是对于更多熟悉图形人来说是很不方便的, ...