`
lovnet
  • 浏览: 6704514 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

ASP.NET 应用程序性能优化(转)

阅读更多

1 前言


原文作者blog:http://blog.csdn.net/navy_koo/

性能优化的主要目标是提高“并发用户数量”,“吞吐量”,“可靠性”这样几个指标。

本质上说,性能优化的工作应该是多方面的,要做到“点面结合、由表及里”。比如:从代价的角度来考虑,应尽量做到改动量小,易实施;从用户角度看,应做到快速响应或快速提示;从软件结构的角度看,又要兼顾到系统结构的合理性和可扩展性。由此不难发现,在尝试一些改进方法时往往很难做到面面俱到。

举一个简单的例子

在一个业务逻辑类中,我们封装了一些处理方法,其中有一个方法的功能是查找一个节点IDXML文件是否已经存在。那我们自然会想到写两个方法:

XmlDocument LoadXML(string strFileID) //加载XML

bool CheckIDExisit(string strFileID,string strID) //判断节点是否存在

而且,加载XML的方法在其他地方还可以重用;表面上看,这段代码的结构和功能都没有问题。可是在运行时,如果你的逻辑中直接或间接调用了LoadXML多次的话,你会发现程序很慢。原因就在于加载XML文件是个耗时动作,解决的方法很简单,我们再提供几个方法即可:

bool CheckIDExisitByXml (string strXml,string strID) //判断节点是否存在

bool CheckIDExisitByXml (XmlDocument objXml,string strID) //判断节点是否存在

这样,我们就可以通过“一次加载”实现多次借用,效率明显提升。所以,在软件结构设计时就应将可重用“珍贵”数据源的因素考虑进来。(这里的“珍贵”数据源是指那些经过复杂处理或长时间计算才得到的各种对象或记录集)

性能优化的工作又应是长期的,因为我们的工作始终是建立在OS,Web Server, DB Server, Complier & Program Language等等的基础上的。如果你熟悉.NET, JAVA,IIS, J2EE, 你就会发现有些功能或API这个平台提供了,另一个却没有;所以更多时候我们需要过渡的解决方案,等到新版本出来时,我们可能就会抛弃过渡方案直接配置或更简便的实现一些功能。[...]

2 需求篇

性能优化的第一步是看看需求是否合理,这是对项目本身的一次回检。某种意义上说,是一种逃避原则。但如果从软件工程的角度来说这是必须的,因为客户的需求是无止境的,而任何软件都是有生命期的,OS都是这样何况应用软件。我们总是希望用户显示与业务逻辑分开的越远越好,却忽略了一个基本问题:两者终归要衔接起来,如何定义两者之间的I/O关系,让它们能有效的相互配合并最终让用户满意是非常重要的。

所以,在性能优化时回检需求就是要把用户交互定义好,使之更科学化。从业界发展动态看,现在已经有专门的人在研究用户交互,这就像传统行业里的所谓“工业设计”一样,正越来越被重视!

在回检需求时往往会“修改需求”,这时应该结合“需求定义人员”和“开发人员”两方面的意见,因为各方角度不同,一定要取长补短。


3 交互响应篇

前面提到性能优化时可按“由表及里”的顺序,这主要有两方面的考虑:

第一, 这是用户直接看到的东西,见效快;

第二, 改动难度比改动内核要小。

基于B/S结构的应用程序有前台(用户)与后台(Server)交互的问题,所以交互响应过程实际包括“后台计算”与“加载到客户端”两个过程。那么很显然,我们如果尽量减少需要下载到客户端的数据量,会减小响应时间。

根据测试,我们发现将4万条记录绑定到Grid的时间在35s左右,而实际上我们不会在页面一下子显示这么多条记录,用户也不可能一下子浏览这么多记录。通常我们使用分页的方式,而所谓的分页只不过是重新绑定一下数据。所以,如果如果我们每次只绑定所请求的那一页则到客户端的数据量会陡降。这就是我们提出的“计算全部数据,加载局部数据”的思路(如下图)。

3-1 “即时按页绑定原理图

我们再从用户的角度看另外两个问题,曾使用ASP应用程序的人会发现ASP.NET应用程序使用时刷新频率很高,一个小小的动作都要提交到服务端去处理。从软件设计的角度看,我们觉得很合理,因为没有耦合且逻辑可重用。可是“鱼与熊掌不可兼得”,我们还是应该采取折中的手法。回到我们的系统中来,我们发现多数页面在对于使用较频繁的“增--改”操作时,都是每一次操作都从数据库重新读,重新绑定。如此频繁的刷新,用户不会很认可,同时如果数据量大也会影响交互时间。

实际上,如果数据是显示在Grid中,那么删除和修改时根本不需要重新Load, 直接用控件本身的方法就可以了,虽然也会提交但与重新绑定还是有明显区别的,速度也快得多!对于TreeView则“增--改”都不需要重新Load,因为它不需要分页。

另一个问题是对于复杂并可能耗时的计算过程,用户虽可理解,但还是应该给出提示或进度条。这并不属于性能优化的范畴,但却是重要的UI规范,建议纳入测试要求。关于进度条的显示有两种方式:

1 前台显示等待或完成进度,后台处理完了,前台进度条关闭,处理结果显示;

2 提交任务到后台后,转到一个等待页面,等后台完成后转到确认页面。这种方式通常基于XmlHttpRequest[13]技术,在后台创建单独的计算线程,其优点是可以避免后台过于繁忙导致第一种显示方式中客户端长时间没有反映,连进度条都不动了。


4 部署篇

部署其实是一个很大的概念,涵盖了软件和硬件。这里我们暂将系统部署结构、软件设置、硬件配置都纳为部署范围。关于怎样去部署一个软件系统这里就不赘述了,仅将一些具体做法列举出来。

4.1 ASP.NET

在有大数据量传输时,经常会遇到“out of memory”的异常。这时可调节machine.config文件中processModel子项中的memoryLimit属性的值,使得.NET可以利用更多的内存。

4.2 其他

4.2.1优化配置Server & IIS

4.2.1.1扩大IIS高速缓存

服务器保留了一部分内存空间用作IIS高速缓存,为将来的请求存储对象,这样IIS就可从高速缓存中检索对象而不用从硬盘中检索。调整IIS高速缓存的容量需要修改注册表,表项如下:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\InetInfo\Parameters\MemoryCacheSize

=0x 1E84800(类型为REG_DWORDusing hexadecimal notation.

也可设为十进制,范围0-4GB,缺省值30720003MB)。一般来说此值最小应设为服务器内存的10%

IIS通过高速缓存系统句柄、目录列表以及其他常用数据的值来提高系统的性能。这个参数指明了分配给高速缓存的内存大小。如果该值为0,那就意味着不进行任何高速缓存。在这种情况下系统的性能可能会降低。如果你的服务器网络通讯繁忙,并且有足够的内存空间,可以考虑增大该值。必须注意的是修改注册表后,需要重新启动才能使新值生效。

4.2.1.2调整IIS占用CPU时间

服务器的CPU处理器能力总是有限的。哪一个应用程序占用处理器的时间最长,谁的性能就能得到最大的提高。
1)在NT的控制面板中,双击系统图标。  
2)单击性能标签。  
3)在应用程序性能下将游标拖到None的位置,这样就可以使所有正在运行的服务,包括IIS,使用处理器的时间达到最大值。
(4)
选择最大化网络应用程序的总处理能力。然后单击“OK 

4.2.1.3协议及相关优化

1)为了提高性能和节约资源,应该只运行需要的协议。
2)应该将IIS服务器,设置为独立的服务器,不要让服务器去承受域控制器要求的额外负荷。
3)可以把NT服务器的页交换文件分布到多个物理磁盘上,注意是多个物理磁盘,分布在多个分区上是无效的。另外,不要将页交换文件放在与Windows NT引导区相同的分区中。
4)使用磁盘镜像或磁盘带区集可以提高磁盘的读取性能。
5)关于日志的记录,应该采用文件记录而不是记录到ODBC数据源。此外,还可以在记录期间增加用来记录日志的内存缓冲区的容量来减少磁盘的活动。该缓冲区的缺省容量值为64KB
6)最好把所有的数据都储存在一个单独的分区里。然后定期运行磁盘碎片整理程序以保证在存储Web服务器数据的分区中没有碎片。使用NTFS有助于减少碎片。
7)虽然SSL可以提供相当可靠的加密传输。但是所需的额外开销会导致IIS服务器速度下降,尤其是在处理大型文件的时候。所以应该只对确实需要保护的目录进行SSL加密。

4.2.1.4 调整失效时间

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\InetInfo\Parameters\ObjectCacheTTL=0x8CA0.

4.2.1.5 调整最大线程数

HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Services\w3SVC\ASP\Parameters,增加ProcessorThreadMax,减小这个值,看看性能的变化;或者增大这个值。)

4.2.1.6 注册表中的其他可优化项

以“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\InetInfo\Parameters\”为父节点;

CacheSecurityDescriptor

Indicates whether security descriptors are cached for file objects. A value of 1 enables this feature. A value of 0 disables this feature. When enabled (the default setting), security descriptors for files are saved when caching a file object. As long as the file is cached, IIS will not need to re-access the file to determine access rights for new users. This value is most useful for sites that authenticate users and not useful for sites that allow anonymous access.

CheckCertRevocation

Indicates whether IIS checks to see if a client certificate is revoked. If you issue your own certificates and make local certificate checks, you might want to enable this feature. Otherwise, the feature should be disabled, which is the default. A value of 1 enables this feature.

DisableMemoryCache

Indicates whether IIS memory caching is enabled or disabled. By default, memory caching is enabled (meaning this value is set to 0). Disable memory caching only for testing or development purposes.

ListenBackLog

Specifies the maximum number of active connections that IIS maintains in the connection queue. The default value is 15 and the range of acceptable values is from 1 to 250.

MaxCachedFileSize

Determines the maximum size of a file that can be placed in the file cache. IIS will not cache files that are larger than this value. The default value is 262,144 bytes (256 KB).

MaxConcurrency

Specifies how many threads per processor should be allowed to run simultaneously if there is a pending input/output (I/O) operation. The default value (0) allows IIS to control the number of threads per processor. You can also set a specific value.

MaxPoolThreads

Sets the number of pool threads to create per processor. Each pool thread watches for a network request for a CGI application and processes it. This value does not control threads that are used by ISAPI applications. By default, the value is set to 4. On a single processor system, this means that only four CGI applications could run simultaneously.

MemCacheSize

Sets the maximum amount of memory that IIS will use for its file cache. If IIS does not need this much memory, it will be left for other applications to use. By default, IIS uses 50 percent of the available memory. The valid range is from 0 megabytes to the total amount of physical memory available in megabytes.

ObjectCacheTTL

Sets the length of time (in milliseconds) that objects are held in memory. If the object hasn't been used in this interval, it is removed from memory. The default value is 30 seconds (300,000 milliseconds).

PoolThreadLimit

Sets the maximum number of pool threads that can be created on the server. This limit is for all IIS threads. The default value is twice the size of physical memory in megabytes.

4.2.1.7禁用不必要的服务:

禁用专用 Web 服务器不需要的 Windows 2000 服务。方法是:单击开始,依次指向程序、管理工具,然后单击计算机管理。在计算机管理(本地)下,展开服务和应用程序,然后单击服务。当前所运行服务的状态 列中显示已启动 。以下服务是专用 Web 服务器上不需要的:

  警报器
  剪贴簿
  计算机浏览器
  DHCP 客户端
  DHCP 服务器
  传真服务
  文件复制
  红外线监视器
  Internet 连接共享
  信使
  NetMeeting 远程桌面共享
  网络 DDE
  网络 DDE DSDM
  NWLink NetBIOS
  NWLink IPX/SPX
  后台打印程序
  TCP/IP NetBIOS 支持服务
  电话
  Telnet
  不间断电源
================================================
  记下与要停止的服务有依存关系的那些服务。方法是:
  双击所需的服务。例如,双击信使。
  单击依存关系 选项卡。
  在服务名 依赖这些服务列表中(其中,服务名是所选服务的名称),记下该服务依赖的那些服务。
  在这些服务依赖服务名列表中,记下没有该服务就无法启动的那些服务。
  单击确定。
  禁用所需的服务。方法是:
  右键单击要禁用的服务,然后在出现的快捷菜单上单击属性
  在启动类型列表中,单击禁用。
  如果要立即停止服务,请单击停止。如果显示停止其他服务 对话框,依赖于该服务的其他服务也将被停止。请记下受影响的服务,然后单击是。
  单击确定。该服务的启动类型 列中会显示禁用
  重复执行第 4 步,禁用其他不必要的服务。
  备注:禁用每个服务之后,应测试 Web 服务器计算机是否运行正常。这样就最大程度地减少了禁用可能需要的服务而带来的影响。
  备注:如果 IIS 服务器是 Windows 2000 域成员,则必需 TCP/IP 支持服务,以便将组策略正确地应用到计算机中。

4.2.1.8 最大化网络应用程序数据吞吐量

在工作内存中运行IIS 5.0 进程可分页代码。方法是:
  在桌面上右键单击网上邻居,然后在出现的快捷菜单中单击属性
  右键单击所需的本地连接 图标,然后在出现的快捷菜单中单击属性
  在此连接使用下列选定的组件列表中,单击“Microsoft 网络的文件和打印机共享(但不要清除其复选框),然后单击属性。
  单击最大化网络应用程序数据吞吐量,然后单击确定 两次

4.2.1.9优化后台服务的性能

IIS 5.0 进程 (Inetinfo.exe) 作为后台服务运行。要提高后台服务的性能,请按以下步骤操作:
font-size: sm

分享到:
评论

相关推荐

    asp.net应用程序性能优化

    跟我一起学visual.studio.2005(10):asp.net应用程序性能优化

    跟我一起学VS2005课程_10.ASP.NET应用程序性能优化_徐长龙讲师

    跟我一起学Visual Studio 2005(10):ASP.NET应用程序性能优化 (Level 200) 课程简介:应用程序性能永远是一个永恒的话题,Web应用或网站的用户总是希望网站的响应越快越好。一个好的设计师从产品的需求调研阶段就...

    简论提高ASP.Net应用程序性能的六种策略

    如何有效优化ASP.Net应用程序性能一直是困扰优秀网络程序员的重要问题,文章提出六种可选的ASP.Net应用程序优化策略.为开发出更为有效的ASP.Net应用程序提供一些参照

    10.ASP.NET应用程序性能优化.pdf

    Q:STA 为什么比 MTA 运行效率低 ? A:举个例子:有一屋子的货物要在最短的时间内运到另一个屋子,是一个人来回运快呢?还是请几个朋友一起帮忙运快?通过这个例子我想可以说明STA和MTA的区别,当然还有很多值得注意...

    调整和优化ASP.NET应用(CHM)

    软件介绍 主要从开发的角度介绍了如何调整和优化ASP.NET应用程序的性能,英文,原名称为Performance Tuning and Optimizing ASP Dot NET Applications Tags: 调整和优化ASP.NET应用(CHM)

    ASP.NET+SQL Server 数据库开发与实例 光盘

    本书前3章主要对ASP.NET应用程序的基础知识以及SQL Server数据库应用高级技术分别进行说明和解析;第4章~第11章通过8个经典的应用程序开发项目,系统全面地介绍了使用ASP.NET和SQL Server开发数据库应用程序的精髓...

    跟我一起学Visual Studio 2005(10):ASP.NET应用程序性能优化

    内含ppt,视频,文档,示例!!!!!!!

    Asp.NET性能优化.rar

    根据经验的总结,让我们来看看十个能帮助你提升你的应用程序性能的经验,我将按将它们提升效率的多少从大到小小依次说明,一、返回多个数据集,二、对数据进行分页,三、连接池 ,四、 ASP.NET缓存API ,五、 预请求缓存,...

    增加asp.net应用程序性能的20种方法(简单有效)

    1.禁用session假如您用不到session会话跟踪请务必禁用它。您可以在每个asp.net页面中设置如下:<%...2.输出缓冲设置这个方法对你的应用很有帮助.asp.net应用程序基本上在服务器端批量生成数据

    ASP.NET26个常用性能优化方法

    对于网站开发人员来说,在编写ASP.NET应用程序时注意性能问题,养成良好的习惯,提高应用程序性能,至少可以推迟必需的硬件升级,降低网站的成本。  访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些...

    ASP.NET 26个常用性能优化方法

    ASP.NET 26个常用性能优化方法 1.数据库访问性能优化; 2.字符串操作性能优化; 3.优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要; 4.一定要禁用调试模式; 5.对于广泛依赖外部资源的应用程序,请...

    asp.net程序中最常用编程代码

    asp.net程序中最常用的三十三种编程代码及ASP.net应用程序性能优化

    微软ASP.NET入门教程

    ASP.NET Web 应用程序 应用程序概述 使用 Global.asax 文件 管理应用程序状态 Http 处理程序和工厂 缓存服务 缓存概述 页输出缓存 页片断缓存 页数据缓存 配置 配置概述 配置文件格式 检索配置 部署 ...

    asp.net 的26种优化

    介绍了 在asp.net中优化页面的几种方法。 1 数据库访问性能优化  数据库访问性能优化  一定要禁用调试模式   在部署生产应用程序或进行任何性能测量之前,始终记住禁用调试模式。如果启用了调试模式,应用...

    ASP.net入门教程

    ASP.NET ASP.NET 概述 ASP.NET 是一个统一的 Web 开发模型,它包括您使用尽可能少的代码生成企业级 Web 应用程序所必需的各种服务。ASP.NET 作为 .NET Framework ...有关更多信息,请参见监视 ASP.NET 应用程序性能。

    ASP.NET4高级程序设计第4版 带目录PDF 分卷压缩包 part1

    7.4.1 事务和ASP.NET应用程序 7.4.2 隔离级别 7.4.3 保存点 7.5 提供程序无关的代码 7.5.1 创建工厂 7.5.2 用工厂创建对象 7.5.3 使用提供程序无关的代码的查询 7.6 总结 第8章 数据组件和DataSet...

    Asp.Net性能优化浅谈

    对于网站开发人员来说,在编写ASP.NET应用程序时注意性能问题,养成良好的习惯,提高应用程序性能,至少可以推迟必需的硬件升级,降低网站的成本。

Global site tag (gtag.js) - Google Analytics