.Net性能优化时应该关注的数据

  解决性能问题的时候,我往往会让客户添加下面一些计数器进行性能收集。

  • Process object下的所有计数器;

  • Processor object下的所有计数器;

  • System object下的所有计数器;

  • Memory object下的所有计数器;

  在排查性能问题的时候,重点关注如下数据:

一、Process
object

  Process
object中的计数器可以针对目标进程分析内存,CPU,线程数目和handle数目。首先要确定目标进程,然后分析目标进程的下面一些计数器:

  1、%
Processor Time

  该计数器是该进程占用CPU资源的指标。当进程繁忙的时候,CPU平均占用率应该在80%以内。如果超过该数值,程序可以认为发生了high
CPU的问题。另外一种问题是CPU波动幅度大。虽然平均占用率不高,但是上下跳动频繁。在某一个短时间段里面,会有连续高CPU的情况出现。

  2、Handle
Count

  该计数器记录了当前进程使用的kernel object handle数量。Kernel
object是重要的系统资源。当程序进入稳定运行状态的时候,Handle Count数量也应该维持在一个稳定的区间。如果发现Handle
Count在整个程序周期内总体趋势是连续向上,可以考虑程序是否有Handle Leak。

  3、ID
Process

  该计数器记录了目标进程的进程ID。你可能觉得奇怪,ID有什么好观察的。进程ID是用来观察程序是否有重启发生。比如ASP.NET工作进程可能会自动回收。由于进程名都相同,只有通过进程ID来判断是否进程有重新启动现象。如果ID有变化,考虑程序是否发生崩溃或者Recycle。

  4、Private
Bytes

  该计数器记录了当前通过VirtualAlloc API Commit的Memory数量。无论是直接调用API申请的内存,被Heap
Manager申请的内存,或者是CLR 的managed heap,都算在里面。跟Handle
Count一样,如果在整个程序周期内总体趋势是连续向上,说明有Memory Leak。

  5、Virtual
Bytes

  该计数器记录了当前进程申请成功的用户态总内存地址,包括DLL/EXE占用的地址和通过VirtualAlloc API
Reserve的Memory Space数量,所以该计数器应该总大于Private Bytes。一般来说,Virtual Bytes跟Private
Bytes的变化大致一致。由于内存分片的存在, Virtual Bytes跟Private
Byes一般保持一个相对稳定的比例关系。当Virtual Bytes跟Private
Bytes的比例关系大于2的时候,程序往往有比较严重的内存地址分片。

  查看IIS支持最大的虚拟内存的方式如下:

  

二、Processor
object

  1、Total
Instance

  Processor
object记录系统中芯片的负载情况。由于普通程序并不刻意邦定到某个具体CPU上执行,所以在多CPU机器上观察Total
Instance也就足够了。

  2、%
Processor Time

  该计数器跟Process下的% Processor
Time的意义一样,不过这里记录的是所有进程带来的芯片,而不是针对具体某一个进程。通过把这个计数器跟Process下的同名计数器一起比较,就能看出系统的高CPU问题是否是由于单一的某个进程导致的。

三、System

  System object记录系统中一个整体的统计信息。所以不区分Instance. 通过比较System
object下的counter和其他counter的变化趋势,往往能看出一些线索

  1、Context
Switch/sec

  Context
Switch标示了系统中整体线程的调度,切换频率。线程切换是开销比较大的操作。频繁的线程切换导大量CPU周期被浪费。所以看到高CPU的时候,一定要跟Context
Switch一起比较。如果两者有相同的变化趋势,高CPU往往是由于contention导致的,而不是死循环。

  2、Exception
Dispatches/sec

  Exception
Dispatches表示了系统中异常派发,处理的频繁程序。跟线程切换一样,异常处理也需要大量的CPU开销。分析方法跟Context
Switch雷同。

  3、File
Data Operations/sec

File Data
Operations记录了当前系统中磁盘文件读写的频繁程度。通过观察该计数器跟其他性能指标的变化趋势,通常能够判断磁盘文件操作是否是性能瓶颈。类似的计数器还有Network
Interface\Bytes total/sec

四、Memory

  Memory object记录了当前系统中整体内存的统计信息。

  1、Available
Mbytes与Committed
Bytes

  Available Mbytes记录了当前剩余的物理内存数量。Committed
Bytes记录了所有进程commit的内存数量。结合两个计数器可以观察到:

  • 两者相加可以粗略估计系统总体可用内存多少,便于估计物理配置;

  • 当Available
    Mbytes少于100MB的时候,说明系统总体内存吃紧,会影响到整个系统所有进程的性能。应该考虑增加物理内存或者监察内存泄露;

  • 通过比较Process\Private Bytes跟Virtual
    Bytes,便于进一步确认是否有内存泄露,判断内存泄露是否是某一单个进程导致;

  2、Free System Page Table Entries,Pool Paged
