老李分享:《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为运行队列长度,值是运行队列中轻量级进程的实际数量。
老李分享:《Java Performance》笔记1——性能分析基础 1的更多相关文章
- 《Java Performance》笔记1——性能分析基础 2
4.内存使用率: 内存使用率的相关属性包括页面调度或页面交换.加锁.线程迁移中的让步式和抢占式上下文切换. 当应用运行所需的内存超过可用物理内存时,就会发生内存页面交换,系统在进行页面交换或使用虚拟内 ...
- 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选
Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- 「功能笔记」性能分析工具gprof使用笔记
根据网上信息整理所成. 功能与优劣 gprof实际上只是一个用于读取profile结果文件的工具.gprof采用混合方法来收集程序的统计信息,它使用检测方法,在编译过程中在函数入口处插入计数器用于收集 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- Java集合--ArrayList,LinkedList性能分析
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308900.html 第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口 ...
- java常用容器简要性能分析(List。Map。Set)
嗯,实习的时候看到这个,感觉蛮好,这里摘录学习,生活加油: 我曾经害怕别人嘲笑的目光,后来,发现他们的目光不会在我身上停留太久,人们更愿意把目光放在自己身上. 知乎上看到,讲给自己. List Lis ...
- LR之性能分析基础
1.判断测试结果有效性 2.分析要点提示 3.Analysis主要提供的6大类分析图 4.分析流程
- 深入理解JAVA虚拟机之JVM性能篇---基础知识点(运行时数据区域)
一. 运行数据区域划分 各个数据区域功能如下: 1. 程序计数器: 较小的一块内存空间,可以看做是当前线程所执行的字节码的行号指示器,每条线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立 ...
随机推荐
- [翻译]现代java开发指南 第一部分
现代java开发指南 第一部分 第一部分:Java已不是你父亲那一代的样子 第一部分,第二部分 =================== 与历史上任何其他的语言相比,这里要排除c语言和cobol语言,现 ...
- PDO预处理语句规避SQL注入攻击
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令.在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存 ...
- VUE2.0实现购物车和地址选配功能学习第六节
第六节 地址列表过滤和展开所有的地址 html:<li v-for="(item,index) in filterAddress">js: new Vue({ el:' ...
- jquery的ajax提交后,会跳转页面
今天在写代码的时候,遇到一个很奇怪的问题,一个form表单,用的是ajax的方式提交.结果,在服务器端php中,使用exit(),函数后都不能停止,并且继续跳转到本页.请求如下: 第一个请求中,其实我 ...
- Filebeat issue 排查--single.go:140: ERR Connecting error publishing events (retrying): dial tcp ****:5044: i/o timeout
我个人用docker搭建了一套日志分析平台:ELK+Filebeat 在正常跑了半个多月之后,Kibana刷新日志时突然发现日志不在更新了,停在某个时刻,就再也没有新log. 首先我查看了elk,lo ...
- Java程序员入门:Java程序员面试失败的5大原因
1 说得太少 尤其是那些开放式的问题,如"请介绍下你自己"或"请讲一下你曾经解决过的复杂问题".面试官会通过你对这些技术和非技术问题的回答来评估你的激情.他们也 ...
- Servlet中过滤器的执行流程
- 3385: [Usaco2004 Nov]Lake Counting 数池塘
3385: [Usaco2004 Nov]Lake Counting 数池塘 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 22 Solved: 21 ...
- C#三层构架
三层构架:表示层(即界面层UI)->业务逻辑层(Business logic level)->数据访问层(Database access level) 由于层是一种弱耦合结构,层与层之间的 ...
- MySQL表-----查询------
``模糊查询4.2.1[使用like进行模糊查询]注意:like运算副只用于字符串,所以仅与char和varchar数据类型联合使用例:select * from a where name like ...