ASP.NET站点性能提升-压缩
壓縮協(xié)商
服務(wù)器怎么知道瀏覽器能夠接收壓縮內(nèi)容?瀏覽器怎么知道接收的內(nèi)容是壓縮過(guò)的?
當(dāng)支持壓縮的瀏覽器向服務(wù)器發(fā)送請(qǐng)求時(shí),會(huì)包含一個(gè)Accept-Encoding請(qǐng)求頭,告訴服務(wù)器它支持的壓縮算法。例如:
?| 1 | Accept-Encoding: gzip,deflate |
如果服務(wù)器響應(yīng)使用了壓縮,會(huì)在未壓縮的文件頭中包含一個(gè)響應(yīng)頭Content-Encoding,說(shuō)明文件是怎么壓縮的:
?| 1 | Content-Encoding: gzip |
然而,不僅僅瀏覽器和服務(wù)器發(fā)送和接收請(qǐng)求和響應(yīng),代理也會(huì)。并且,代理也可以緩存響應(yīng),然后從它的緩存中響應(yīng)后來(lái)的請(qǐng)求。當(dāng)代理緩存了一個(gè)壓縮后的文件,我們?cè)趺创_定代理不會(huì)發(fā)送這個(gè)壓縮后的文件給不能處理壓縮文件的瀏覽器。
IIS6和II7采取的方法是告訴代理只有當(dāng)請(qǐng)求與原請(qǐng)求有相同的Accept-Encoding請(qǐng)求頭時(shí),才從緩存中響應(yīng)請(qǐng)求。當(dāng)啟用壓縮時(shí),IIS6和IIS7在響應(yīng)中包含Vary頭:
?| 1 | Vary: Accept-Encoding |
IIS6也允許通過(guò)元數(shù)據(jù)中的屬性重載壓縮文件Cache-Control和Expires頭。這允許禁用壓縮文件的代理緩存。IIS元數(shù)據(jù)在在IIS6中配置壓縮節(jié)的更新元數(shù)據(jù)子節(jié),重載Cache-Control和Expires頭的元數(shù)據(jù)屬性可以在以下位置找到:
- HcCacheControlHeader? http://msdn.microsoft.com/en-us/library/ms525179(VS.90).aspx
在IIS7中配置壓縮
安裝動(dòng)態(tài)內(nèi)容壓縮模塊
如果需要對(duì)動(dòng)態(tài)文件使用壓縮,首先安裝動(dòng)態(tài)內(nèi)容壓縮模塊。Vista/Windows 7或Windows Server 2008的安裝步驟有些不同:
在Vista或Windows 7上:
啟用壓縮
- Enable dynamic content compression: 除非服務(wù)器已經(jīng)使用了很多CPU,啟動(dòng)動(dòng)態(tài)內(nèi)容壓縮。
- Enable static content compression: 壓縮的靜態(tài)內(nèi)容會(huì)被壓縮。所以只在初始?jí)嚎s時(shí),會(huì)占用CPU周期。
- Only compress files larger than (in bytes): 壓縮小文件可以會(huì)使得它更大。
- Cache directory: 靜態(tài)文件的存儲(chǔ)位置。可以更換位置。確保驅(qū)動(dòng)器是本地驅(qū)動(dòng)器或NTFS分區(qū),并且沒(méi)有被壓縮或共享。
- Per application pool disk space limit (in MB): 如果有很多應(yīng)用程序池,并且磁盤(pán)空間有限,可以調(diào)整。如果有100個(gè)應(yīng)用程序池,這個(gè)選項(xiàng)值為100MB,緩存靜態(tài)文件會(huì)使用100 * 100 MB = 10GB。
針對(duì)站點(diǎn)、文件夾或文件設(shè)置壓縮
壓縮等級(jí)
壓縮等級(jí)超高,壓縮比率越大,CPU占用越大。
靜態(tài)文件和動(dòng)態(tài)文件的壓縮等級(jí)可以分別設(shè)置。對(duì)于靜態(tài)文件,使用9,最高等級(jí)。對(duì)于動(dòng)態(tài)文件,壓縮等級(jí)4更好一點(diǎn),可以參考:
IIS 7 Compression. Good? Bad? How much?? http://weblogs.asp.net/owscott/archive/2009/02/22/iis-7-compression-good-bad-how-much.aspx.
但是不同的網(wǎng)站最優(yōu)壓縮等級(jí)是不一樣的,這取決于空閑的CPU能力、頁(yè)面文件壓縮率、帶寬成本。進(jìn)行實(shí)驗(yàn)選擇最優(yōu)的壓縮等級(jí)。
設(shè)置壓縮等級(jí):
?
| 1 2 3 4 | C:\Windows\System32\Inetsrv\Appcmd.exe? ??set config -section:httpCompression? ??-[name='gzip'].staticCompressionLevel:9 ??-[name='gzip'].dynamicCompressionLevel:4 |
根據(jù)CPU利用率禁用壓縮
為了確保壓縮沒(méi)有使CPU超載,IIS7每30秒計(jì)算平均CPU利用率。當(dāng)CPU利用率超過(guò)一個(gè)限制時(shí),它會(huì)自動(dòng)關(guān)閉壓縮。當(dāng)CPU利用率低于限制時(shí), 它會(huì)重新啟用壓縮。
限制的默認(rèn)值是:
| ? | 關(guān)閉壓縮 | 重啟壓縮 |
| 動(dòng)態(tài)文件 | 90% | 50% |
| 靜態(tài)文件 | 100% | 50% |
注意這意味著如果服務(wù)器上的CPU一直在50%以上,但偶然高于90%,動(dòng)態(tài)文件壓縮會(huì)被關(guān)閉,但再也不會(huì)重新開(kāi)啟了。
可以通過(guò)修改applicationHost.config文件修改這些限制,通常它在C:\Windows\System32\inetsrv\config文件夾下。
?
| 1 | <httpCompression dynamicCompressionEnableCpuUsage="70" .... > |
如果需要修改其它限制,修改屬性:
| ? | 關(guān)閉壓縮 | 重啟壓縮 |
| 動(dòng)態(tài)文件 | dynamicCompressionDisableCpuUsage | dynamicCompressionEnableCpuUsage |
| 靜態(tài)文件 | staticCompressionDisableCpuUsage | staticCompressionEnableCpuUsage |
如果希望禁止IIS根據(jù)CPU利用率關(guān)閉壓縮,設(shè)置這些屬性值為100。
與httpCompression一起使用的元素和屬性:
- HTTP Compression <httpCompression>?
http://www.iis.net/ConfigReference/system.webServer/httpCompression.
設(shè)置靜態(tài)文件訪問(wèn)頻率閾值
只有當(dāng)靜態(tài)文件被頻繁請(qǐng)求時(shí),IIS7才會(huì)壓縮靜態(tài)文件并將它放到緩存中。如果請(qǐng)求頻率不高,IIS7不會(huì)壓縮靜態(tài)文件,這樣可以節(jié)省CPU和緩存空間。
默認(rèn)情況下,一個(gè)文件只有每10秒被請(qǐng)示2次或更多次時(shí),才會(huì)被認(rèn)為是頻繁請(qǐng)求。這是在web.config的serverRuntime元素的兩個(gè)屬性決定的:
| serverRuntime屬性 | 描述 |
| frequentHitThreshold | Number of times a URL must be requested within the time span specified in the frequentHitTimePeriod attribute to be considered frequently hit. Must be between 1 and 2147483647. Default is 2. |
| frequentHitTimePeriod | Time interval in which a URL must be requested the number of times specified in the frequentHitThreshold attribute before it is considered to be frequently hit. Default is 10 seconds. |
例如,指定靜態(tài)文件每隔15秒被請(qǐng)求7次,需要緩存,使用:
?| 1 2 3 4 5 6 7 8 | <configuration> ... ??<system.webServer> ????<serverRuntime frequentHitThreshold="7" ??????frequentHitTimePeriod="00:00:15" /> ??</system.webServer> ... </configuration> |
緩存壓縮的動(dòng)態(tài)文件
IIS7只緩存靜態(tài)文件的壓縮版本,而動(dòng)態(tài)文件在每次請(qǐng)求時(shí)進(jìn)行壓縮。這意味著壓縮動(dòng)態(tài)文件比靜態(tài)文件占用更多的CPU。
如果動(dòng)態(tài)文件對(duì)每個(gè)訪問(wèn)者都不同時(shí),這是有意義的。但是,如果動(dòng)態(tài)頁(yè)面對(duì)所有訪問(wèn)者都一樣的,緩存它們的壓縮版本也是有意義的。
在這種情況下可以使用ASP.NET OutputCache指令。這個(gè)方法的問(wèn)題是,IIS默認(rèn)在輸出緩存中存儲(chǔ)文件的未壓縮版本。對(duì)于每個(gè)請(qǐng)求,IIS必須在發(fā)送到瀏覽器前壓縮緩存的內(nèi)容。這樣的效率很低。
在輸出緩存中存儲(chǔ)壓縮的文件
IIS緩存文件的壓縮版本,而不是未壓縮版本。這樣就不用在每次請(qǐng)求時(shí)都?jí)嚎s文件,減少了CPU的使用。
因?yàn)槭褂昧薃SP.NET的輸出緩存,需要在頁(yè)面中加入OutputCache指令:
?| 1 | <%@ OutputCache Duration="300" VaryByParam="none" %> |
如果客戶端不接受壓縮后的內(nèi)存
我們緩存了壓縮后的內(nèi)容,如果有一個(gè)訪問(wèn)者使用不支持壓縮內(nèi)容的瀏覽器訪問(wèn)了網(wǎng)站會(huì)發(fā)生什么?
當(dāng)IIS收到請(qǐng)求不壓縮內(nèi)容的請(qǐng)求,會(huì)丟棄緩存中的壓縮內(nèi)容,重新生成內(nèi)容,并緩存未壓縮的內(nèi)容。它會(huì)一直使用未壓縮的內(nèi)容,直到緩存過(guò)期,即使客戶端能夠接受壓縮內(nèi)容。
可以通過(guò)同時(shí)緩存壓縮和未壓縮版本解決這個(gè)問(wèn)題。在OutputCache指令中加入VaryByContentEncoding:
?| 1 | <%@ OutputCache Duration="300" VaryByParam="none" VaryByContentEncoding="gzip;deflate" %> |
在IIS6中配置壓縮
略
提高頁(yè)面的可壓縮性
如果服務(wù)器使用了壓縮,優(yōu)化文本文件的可壓縮性是很有意義的。壓縮算法對(duì)重復(fù)內(nèi)容的效果最好:
- 始終以同一順序指定HTML屬性。其中一個(gè)方法是使用高級(jí)web控件和自定義服務(wù)器控件生成HTML,不要使用低級(jí)HTML服務(wù)器控件。這會(huì)稍微提高CPU使用率,但會(huì)保證一致性,例如,使用
<asp:Hyperlink runat="server"......>
代替
<a runat="server" .... > - 類似地,在CSS選擇器中,以字母順序書(shū)寫(xiě)屬性。
- 使用一致的大小寫(xiě)。對(duì)HMTL標(biāo)簽和屬性使用小寫(xiě)。
- 使用一致的括號(hào):不要混用”….”和’….’。
更多資源
- 10 Tips for Writing High-Performance Web Applications?
http://msdn.microsoft.com/en-us/magazine/cc163854.aspx - Confguring HTTP Compression in IIS 7?
http://technet.microsoft.com/en-us/library/cc771003(WS.10).aspx - IIS 6.0 Technical Reference?
http://technet.microsoft.com/en-us/library/cc775635(WS.10).aspx - IIS Compression in IIS6.0?
http://weblogs.asp.net/owscott/archive/2004/01/12/57916.aspx - Everything you ever wanted to know about compression, but were afraid to ask?
http://geekswithblogs.net/JamesFleming/archive/2010/02/04/everything-you-ever-wanted-to-know-about-compression-but-were.aspx - Measuring the Performance Effects of Dynamic Compression in IIS 7.0?
http://www.webperformanceinc.com/library/reports/iis7_compression/ - Let's make the web faster?
http://code.google.com/speed/articles/use-compression.html - Page Speed tool?
http://code.google.com/speed/page-speed/download.html
轉(zhuǎn)載于:https://www.cnblogs.com/xiaopohou/archive/2012/01/12/2320064.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET站点性能提升-压缩的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TreeView复选框选择逻辑判断
- 下一篇: Windows Phone中使用Loca