五千年(敝帚自珍)

主题:【原创】如何提高网站性能 -- Highway真经(兼答铁手问) -- Highway

共:💬16 🌺5
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 【原创】如何提高网站性能 -- Highway真经(兼答铁手问)

今天铁手大人垂问如何提高网站的性能,本想直接作答,可惜在下没有接触过PHP以及Apache Web Server。所以帮不上忙。这篇文章呢是以我比较熟悉的IIS web server和ASP.NET为例展开讨论。战术指导意义是没有的了,只是希望能在战略规划上有所帮助。

提高网站性能的办法很多,我们今天要讨论的就是其中的一个Cache。中文的说法就是缓存(Cache这个词听这就很爽,发音很象Cash)。

Cache提高性能的本质是这样的:

1)重用。如果一个计算结果可以重复利用,那么就尽可能的反复利用它,避免重复同样的计算。

2)以空间换取时间。Cache是要有代价的,那就是空间。广义上讲这个空间可以是CPU Cache,可能是内存,也可能是硬盘。利用这些空间我们保存今后可能会再次用到的东西,这样来提高程序的性能。

Cache是网站设计的一个重要部分。从分布上来看,我们可以概括为客户端缓存和服务器端缓存。

客户端缓存 -- 这点大家都有直观的印象。比如你去一个新的网站,第一次可能要花一阵子时间才能载入整个Page。而以后再去呢,时间就会大大的缩短,原因就在于这个客户端缓存。现在的浏览器都比较智能,它会在客户机器的硬盘上保留许多静态的文件,比如各种gif,jpeg文件等等。等以后再去的时候,它会尽量使用本地缓存里面的文件。只有服务器端的文件更新了,或是缓存里面的文件过期了,它才会再次从服务器端下载这些东西。当然这里面有些技术上的小trick,我且按下不表。

服务器端缓存 -- 有些东西没法或是不宜在客户端缓存,那么我们只好在服务器端详想办法了。服务器端缓存从性质上看,又可以分为两种。

1)静态文件缓存 -- 好多Page是静态的,很少更动,那么这种文件最适于作静态缓存。现在的IIS 6.0这部分内容是直接存放在Kernel的内存中,由HTTP.SYS直接管理。由于它在Kernel Space,所以它的性能非常的高。用户的请求如果在Cache里面,那么HTTP.SYS直接将内容发送到network driver上去,不需要像以前那样从IIS的User space的内存copy到Kernel中,然后再发送到TCP/IP stack上。Kernel level cache几乎是现在高性能Web server的一个必不可少的feature.

点看全图

外链图片需谨慎,可能会被源头改

另外,如果愿意,静态文件还可以压缩(动态文件也可以压缩,但费效比不是很高,因为每次都要压缩,不能一劳永逸),压缩的东西放到一个IIS指定的一个地方。如果客户端Browser支持相应的解压缩,那么压缩的内容将发送回去,解压缩工作由客户端来完成。Browser在向Web server发送请求的时候,HTTP Request Header里面有是否支持压缩的信息。

2)动态缓存 -- 动态缓存是比较有难度的。因为你在缓存的时候要时刻注意一个问题,那就是缓存的内容是不是已经过时了。因为内容过时了可能会有很严重的后果。比如网上买卖股票的网站。你给别人提供的价格是过时的,那人家非砍了你不可。缓存如何发现自己是不是过时就是一个非常复杂的问题。在ASP.NET中,动态缓存主要有这么几种手段

2.1)使用@OutputCache声明。这是一种最直观的方法。使用这个Tag,IIS会将你的动态page缓存在kernel中。你可以说明缓存的时间(比如30秒,60秒),缓存的参数(比如URL QueryString)。其语法看起来是这样的<%@OutputCache Duration="60" VaryByParam="none" %>。注意这个VaryByParam是非常灵活的,可以适应很多的情况。具体用法我且按下不表。

2.2)局部网页缓存。有的时候整个page中只有部分page适宜缓存,那么程序员可以只缓存这一部分。比如,caching the HTML output of a User Control

2.3)使用Cache Class。ASP.NET提供了一个Cache class给程序员。目的就是让程序员可以按照自己的需要控制缓存。Cache class的牛掰之处在于各种Dependency的使用。也就是你在将一个东西放入缓存的时候,你想知道他什么时候就过时了。通过dependency,程序员可以自由的驾驭这个问题。比如cache可以depend on本地的一个文件。如果文件更动了,缓存的内容就自动过时了。或者cache可以depend on数据库的某一个Table,如果Table更新了,那么cache就drop了等等。

