Fork me on GitHub

系统性能优化一例

上周接到一位从事电子产品生产的大学同学的QQ说他的一个ERP系统有问题,帮他看看,周末他过来详细的了解了一下情况:周一到周五使用的用户数是10-20个人,系统慢起来就是大家一起慢,人数少的时候不慢,另外一个揪心的问题就是大家同时使用的使用经常无故的退出,而且他还强调了他买的是一个强大的服务器了,系统运行了2年时间,数据量也不大。

先描述下系统情况:

操作系统:WindowsServer 2003

.NET版本:.NET 2.0/ASP.NET 2.0

数据库:  SQL Server 

从前面描述的问题,初步可以判定:

1、系统不稳定,估计是系统大量使用了Session ,Session丢失导致不稳定

2、10-20个用户访问就很慢,可以判断使用的是SQL Server Express 版本,SQL Server Express 最大的并发用户数小于等于12个,只能支持一个CPU,最大的内存量是1G等.

了解完情况就开始动手啦,首先登陆到他的的服务器去看了下,上述判断成立:

1、SQL Server Express  是2005的,SQL Server Express  2005的介绍可以看这里 http://msdn.microsoft.com/zh-cn/library/ms345154(v=SQL.90).aspx ,他的服务器有4核,只能有效使用到一个核,不支持执行诸如并行查询这样的功能,这个就可以很好的解释他的用户量碰到的场景。解决方案就是帮他装一个SQL Server 2008 R2 标准版的吧。

2、看到他的Session 模式是InProc,由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下:
<sessionState mode='InProc'   cookieless='true' timeout='1200'/>
我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。 开发这系统的程序员吧timeout时间设置为了1200,这里可看出在不正确的使用Session,程序代码必然在大量的应用Session,这个应该是导致系统不稳定的根源。

哪些情况下该进程会重起呢?微软的一篇文章《PRB: 会话变量是间歇性地丢失在 ASP.NET 应用程序中》告诉了我们:
1、配置文件中processModel标签的memoryLimit属性
2、Global.asax或者Web.config文件被更改
3、Bin文件夹中的Web程序(DLL)被修改
4、杀毒软件扫描了一些.config文件。

解决方案:
前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。
现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。
这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。
除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。
如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。

3、数据库的所有表除了主键外没有任何索引,这对于数据量不大的时候体现不出来,虽然这个问题不是这次的问题的重点,不过是将来这个系统的隐患。这个属于数据库优化部分,本次可以不做,需要拿到代码后分析都用到那些查询条件,好建立索引。

服务器上的调整完了,可以解决他的大问题了,然后让他向开发商要到了最新的代码,期间的很多事情让我无限感慨中国的软件业为什么做不好。虽然这只是一个小示例,基本上可以代表中国的微小软件开发商的状态。

1、代码没有源代码控制:要到的代码和运行环境不一致,这个是对他的当前这个系统最没把握的地方,这个项目使用的是ASP.NET Web Site 方式开发的,把他生产环境的运行的代码拷到本地来,这个可以解决当前运行的版本和代码部分一致性了,还有这个项目参照的微软的那个宠物商店模式搞的,PetShop是一个范例,微软用它来展示.Net企业系统开发的能力。业界有许多.Net与J2EE之争,许多数据是从微软的PetShop和Sun的PetStore而来。这种争论不可避免带有浓厚的商业色彩,对于我们开发人员而言,没有必要过多关注。PetShop是一个小型的项目,系统架构与代码都比较简单,这也是这个项目看起来还可以的一个原因,不过Web Site 部分的代码看起来真是揪心,一眼扫过去,就可以看到大量的不安全、稳定的代码,随时可能报错。也许这是一个系统不稳定的原因。

2、系统的开发人员能力弱:这个项目的流程,包括页面怎么做都是我的这位同学定的,不得佩服这位兄弟,他是学物理的,大学毕业后工作了2年开始出来独立创业,搞电子产品零部件的开发,期间的经历也很心酸,现在已经有基础,最近生意也不错。他不会开发程序,会搞硬件设计。他把软件的开发工作委托一个小公司开发完成,也一直是这家公司做维护。最近他受不了,找到我,想今后不再这家公司帮他维护了,让我帮他搞搞。据他描述,他提的修改问题给开发人员,改后就出现另外的问题。很多问题没法解决,看着这些开发人员很头疼。没有版本控制,开发人员水平差也许是导致他的抱怨的原因。

项目优化经验——垃圾回收导致的性能问题

posted @ 2012-05-20 09:21  张善友  阅读(7490)  评论(24编辑  收藏  举报