文档章节

DotNet (性能指南) (1)

蓝宇
 蓝宇
发布于 2017/03/25 23:35
字数 2354
阅读 25
收藏 0

在我们进行.Net性能优化之旅之前,我们必须了解性能测试中性能优化的标准和目标。

由业务和运营驱动,对于不同种类的应用程序也有不同的性能指标。应用程序的体系结构影响了性能指标。例如,您的web服务器必须为数百万并发用户提供服务,也规定是缓存和负载均衡服务的分布式系统。性能测试的结果也会间接的促使应用程序体系结构的变化。然而不幸的是,我们已经看到无数个重新设计的应用程序在压力测试中垮掉,更凄凉的是这种事情发生在生产环境中。

根据我们的经验,了解系统环境的极限会使你在性能优化的路上事半功倍。以下是我们在过去几点诊断和修复的例子:

由于测试工程师使用的是共享的4Mbps链路,使得托管中心的强大web服务器检测到严重的性能问题,未能理解关键的性能指标,工程师浪费了数十天去调整web服务器的性能,实际它已是最优。
通过精确时间分配,调整GC flavor去消除烦人的滞后感。调整一个看起来不相关的CLR GC,我们可以就提高rich UI应用程序中的滚动性能。
通过将磁盘移动到SATA端口来解决Microsoft SCSI磁盘驱动程序的错误,同时也可以将编译次数提高十倍。
通过调整WCF序列化机制,我们将WCF服务消息通信时间降低了百分之九十,大大提高了其拓展性和CPU利用率。
我们将一个大型应用程序的启动时间由35s减少到12s,通过压缩在硬盘上300个程序集的代码,理清它们之间的依赖关系,以便lazy load。
性能指标
性能指标通常取决于你的应用程序的领域和架构。在收集需求后,你应该确定一个通用的性能指标。在软件开发中,性能指标可能会跟随需求的变化或新业务的出现而做出调整。应用程序的性能指标的例子,但是任何性能相关的指导方案都需要根据你的软件做相应的改变。
首先,下列例子不是正确的性能指标:
当许多用户同时访问购物车UI时,应用程序应该保持响应。
当用户数合理时,应用程序使用合理的内存。
即使多个应用服务器已经满载,数据库服务器也能提供快速的查询。

以上这些陈述的主要问题是在它们过于主观。如果以上是你提出性能指标你一定能发现其中以上在不同角色的人的认知中,会有不同的理解,这可能会产生分歧。比如从业务分析者的角度来看,可能他认为10W个并发用户是一个非常合理的数字,而技术人员可能知道我们可用的硬件并不能支撑这一数量级的用户。相反,开发人员可能会关注500ms的响应时间是合理的,而UI体验人员可能认为这影响了用户的体验。

性能指标是可以通过一些测试来量化性能标准。它应该包含它的一些自身环境信息。以下是一些良好的性能指标的例子:

只要不超过5000个用户同时访问购物车UI时,该应用程序在“服装”这个类别中的每个页面提供服务的响应时间不超过300ms(不包括网络的往返时间)
应用程序将为每一个空闲回话的用户分配不超4kb的内存
数据库服务器的CPU和磁盘利用率不应该超过百分之七十,只要在“香水”这一类别的查询返回的响应时间应该小于75ms,并且不能超过10台应用服务器去访问它。

下列是一个通用的性能指标列表,这份清单并不详尽,不能用作你的性能指标的模板,只是提供一种参考。
系统类型    性能指标    环境约束
对外Web服务器    请求响应时间不应该超过300ms    同时不超过300个请求
对外Web服务器    虚拟内存(包含缓存)不应该超过1.3G    同时不超过300个请求
不超过5000用户连接的session
应用服务器    CPU利用率不应该超过75%    同时不超过1000个活跃的API请求
应用服务器    Hard page fault rate (注解1)不应该每秒钟超过2个    同时不超过1000个活跃的API请求
智能终端应用程序    从双击桌面快捷方式到显示员工列表的时间不应该超过1500ms    
智能终端应用程序    在应用程序空闲时,CPU的使用率不应该超过1%    
Web页面    过滤和排序收到电子邮件列表的时间不应该超过750ms(包括动画)    不超过200个邮件
Web页面    缓存“chat with representative”javascript对象的内存不应该超过2.5MB    
监控服务    从故障发生到报警的时间不应该超过25ms    
监控服务    不生成警报时,磁盘的利用率应该为0    