Database Dependecy是一个非常牛掰的功能。因为现在的网站几乎都是database-driven的。SQL 2005在这方面有了新的突破,它可以提供更新提示服务,这样ASP.NET程序就可以做出相应的调整。而在以前,ASP.NET程序要时不时地去察看数据库(polling),看看是不是有了什么更动。显然这不是一种非常有效的方法。

点看全图

外链图片需谨慎,可能会被源头改

2.4)使用旧式的ASP缓存机制。比如将可重复利用的东西放到Application或是Session Object中去。在ASP.NET中,这些办法依然有效。

另外,ASP.NET 2.0提供了一个叫做Disk Output Caching的东西。如果缓存的东西太多,内存吃紧,那么ASP.NET容许你将Cache东西放到硬盘上去(我认为是Serialized Cache memory image)。这样,即使你重新启动了ASP.NET程序或是计算机,缓存的东西还在。

======================================================================

零零总总的说了一气,这些基本上就是微软最新的IIS+ASP.NET的缓存手段。我私下里以为,it's the best in class。感兴趣的话,我们可以以后慢慢再聊。

元宝推荐:ArKrXe,

本帖一共被 1 帖 引用 (帖内工具实现)
家园 看不懂也花
家园 感兴趣,就是M$的东西太贵

还有他们对外部东东的开放性也不好。

个人用着玩也就罢了,一旦正式的商业运行,有点吃不消。

CSDN上有巨大的篇幅讨论cache的问题,不过他们好象也是针对M$的多一些。但那里有一些比较具体的针对论坛如何优化的讨论,主要是几个csdn的开发者就csdn论坛的做法讲经来着。

家园 刚找了一下,没找着

我记得那个比较深入的讨论是个CSDN组织的专家座谈会,几个M$的专家+几个CSDN的大拿跟网友在线讨论的记录。原主题是什么忘了,反正到后来就完全走偏了,变成“CSDN论坛的缓存经验介绍会” 那个好象还不是一期,连续搞了几次呢。

可以到csdn论坛发个帖子问问谁还记得那些文档去哪了。记得在JavaScript区比较活跃的“孟子E章”当时是作为专家参与的,也可发短信给他问问。

搜了一下,文档区有些文章讲缓存的,就用“缓存”二字搜就出来了。

网上车东那里也讨论过一些,也有些启发性。

家园 MS的东西不贵。ASP.NET是免费的,和Java一样。

IIS 6.0是捆绑在Windows里面的(Windows 2003),不需要额外花钱买。SQL 2005是要破费的。但是比起来Oracle 10g,IBM DB2,SQL 2005是非常便宜的。

当然PHP+Apache+MySQL+Linux基本上是免费的。所以这个组合在BBS上非常流行!

家园 谢谢你的好意。我的主要信息来源是MSDN。那是微软的大本营

上面常有一流高手的文章,我就不必再拐个弯去CSDN看了。

家园 主要是一些功能实现的那些COMPONENT就贵了。
家园 我对微软是又爱又恨呢
家园 也许以后会去微软工作
家园 高速公路好文章

要是没有了你,信息版会逊色很多的。

家园 瞧你客气的。我不过就是一个看摊儿的,得空灌灌水,如是而已

可惜大家似乎有些矜持,都藏而不漏,所以有的时候我只好献丑了。

家园 到时候帮我递份Resume!

到时候好处一定大大大大滴

家园 灌水也分三六九等

您这水,灌得精彩,花一吨,呵呵

家园 俺找人帮你递?

说笑说笑

不过版主真要想去,俺可以去试试……

家园 MSDN好是好,就是搜索功能太差了

东西是不错,内容也相当全。但若你对一个分类不是很清楚的话,找个东西能累个半死。往往找了半天都绝望了,以为msdn上没放这资料,然后偶然在某人的文章中看到一个链接,点过去,才发觉:哦,原来都在这里。

这是msdn的一个死穴,也是俺最头痛的地方。

当然,熟悉的部分就会觉得它组织得很好,内容很好找,一级一级找下去准没错。呵呵

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河