服务器 频道

支招12306基于Windows系统网站如何架设

  代码编写 优化

  介绍过负载均衡,下面我们该谈谈请求被接受之后,处理的流程了,那么就谈到了站点本身的设计-编码问题了,这个问题相比较就很复杂了,可以说是步步惊心,就连写一句for循环,也是小心再小心,而现在很多技术人员在写代码的时候,考虑的并不多,这也会引起很多问题,代码写的烂,一下子耗掉N多内存,再多的内存条也是白搭。下面是代码编写、优化中需要注意的一些问题。

  •   内存瓶颈分析

  内存性能问题可以分为两个部分:内部内存压力,外部内存压力。其中内部内存压力主要是站点本身在运行的过程中消耗过多的内存,基本是可以从托管资源,非托管资源两方面分析;而外部内存压力指代站点所在的服务器上面的其他应用于站点本身之间进行资源的争夺,从而使得站点可以使用的内存太少。那么在ASP.NET企业级应用中,我们技术人员关注点可以放在内部内存压力。

  首先看看托管资源的问题。

  为什么要讨论托管资源?因为托管资源(就是分配中在托管堆上面的对象),分配在托管堆上,而托管堆在内存中,所有托管资源的合理的分配和回收,会对内存产生影响。

  ASP.NET应用的功能就是由很多的对象组合完成的,所以讨论托管资源很有必要。

  在.NET中,托管堆分为两类:大对象托管堆,小对象托管堆。一般而言,如果对象所占的空间小于85K,就分配在小堆上面,反之,分配在大堆上面。如图的小堆图:

  在对上面,对象被划分为三代:0,1,2代。“代”数越大,被回收的可能性就越小。基于这个理论,就要避免原本只要是低代的对象变为高代的对象,例如某个对象用完之后就销毁的,原本是0代的,现在存活到了2代,那么它所占的内存就浪费了。虽然,垃圾回收机制没有在一定程度上回收,但是如果我们总是“霸占”着对象,垃圾回收也没有办法。

  下面,举个例子,形象的说明一下。对于一个大型的ASP.NET应用而言,里面会包含很多的对象,假设10000个,其中每次请求都要产生的100个临时对象。如果这些临时对象,被不合理的分配,成为了大代的对象,我们来算一算。

  如果这个100个对象每个占1k的空间,那么100个,我们约等于0.1M,如果站点访问量是10w,那么如果这些0.1乘以10w,如果访问量是100w,1000w,结果如何?大家已经清楚了。很多,需要将问题放大来看,结果就很清晰了。

  对于对象的使用,有一点要记住:尽可能迟的分配,尽可能早的释放。

  下面,我们可以谈谈,如何找出内存问题。

  可以采用工具加分析的方式。可以采用System Counter,CLR Profiler,ANTS Memory Profiler(Red Gate)等。其中System Counter,CLR Profiler分析的比较的粗糙,ANTS Memory Profiler(Red Gate)可以指出是哪段代码有问题,方便解决问题。如图

  另外,我们可以看看一些常见的性能问题,例如字符串相关问题,Session,缓存,对象池。

  •   字符串

  字符串相关问题应该是个老生常谈的问题了,主要涉及拼接与比较的问题。对于拼接,如果大于7个字符串拼接,最好是先顶一个缓冲区,例如StringBuilder,再拼接。对于比较,不要用“==”,而要用String.Compare函数,并且带入文化信息(culture)进行比较,效率更高。

  Session

  下面,我们来看看与Session相关的话题。在考虑Session的时候,需要从多方面考虑:是否使用Session?Session里面保存什么数据?Session的过期时间是多少?站点的并发用户是多少?

  我们来举一个例子,通过一些数字,让朋友们有一个比较清晰的了解。

  在ASP.NET中,Session的过期时间默认是20分钟,我们就以默认的过期时间为例。

  1. 假设,每个用户在站点驻留的时间为10分钟,那么用户的Session的过期时间就延长为了30分钟。也就说,在这30分钟内,用户的Session都是有效的。

  2. 假设站点每秒钟接受100个请求,每个用户在站点中每秒发送5个请求,那么,站点每秒就相当于有20个并发用户访问。

  3. 假设我们从用户的第一个请求开始,为他们保存Session信息,那么在1分钟内,站点上面的Session个数为:(30分钟—Session的存活时间)*(60秒)*(20—每秒钟并发访问的20个用户)=36000个Session。

  4. 如何每个Session保存10K的数据,那么1分钟内,站点所有Session占用的内存就约等于360M。

  相信通过上面这些数据,朋友们应该很清楚如何回答之前提出的问题了。

  另外,在使用Session的时候,我们还需要考虑站点以后的发展。如果站点在以后采用了负载均衡,那么我们要在多个服务器之间进行Session的同步,否则,就可能会出现,用户登录的时候,Session保存在服务器A上,第二次请求的时候,请求被定向到服务器B上面,此时B上面没有Session,用户还需要重新登录。此时要考虑负载均衡产品是否支持Session同步,或者我们自己从技术上面解决,例如采用分布式Session,其原理和分布式缓存类似。

  •   CPU瓶颈分析

  对于CPU性能瓶颈的分析,我们依然可以采用系统性能计数器或ANTS Profiler(Red Gate)中的CPU套件来寻找。另外VS2010也自带了性能检测工具,用法和ANTS Profiler类似,朋友们可以上MSDN去自行学习。

  当发现服务器的CPU使用过高,首先不应该立刻去诊断CPU,因为很多的其他性能问题会直接反映在CPU上面,例如内存不足。当出现了内存不足的问题的时候,CPU会将原来需要保存在内存中的数据保存在磁盘上面,这样,就加大了CPU的调度,从而使得CPU产生压力。所以,当CPU出现问题的时候,首先去检测是否内存瓶颈,如果内存是没有问题的,那么在回过来分析CPU的问题。

  在分析CPU的问题的时候,我们就要关注在整个站点中,有哪些操作是很消耗CPU的。一般而言,可以从以下几个方面入手:加密、解密,垃圾回收,解压缩,算术运算,过度编译。

  •   解压缩

  正如上面所说的,压缩是一个很消耗CPU的过程,解压也是。并且解缩还是非常消耗内存的,因为很多的解缩操作都会先将内容放进内存,等整个文件解压完之后,然后将之从内存写到磁盘。

  采访嘉宾介绍:

代码编写 优化

  汪洋(Richard Wang),安捷雨希软件咨询创始人(http://so.agilesharp.com),资深架构师和.NET技术专家。提供架构设计,性能优化技术(项目架构优化,程序代码优化,数据库性能优化),安全等咨询与培训。
  一直战斗在一线,实践经验极其丰富。现就职于惠普公司,担任技术架构师和信息分析师。同时他还是上海益思研发管理咨询有限公司首席架构师、软件咨询组副组长。曾在世界500强的在华日企担任架构师,负责项目业务框架和平台设计,曾带领创业团队与国内外企业进行项目合作。51CTO、博客园、ITPUB、China Unix等IT社区的知名博客和技术专家。CSDN和IrifoQ的特约技术作家。2011年曾多次应邀在架构师大会、亚太软件研发管理峰会和中国软件开发大会等技术盛会上担任演讲嘉宾,深受与会者欢迎。
0
相关文章