Bytes和Pool Paged Bytes

  这三个计数器可以衡量核心态空闲内存的数量。特别是当使用/3GB开关后,核心态内存地址被压缩,容易导致核心态内存不足,继而引发一些非常妖怪的问题。

  3、.NET
CLR Memory

  .NET CLR Memory
object记录了CLR进程中跟CLR相关的内存信息。该类别下的所有计数器都很有意思,而且意思也非常直接。建议用一个例子程序进行测试和研究。下面是两个最常用的计数器。

  4、Bytes
in all heaps

  Bytes in all heaps记录了上次GC发生时候所统计到的,进程中不能被回收的所有CLR
object占用的内存空间。该计数器不是实时的,每次GC发生的时候该计数器才更新。跟同一进程的Process\Private
bytes比较,可以区分出managed heap和native memory的变化情况。对于memory leak,便于区分是managed
heap的leak还是native memory的leak。

  5、%Time
in GC

  %Time in
GC记录了GC发生的频繁程度。一般来说15%以内算比较正常。当超过20%说明GC发生过于频繁。由于GC不仅仅带来很高的CPU开销,还需要挂起目标进程的CLR线程,所以高频率GC是非常危险的。通过跟CPU利用率和其他性能指标比较,往往能够看出GC对性能的影响。高频率的GC往往因为:

  • 负载过高;

  • 不合理的架构,对内存使用效率不高;

  • 内存泄露,内存分片导致内存压力;  //(执法遇到过)

  如果目标程序是ASP.NET,在ASP.NET开头的object中,下面这些计数器对于测量ASP.NET的性能非常有用。由于不少计数器存在于多个object类别中,下面只列出具体的计数器名字,而不去对应到具体的object:

  6、Application
Restarts

  Application Restarts记录了ASP.NET Application Domain重启的次数。导致ASP.NET
appDomain重启的原因往往是虚拟目录中被修改。比如修改了web.config文件,或者防毒程序对虚拟目录进行扫描。通过该计数器可以观察是否有异常的重启现象。

  7、Request Execution
time

  Request Execution
time记录了请求的执行时间,是衡量ASP.NET性能的最直接参数。通过该计数器的平均值来衡量性能是否合乎预期值。需要注意的地方是由于Windows并非实时系统,所以不能用峰值来衡量整体性能。比如当GC发生的时候,请求执行时间肯定都要超过GC的时间。所以平均值才是有效的标准。

  8、Request
Current

  Request Current记录了当前正在处理的和等待处理的请求。最理想的情况是Request
Current等于CPU的数量,这说明请求跟硬件资源能并发处理的能力恰好吻合,硬件投资正运行在最优状态。但是一般说来,当负荷比较大的时候,Request
Current也随着增高。如果Request
Current在一段时间内有超过10的情况,说明性能有问题。注意观察这个时候对应的CPU情况和其他的资源。如果CPU不高,很可能是程序中有blocking发生,比如等待数据库请求,导致请求无法及时完成。

  9、Request/second

  Request/second计数器记录了每秒钟到达ASP.NET的请求数。这是衡量ASP.NET负载的直接参数。注意观察Request/second是否超过程序的预期吞吐量。如果Request/Second有突发的波动,注意看是否有拒绝服务攻击。通过把Request/second,Request
Current, Request Execution
time和系统资源一起比较,往往能够看出来ASP.NET整体性能的变化和各个因素之间的影响。

  10、Request in Application
Queue

  当ASP.NET没有空余的工作线程来处理新进入的请求的时候,新的请求会被放到Application Queue中。当Application
Queue堆积的请求也超过设定数值的时候,ASP.NET直接返回503 Server too
busy错误,同时丢弃该请求。所以正常情况下,Request in Application
Queue应该总为0,否则说明已经有请求堆积,性能问题严重。

时间: 2024-10-10 10:10:48

.Net性能优化时应该关注的数据的相关文章

Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势

原创文章,转载请务必将下面这段话置于文章开头处.本文转发自技术世界,原文链接 http://www.jasongj.com/spark/skew/ 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitioner,使用Map侧Join代替Reduce侧Join,给倾斜Key加上随机前缀等. 为何要处理数据倾斜(Data Skew) 什么是数据倾斜 对Spark/Hadoop这样的大数据系统来讲,数据量大并不可怕,可怕的是

vuejs开发笔记—IDE选择和WebStorm性能优化、框架特性和数据调用、路由的配置以及原理

