西西河

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

共:💬16 🌺5 新:
全看分页树展 · 主题
家园 【原创】如何提高网站性能 -- 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 帖 引用 (帖内工具实现)
全看分页树展 · 主题


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

Copyright © cchere 西西河