老李分享:《Java Performance》笔记1——性能分析基础 1

老李分享:《Java Performance》笔记1——性能分析基础

1.性能分析两种方法:

(1).自顶向下:

应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会。

(2).自底向上:

性能专家从软件栈底层的CPU统计数据(例如CPU高速缓存未命中率、CPU指令效率)开始,逐渐上升到应用自身的结构或应用常见的使用方式。

2.CPU使用率:

大多数操作系统的CPU使用率分为用户态CPU使用率和系统态CPU使用率。

用户态CPU使用率:执行应用程序代码的时间占总CPU时间的百分比。

系统态CPU使用率:应用执行操作系统调用的时间占总CPU时间的百分比。

系统态CPU使用率高意味着共享资源有竞争或者I/O设备之间有大量交互。既然原本用于执行操作系统调用的CPU周期也可以用来执行应用程序代码,所以理想情况下,应用达到最高性能和扩展性时,它的系统态CPU使用率为0%,所以提供应用性能的和扩展性的一个目标是尽可能降低系统态CPU使用率。

对于计算密集型应用来说,不仅要监控用户态和系统态CPU使用率,还要进一步监控每时钟指令数(Instructions Per Clock, IPC)或每指令时钟周期(Cycles Per Instruction, CPI)等指标,提高计算密集型应用的常用策略是减少停滞(现代操作系统自带的CPU使用率监控工具只能报告CPU使用率,不能报告CPU执行指令占用CPU时钟周期的百分比,因此即便CPU在等待内存中的数据,操作系统工具仍然会报告CPU繁忙,这种情况通常被称为停滞)或者改善CPU高速缓存使用率,从而减少CPU在等待内存数据时浪费的时钟周期。

(1).Windows CPU使用率监控:

Windows最常用的CPU使用率监控工具是任务管理器和性能监视器,这两个图形化工具不做介绍,重点介绍一下命令行工具typeperf.

在命令行中监控系统态和用户态CPU使用率的命令行如下:

typeperf “\Processor(_Total)\% Privileged Time” “\Processor(_Total)\% User Time”

也可以将性能计数器列表写入文件,然后将文件名传给typeperf来使用,例如将系统态和用户态CPU使用率性能计数器写入如下的cpu-util.txt文件中:

\Processor(_Total)\% Privileged Time

\Processor(_Total)\% User Time

然后使用typeperf调用,如下:

typeperf -cf cpu-util.txt

下面的命令使用typeperf统计用户态CPU使用率、系统态CPU使用率和总CPU使用率:

typeperf “\Processor(_Total)\% User Time” “\Processor(_Total)\% Privileged Time” “\Processor(_Total)\% Processor Time”

(2).Linux CPU使用率监控:

Linux上可以使用图形化工具GNOME System Monitor(GNOME系统监视器,通过gnome-system-monitor命令启动)或者xosview监控CPU使用率,这里重点介绍命令行工具。

A. vmstat:

vmstat可以设定报告的时间间隔(秒级),如果不指定报告间隔,则输出自系统最近一次启动以来的总CPU使用率。vmstat输出的us是用户态CPU使用率,sy是系统态CPU使用率,id是空闲率或CPU可用率。

B. mpstat:

mpstat可以监控每个虚拟处理器的CPU使用率,有助于发现应用中是一些线程比其他线程消耗了更多CPU周期,还是应用的所有线程基本平分CPU周期,如果是后者表明应用的扩展性比较好,注意大部分的Linux需要安装sysstat包才能使用mpstat.

mpstat输出的usr是执行用户代码时所用CPU时间的百分比,sys是执行内核代码时所用CPU时间的百分比,wt是等待时间的百分比(不再计入,一直为0),idl是CPU空闲时间的百分比。

C. top:

Linux top命令不仅包括CPU使用率,也包括进程统计数据和内存使用率

3.CPU调度程序运行队列:

CPU调度程序运行队列中存放的是那些已经准备好运行、整等待可用CPU的轻量级进程,如果准备运行的轻量级进程数超过系统所能处理的上限,运行队列就会很长,运行队列长表明系统负载可能已经饱和。

系统运行队列长度等于虚拟处理器的个数时,用户不会明显感觉到性能下降,当运行队列长度达到虚拟处理器的4倍或更多时,系统的响应就非常迟缓了。

CPU调度程序运行队列性能调优的一般原则:如果在很长一段时间里,运行队列的长度一致都超过虚拟处理器个数的1倍,就需要关注了,只是暂时不需要立即采取行动。如果在很长一段时间里,运行队列的长度达到虚拟处理器个数的3~4倍或更高,则需要立即采取行动。

解决CPU调用程序运行队列过长有以下两个方法:

