浅谈.Net Framework下的高性能Web开发

作者:张正风 黄智 更新时间:2013-04-04 16:02 点击:
【论文发表关健词】Web服务器;性能优化;Asp.Net;Release版本;
【职称论文摘要】
文章集中探讨了在Asp.Net Web服务器(特指用于接收用户请求,处理业务逻辑和响应Html的服务器)下进行Web优化的过程。文章从应用程序级别、页面级别、缓存级别和代码级别四个方面进行讨论。Web优化技术远不止文章论述这些,所以,文章建议Web开发人员在开发和部署大型或者大数据量Web应用时,一定要综合多种技术,在开发、配置、环境等方面力争做到精益求精。最后,文章提出:高性能和可维护性是冲突的,需要找一个平衡点,相关项目干系人要认真权衡。

      前不久,我所在的软件工程实验室完成了“某数字化教学资源平台”(以下简称本系统)的开发工作。该系统是一省级重点课题的研究成功之一。它以我院生物制药技术、药物制剂技术专业主干课程《药物检测技术》和生物技术及应用专业主干课程《食品检测技术》为对象进行教学资源内容开发研究。资源库平台是一个综台性的在线式基于WEB的远程资源平台,存储着专业核心信息数据,提供信息发布、网上课程、虚拟场景和视频点播等教学服务。
  系统已经进入试运行阶段。随着用户量的不断增加,系统管理员通过监控发现大量校内用户和校外用户在使用此系统,系统时常出现Service Unavailable等错误,系统性能也随之下降,很大程度上影响了系统的使用。系统急需进行改正性维护工作。因为改正性维护的原因就是测试的不彻底、不完全,必然会有一部分错误带到运行阶段。这些隐藏的错误就会在某些特定的使用环境下暴露出来。为了识别和纠正错误,同时提高系统性能,必须马上进行系统的改正性维护和Web性能优化工作。
  本文集中讨论在ASP.Net Web服务器下的改正和优化,特指用于接收用户请求,处理业务逻辑和响应HTML的服务器。对于其他方面的改正和优化技术暂不讨论。
  下面分别从应用程序级别、页面级别、缓存级别和代码级别四个方面进行初步探讨。
  1 应用程序级别
  1.1 生产环境使用Release版本,而不是Debug版本
  Debug版本通常称为调试版本,它包含调试信息,并且不软件作任何优化,便于程序员调试程序。Release版本称为发布版本,它进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。发布时必须关闭所有调试日志和信息。因为Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。同时移除所有用于调试,测试和跟踪的代码。配置Web.Config来关闭调试模式。
  建议使用宏操作可以很方便的关闭和管理这些代码:
  1.2 移除Web.config不必要的HttpModule
  HttpModule是向实现类提供模块初始化和处置事件, 只要引用就会进行初始化。
  解决的办法是可以通过运行时访问HttpContext.Current.ApplicationInstance.Modules确定哪些Module是使用到。对于用不到的,例如如果系统不使用Session,那么就移除SessionModule。
  在本系统中,由于新闻数据和用户模块无关,所以我们就移除了很多Module。
  1.3 移除不必要的文件
  在部署系统是,特别要注意网站目录下的没用的DLL和PDB文件。
  1.4 启用相关服务器配置
  比如GC(垃圾收集)方面。在.Net3.5之前,我们拿GC是没有办法的。如果系统在.Net3.5或者更高版本下运行,通常情况下我们的Web server都是多线程+多核的,这时我们要开启GC的ServerGC模式(服务器模式)。ServerGC最大的特点在于当GC发生时禁止了所有内存的分配活动,也就是说程序此时相当于停止响应了。但是这里带来的好处是将会有#procs * #cores的GC来一起完成任务,速度也快了很多。
  2 页面级别
  2.1 考虑使用比Aspx轻量级的处理模式
  Aspx页面生命周期过于笨重,而且Aspx内部经常使用服务器控件,同时Aspx内部服务器控件会产生ViewState等,这些因素都导致了Aspx页面加载速度相对比较慢。
  比如在需要一个页面作为接口提供或者接收数据时,可以使用Ashx(Httphandler)来代替Aspx页面,这样的话,可以避免返回一堆无用的Html代码。本系统里使用了MVC做页面和WCF做服务。
  2.2 避免使用重量级解决方案
  这里需要提到的是Asp.Net AJAX,其中的UpdatePanel要慎用,建议需要时在部分后台页面里使用,在前台页面里尽量避免。另外ComponentArt等重量级第三方解决方案也要慎用。
  2.3 避免太深的页面或者类继承(例如APage:BPage....)
  不要设计超级父类,而且在父类里集中了一大堆功能。因为继承级别过深是较为消耗性能的。
  2.4 优化逻辑
  例如如果已经在PageLoad中初始化过的对象,就不要在按钮点击等事件中再初始化一次,例如不要有这种代码:
  2.5 小心使用经常占用资源的对象,包括但不仅限于以下内容
  Session、Thread、内核锁、Application和大量的小对象(例如大量的使用小字符串),这个问题可以使用WinDbg+SOS查看应用程序内存分配和使用情况。
  2.6 设计往往对与性能有至关重要的影响

这里列举几个例子如下。大批量同类的操作,批量操作比一次操作一条要好的多;对于长时间的操作,异步比同步性能要好很多;CPU未满,而且希望缩短响应时间,考虑多线程;CPU满了,考虑空间换时间;每次拉取数据时,服务器只返回已经更新了的数据;设计时候考虑数据和样式分离,每次只要重新拉数据就行了;按照更新时间排列,如果更新了早一些的数据,那么每次读取的时候按照更新时间排列就是一个问题,不如在内存中保存最新的100条数据,有更新的话直接把该集合中最旧的一条移除,最新的一条插入(可以多留几条备用);本系统是读多写少,读写比例可能达到1000:1,就使用了缓存的设计方法,用户交互性明显提升。
  3 缓存
  3.1 页面缓存和页面片段缓存可以参考如下写法:
  3.2 适当的使用使用304缓存,或者浏览器端缓存
  3.3 使用HttpRuntimeCache缓存数据,或使用静态对象缓存数据
  如果不需要控制过期时间,或者永不过期,建议用静态对象缓存数据。缓存的同步和更新永远都是一个大问题,选择不同的缓存取决于你所想要的性能和能承受的缺陷,前提是如果能接受一分钟的的数据延迟。
  4 代码级别
  4.1 将可能的类设计为封闭的(不可继承)
  例如课程的实体类就可以设计为final类型的不可继承类。
  4.2 使用更为有效率的代码书写方法
  例如使用Request[“”]代替Request.QueryString[“”];使用Int.TryParse()代替Int.Parse();对全局性的代码和功能进行会议评审,力争简洁和高效。
  要格外重视测试的计划和执行。选择合适的测试工具是很重要的一个方面,Asp.Net开发中可用的测试工具有:Visual Studio 2010性能测试工具、DotTrace、LoadRunner等压力测试工具,还有Watin之类的自动化Web测试工具。虽然此类工具无法弥补基本概念上的缺失,例如封闭类的性能会比非封闭类的性能好,但是工具可以帮你较为准确的测量修改后的性能,最终跑出来的性能才是决定一个优化的价值的关键。 (责任编辑:论文发表网)转贴于八度论文发表网: http://www.8dulw.com(论文网__代写代发论文_论文发表_毕业论文_免费论文范文网_论文格式_广东论文网_广州论文网)

发表评论
本站模板均经测试成功,请放心下载,遇到任何问题或者需要购买付费论文请联系本站。
表情:
验证码:点击我更换图片