注:应用程序的硬件配置也是环境约束中的重要组成。例如你可能要限制智能终端性能指标是在磁盘速度7200RPm+,至少2G的内存,以及1.2GHZ或者更快的处理器。虽然这些并不需要重复出现在性能指标中,但是在性能测试中,这些也至关重要。
注解1:hard page fault是指访问的数据不在虚拟地址空间也不在物理内存中,需要系统从慢速设备(比如磁盘)将对应的数据page读入物理内存,并简历mapping。

当定义好性能指标之后,之后的性能测试以及负载测试和后续的优化都会变得简单。

定义明确的性能指标通常需要先熟悉性能的标准。

性能标准
与性能指标不同性能标准不会与特定的场景或环境相关。性能标准是一个反映应用程序行为的可衡量的数值。你可以在任何硬件环境或环境中,无论用户数,请求数,和会话数进行测量。在开发过程中,你可以根据性能标准从中推导出具体的性能指标。

性能标准                            衡量单位
CPU Utilization                 Percent 

Physical/Virtual
Memory Usage                Bytes, kilobytes,
                                         Megabytes, gigabytes
Cache Misses                   Count, rate/second

Database Access
Counts/Timing                 Count, rate/second, milliseconds --

Allocations                        Number of bytes,
                                          Number of objects, rate/second

Execution Time                 Milliseconds 

Network Operations         Count, rate/second 

Disk Operations Count     Count, rate/second

Response Time                  Milliseconds 

Garbage Collections          Count, rate/second, duration
                                          (milliseconds), % of total time
Exceptions Thrown            Exceptions Thrown

Startup Time                      Milliseconds 

Contentions                       Count, rate/second 

某些标准和其应用程序的种类相关,例如数据库访问时间并不是客户端应用程序衡量的标准。性能标准与一些常见的应用程序的组合如下:
对于客户端应用程序来说,你可以关注启动时间,内存使用情况和CPU使用率。
对于web应用程序来说,你通常会测量内存使用情况,数据库访问,网络,磁盘以及请求的响应时间
对于计算服务应用来说,你通常会关注CPU使用率,缓存命中,争用,资源分配和GC
软件开发周期的性能
在什么软件开发周期的什么时候去关心性能?如果有可能,应该在软件开发的每个步骤都去了解应用程序的性能。首先确定性能指标,接下来检测应用程序是否超过或者达到相应的指标,最后根据用户负载,需求决定是否回归。
1.在需求搜集阶段,就应该去思考你预计达到的性能指标。
2.在确定体系结构时,就应该去改进你为你的应用程序设计的性能指标
3.在开发阶段,应该经常对系统原型代码以及完成的部分功能进行性能测试,验证是否达到相应的性能指标。
4.在测试阶段,应该进行负载以及相应的性能测试,验证你设定的性能指标
5.在后续的开发以及维护时,应该对每个版本(最好是每周或者每天)进行额外的负载以及性能测试。快速发现系统性能问题进行回归。

(如果条件允许)我们应该花时间去开发一套自动负载测试和性能测试的软件(有可能是shell),建立一个单独的测试环境,仔细对测试的结果进行分析,帮助我们的用最小的代价,条件所允许的性能的极致。

© 著作权归作者所有

蓝宇
粉丝 1
博文 7
码字总数 5793
作品 0
呼和浩特
私信 提问
树莓派安装.net core 2.1

0.更新源 sudo apt-get update 1.安装依赖 sudo apt-get install curl libunwind8 gettext 2.下载 SDK 或者 RunTime https://www.microsoft.com/net/download/linux curl -sSL -o dotnet.tar......

蓝曈魅
2018/07/16
0
0
vs2017 编码约定——.editorconfig文件

源码来自:https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference EditorConfig Visual Studio code style preferences - VS2017中的EditorConfi......

QQZZFT
2018/07/05
0
0
.net core EF 命令

http://www.bsjobjob.com 璧山人才网,璧山招聘网 https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-2.0 ef 命令 https://github.com/aspnet/EntityFrameworkCore 开源地址 .n......

phantasy
2017/06/29
0
0
[Cake] 2. dotnet 全局工具 cake

在上篇博客[Cake] 1. CI中的Cake中介绍了如何在CI中利用Cake来保持与CI/CD环境的解耦。 1. 简化cake的安装 当时dotnet 2.1还未正式发布,dotnet 还没有工具的支持,使得安装cake非常麻烦。不...

blackheart
05/12
0
0
『.NET Core CLI工具文档』(六)dotnet 命令

说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正。 原文:dotnet command 翻译:dotnet 命令 名称 dotnet -- 运行命令行命令的一般驱动程序 概要 描述 是命令行界面...

Seay
2016/07/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
4
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
3
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
13
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部