a.增加CPU以分担负载或减少处理器的负载量,从根本上减少了每个虚拟处理器上的活动线程数,从而减少运行队列中的轻量级进程数。

b.分析系统中运行的应用,改进CPU使用率。程序员可以通过更有效的算法和数据结构来实现更好的性能,性能专家通过减少代码路径长度或完成同样任务更少CPU指令的算法来提高性能。

(1).Windows CPU调度程序运行队列监控:

typeperf可以监控运行队列长度,监控命令如下:

typeperf “\System\Processor Queue Length”

下面是typeperf每5秒(默认是每1秒)监控输出运行队列长度的命令:

typeperf -si 5 “\System\Processor Queue Length”

(2).Linux CPU调度程序运行队列监控:

Linux中可以使用vmstat命令监控运行队列长度,vmstat输出的第一列即r为运行队列长度,值是运行队列中轻量级进程的实际数量。

时间: 2024-12-31 10:16:58

老李分享:《Java Performance》笔记1——性能分析基础 1的相关文章

《Java Performance》笔记1——性能分析基础 2

4.内存使用率: 内存使用率的相关属性包括页面调度或页面交换.加锁.线程迁移中的让步式和抢占式上下文切换. 当应用运行所需的内存超过可用物理内存时,就会发生内存页面交换,系统在进行页面交换或使用虚拟内存时,应用会表现出明显的性能问题.为了应对这种可能出现的情况,通常要为系统配置swap空间,swap空间一般会在一个独立的磁盘分区上,当应用耗尽物理内存时,操作系统会将应用中最少运行的部分置换到磁盘上的swap空间,当访问应用被置换出去的数据时,就必须将它从磁盘置换进物理内存,而这种置换活动会对性能

java学习笔记14--多线程编程基础1

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为一个进程,例如:用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 进程要占用相当一部分处理器时间和内存资源 进程具有独立的内存空间 通信很不方便,编程模型比较复杂 多线程 一个程序中多段代码同时并发执行,称为多线程,线程比进程开销小,协作和数据交换容易

java学习笔记_内存分析

程序执行时内存一般被分为4部分 代码区(code segment):存放代码 数据区(data segment):静态变量和字符串常量 栈(stack): 存放局部变量 堆(heap):动态生成内存(new出来的东西) 代码如下: public class Person{ int id; int age; Person(int _id,int _age){ id = _id; age = _age; } public static void main(String[] args){ Person

LR之性能分析基础

1.判断测试结果有效性 2.分析要点提示 3.Analysis主要提供的6大类分析图 4.分析流程

java学习笔记15--多线程编程基础2

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡的过程 一个线程在任何时刻都处于某种线程状态(thread state) 线程生命周期状态图 诞生状态 线程刚刚被创建 就绪状态 线程的 start 方法已被执行 线程已准备好运行 运行状态 处理机分配给了线程,线程正在运行 阻塞状态(Blocked) 在线程发出输入/输出请求且必须等待其返回 遇到

java学习笔记(二)基础语法(上)

Java 作为一门编程语言,与其它语言一样,有字符集,标识符和关键字,变量,常量,语句等编程语言的基本要素. 关键字:abstract抽象的,boolean布尔型,break跳出循环,continue中止本次循环,byte字节型,case,catch,char,class,const,default,do,double,else,extends,assert,final,finally,float ,for,if,implements,import,instandceof,int,interfa

深入理解JAVA虚拟机之JVM性能篇---基础知识点

一.堆与栈 堆和栈是程序运行的关键,其间的关系有必要理清楚,两者如下图所示: 1. 堆: 所有线程共享,堆中只负责存储对象信息. 2. 栈: 在Java中每个线程都会有一个相应的线程栈与之对应(因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈),栈是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关的信息,包括局部变量.程序运行状态.方法返回值等; 3. 总结: 栈是运行时的单位,而堆是存储的单位. 二.JAVA对象的大小 在Java中,一个空Object对象的大小是8byte,这

Java几款性能分析工具的对比

在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻辑来提升,甚至达到极限.为了更详细的了解这一点,我们需要做一些性能分析... 在给客户进行应用程序维护的过程中,我注意到一些关于高负载条件下的性能问题.理论上,增加对应用程序的负载会使性能有所下降,但是我认为性能下降的比率远远高于负载的增加,同时我也发现,性能可以通过改变应用程序的逻辑来提升.为了更

性能分析神器VisualVM

VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优.这些功能包括生成和分析海量数据.跟踪内存泄漏.监控垃圾回收器.执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作.本文主要介绍如何使用 VisualVM 进行性能分析及调优. 目录: 准备工作 内存分析篇 内存堆Heap 永久保留区域PermGen CPU分析篇 线程分析篇 参考文献 准备工作 自从 JDK 6 Update 7 以