一.IDE的选择: VsCode和WebStorm都是不错的选择,两者运行调试都非常的方便都可以使用快捷键运行和停止,就打开项目的速度和对电脑配置的要求来说,vscode要比webstorm要出色很多,如果电脑配置足够好的情况下请忽略前面说的性能问题,具体的使用要看个人的需求和爱好了. 1.先说VsCode的配置: 首先是要装VsCode的扩展插件,点击左上角最后一个图标,在搜索里面输入JavaScript (ES6) snippets/NPM/Vue 2 Snippets: 第二步调试配置:V

性能优化与使用Block实现数据回传(3)

在iOS里关于UIKit的操作都是放在主线程,因此如果主线程被阻塞住了,你的UI可能无法及时响应事件,给人一种卡顿的感觉.大多数阻塞主线程的情况是在主线程做IO操作,比如文件的读写,包含数据库.图片.json文本或者log日志等,尽量将这些操作放放到子线程,或者在后台建立对应的dispatch queue来做这些操作. 前面提到对磁盘缓存的计算与清理,可能要计算大量文件大小,可视为一个耗时操作,我们应该开启一条子线程,把遍历过程放在子线程中执行. 这时候便会发现一个问题,因为在子线程中执行,无法

程序性能优化之网络传输与数据存储优化(五)下

阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将继续从7Z极限压缩和WebP使用来介绍网络传输与数据存储优化: 一.7Z极限压缩 一些文件过大或者是容量太大了,占用硬盘太多空间了.此刻可以使用压缩软件进行压缩,让它的体积变小了.其中极限压缩可以让文件夹或者是文件,压缩的最小.那么如何使用这个极限压缩功能的. ? 1.你要到网上下载这个压缩的程序,点击它,点击[install]. ? ? 2.此刻软件

调度、模型、同步与任务——阿里云大数据数仓建设性能优化方案

摘要:对于阿里云大数据数仓建设性能优化而言,主要可以从调度优化.模型优化.同步优化以及任务优化这四个方面着手.其实,对于性能优化而言,最终还是会归结到"资源"之上,所以资源是否足够,分配是否合理也是我们在进行性能优化时必须考虑的关键所在. 本文将主要围绕以下四个方面进行介绍:调度优化.模型优化.同步优化以及任务优化.对于调度优化而言,将分享任务调度如何进行优化,以及如何看到调度的瓶颈点,以及在初步进行建设和使用数据仓库的任务之后,对于任务如何进行调整来满足业务的时间要求.对于模型优化而

Oracle DBA数据库高级工程师(下部)SQL语言+性能优化+数据复制

套餐介绍: Oracle DBA数据库高级工程师(下部)SQL语言+性能优化+数据复制 http://edu.51cto.com/pack/view/id-973.html 描述 Oracle DBA数据库高级工程师培训课程是风哥独自研发的精品实战课程,本路线图主要是让大家快速就业.高薪就业.课程内容以实战为主(占98%),理论为辅(占2%).本课程知识全面系统实用,结合风哥十年Oracle经验,囊括企业用到的所有知识点,课程包含大量实战案例,涉及Oracle核心技术及底层研究,从零开始学习Or

HoloLens开发与性能优化实践

HoloLens中国版终于于5月底在中国上市,同时国内的技术社区经过一年的成长也有了很大的扩张,越来越多的开发者开始进入了HoloLens开发领域,尝试着使用混合现实(Mixed Reality)技术来构建属于未来的创新应用. HoloLens开发回顾 HoloLens于2016年初正式开始发货,笔者有幸能够拿到第一波上市设备,当时大多流入国内的方式还是通过人肉搬运.当时的HoloLens开发在全球范围内都处于起步阶段,可以利用的开发资源只有官方文档等少数内容,然而今天则非常丰富,下面我们来看这

Android应用开发性能优化完全分析

 应用UI性能问题分析 UI可谓是一个应用的脸,所以每一款应用在开发阶段我们的交互.视觉.动画工程师都拼命的想让它变得自然大方美丽,可是现实总是不尽人意,动画和交互总会觉得开发做出来的应用用上去感觉不自然,没有达到他们心目中的自然流畅细节:这种情况之下就更别提发布给终端用户使用了,用户要是能够感觉出来,少则影响心情,多则卸载应用:所以一个应用的UI显示性能问题就不得不被开发人员重视. 2-1 应用UI卡顿原理 人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然

常见性能优化策略的总结

本文是一位美团老师把之前所做的各种性能优化的案例和方案加以提炼.总结,以文档的形式沉淀下来,并在内部进行分享.力求达到如下效果: 形成可实践.可借鉴.可参考的各种性能优化的方案以及选型考虑点,同时配合具体的真实案例,其他人遇到相似问题时,不用从零开始: 有助于开阔视野,除了性能优化之外,也能提供通用的常见思路以及方案选型的考虑点,帮助大家培养在方案选型时的意识.思维以及做各种权衡的能力: 常见性能优化策略分类: 代码 之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视.很多技术人员拿到