NCindy

.net平台上的高性能网络程序开发框架

总结:今天在MSN Group里面和一些朋友谈ASP.net程序的性能优化

今天在MSN Group里面和一些朋友谈ASP.net程序的性能优化。
现在来总结一下优化的手段:
1.数据库优化,包括表结构优化、索引优化、SQL语句优化、存储过程优化
2.优化ViewState
3.使用缓存
4.生成静态页面(主要针对交互性不是很强的信息发布系统前端)
5.使用前置的IIS/Apache来处理对静态页面、图片、js文件的请求
6.优化算法
7.欢迎大家补充

对于性能调优,几乎所有专家的建议都是:如果没有确切的性能测量,就不要进行性能调优。没有基准性能测试的调优基本上除了让系统的代码变的乱七八糟之外不会有其他好处,你费尽心思把一个算法从0.1秒提高到0.01秒得到的效果往往会被一个糟糕的select语句彻底淹没。

所以,前面的几种手段不是万灵药,要调优,首先要了解系统慢在哪儿。千万不能病急乱投医。下面的内容来自我个人的工作经验,不是所有系统都可以套用的,切记切记!!!!
下面我们来分析一下这四种调优手段:

对于OA/业务管理系统类型应用来说,数据库优化往往是关键点,原因有几点:
1.对数据库的CRUD是最这些系统最常见的操作。
2.对数据库系统的操作往往会引起磁盘I/O(因为数据库文件和日志都是保存在磁盘的)
3.应用对数据库系统的操作往往是跨进程的甚至跨机器的。(磁盘I/O+网络I/O,CPU再快内存再多都鞭长莫及了吧)
所以这些对数据库的操作往往是整个系统的性能瓶颈。

那么,知道了这个大方向,如何知道到底是那些SQL或者存储过程慢呢?这个就需要结合数据库的Profiler

对于SQL Server可以看看这篇文章
http://www.microsoft.com/china/msdn/library/data/sqlserver/Profiler.mspx?mfr=true


对于Oracle可以看看这篇文章
http://www.javaeye.com/post/117389

2,ViewState,这个咚咚体积比较大,对于internet应用来说,会有一定的影响。关于对它的优化,园子里面已经有的讲了,大家自己搜索一下吧。

3.使用缓存
这个我的看法和MSN Group里面的几个朋友不是很一致。MSN Group里面有个朋友认为缓存可以是一组静态变量,或者是一个缓存控制器控制的一些变量。我个人认为,这样的缓存在单服务器环境下也许有不错的性能,在多服务器环境下,这样的缓存反而会成为性能瓶颈,因为应用程序或者缓存控制器需要小心的保证多个进程的缓存内容一致。这个过程使得程序的可伸缩性大大降低。考虑一下100台服务器的Web Farm,一个进程中的缓存修改,需要通知并且确认剩下99个服务器都正确的更改了,这是一件多么可怕的事情。
对于这块,memcache是一个比较不错的解决方案,著名的wiki产品mediawiki就使用了它来做缓存服务器。memcache也有.net的client api。

4.不是很了解,请高手补充

5.网上很多介绍了,尤其是java那边,apache搭配tomcat有很多介绍。自己google下咯。

6.这个优化最复杂,效果也许最不明显,如果你一定要做,那就八仙过海,各显神通吧。

 

posted on 2006-11-07 22:58 iceboundrock 阅读(1757) 评论(9) 编辑 收藏

Feedback

#1楼 2006-11-08 16:49 bill[匿名][未注册用户]

很想聽聽5,6點具體做法  回复 引用   

#2楼[楼主] 2006-11-08 17:22 iceboundrock      

@bill[匿名]
第5点,google一下apache iis 整合,有不少文章讲的。主要思路就是,把apache当作proxy来转发用户的请求和iis的响应。这个主要用于降低IIS的负担。将图片、静态页面、js等的转给前端的apache之后,对静态内容的缓存也更容易配置些。

第6点的做法和业务逻辑、数据结构联系密切,没法统一说明。

 回复 引用 查看   

#3楼 2006-11-08 17:38 flower.b      

apache的代理功能的性能不如SQUID。所以网易、新浪、搜狐这些网站都使用SQUID做反向代理。  回复 引用 查看   

#4楼 2006-11-09 23:44 Truly      

性能优化是个复杂的话题,恐怕我们坐下来说个几天几夜都讲不完。文中的一个观点是正确的,要调优,就必须先弄清哪里需要调优。不是从头到尾,整个来调,这样的结果可能甚至推翻以前的架构。

1,先轮廓。大架构如可调整,先大调,比如生成静态页面、缓存。

2,再具体,通过时间测量,空间测量(可利用DateTimeNow的差值,CLRProfiler等)找出需要调优的地方,然后评估可优化的手段(Cache、ViewState,数据库,最后是算法,循环体优化),优化成本与效果综合评估后才开始动手。精确测量http://blog.csdn.net/Truly/archive/2005/07/13/423018.aspx
 回复 引用 查看   

#5楼[楼主] 2006-11-10 00:01 iceboundrock      

@Truly
从我的经验看,调优第一原则就是没有测量就不动手,第二原则是在得到性能瓶颈之后,尽量少改代码,最好就不改代码。改架构更是可怕。最好就是从数据库的配置、索引入手。

就像我文章中引用的一篇文章(http://www.javaeye.com/post/117389)所讲。SQL优化是重点。

我们为客户做的很多咨询,其中有不少项目都是通过调整数据库的索引、配置,优化SQL语句和SP就可以达到令人满意的效果。
 回复 引用 查看   

#6楼 2006-11-15 21:28 Truly      

不是原则,先测量才动手是常识。sql优化有立杆见影的效果,但未必适合所有程序,如果程序的sp,sql语句已经非常好了,即使再花多大力气调优,出现大的并发依然束手无策。改架构当然可怕,但是如果一定要达到这一目标呢?你能通过修改sql就可以使博客园承受5000人同时访问吗?比如我上次对某个大型博客站点的优化,仅仅使用一个windows服务,使用几行代码定时抓取页面生成静态页面,这样带来的性能提示比优化sql来的快多少?难道MSN space慢是因为sql不够好吗?编写良好的sql和sp,恰当的使用索引是程序员必备的能力之一,我的工作是使整个程序更加快。可能我最近web2。0项目做多了,思想上有点偏差。  回复 引用 查看   

#7楼[楼主] 2006-11-15 21:57 iceboundrock      

@Truly
Relax,兄弟,我没有说只有SQL调优是唯一方案嘛。

我都说了,这些东西都是基于我的经验的,不能在所有项目照搬。
 回复 引用 查看   

#8楼 2006-11-15 21:58 Truly      

:)  回复 引用 查看   

导航

统计信息

News

搜索

 

常用链接

最新随笔

我的标签

随笔分类

随笔档案

积分与排名