zoukankan      html  css  js  c++  java
  • 老李分享:《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 “SystemProcessor Queue Length”

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

    typeperf -si 5 “SystemProcessor Queue Length”

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

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

  • 相关阅读:
    NPOI json转Excel DataTable转Excel ,Excel转DataTable
    sqlhelper;
    C# DataSet数据导入Excel 修正版- .net FrameWork 4.0以上
    asp.net core 教程(七)-异常处理、静态文件
    asp.net core 教程(六)-中间件
    asp.net core 教程(五)-配置
    jQuery_3_过滤选择器
    jQuery_2_常规选择器-高级选择器2
    jQuery_2_常规选择器-高级选择器
    jQuery_2_常规选择器-进阶选择器
  • 原文地址:https://www.cnblogs.com/poptest/p/5064124.html
Copyright © 2011-2022 走看看