ASP.NET站点性能提升-压缩
壓縮協(xié)商
服務(wù)器怎么知道瀏覽器能夠接收壓縮內(nèi)容?瀏覽器怎么知道接收的內(nèi)容是壓縮過的?
當(dāng)支持壓縮的瀏覽器向服務(wù)器發(fā)送請求時,會包含一個Accept-Encoding請求頭,告訴服務(wù)器它支持的壓縮算法。例如:
?| 1 | Accept-Encoding: gzip,deflate |
如果服務(wù)器響應(yīng)使用了壓縮,會在未壓縮的文件頭中包含一個響應(yīng)頭Content-Encoding,說明文件是怎么壓縮的:
?| 1 | Content-Encoding: gzip |
然而,不僅僅瀏覽器和服務(wù)器發(fā)送和接收請求和響應(yīng),代理也會。并且,代理也可以緩存響應(yīng),然后從它的緩存中響應(yīng)后來的請求。當(dāng)代理緩存了一個壓縮后的文件,我們怎么確定代理不會發(fā)送這個壓縮后的文件給不能處理壓縮文件的瀏覽器。
IIS6和II7采取的方法是告訴代理只有當(dāng)請求與原請求有相同的Accept-Encoding請求頭時,才從緩存中響應(yīng)請求。當(dāng)啟用壓縮時,IIS6和IIS7在響應(yīng)中包含Vary頭:
?| 1 | Vary: Accept-Encoding |
IIS6也允許通過元數(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中配置壓縮
安裝動態(tài)內(nèi)容壓縮模塊
如果需要對動態(tài)文件使用壓縮,首先安裝動態(tài)內(nèi)容壓縮模塊。Vista/Windows 7或Windows Server 2008的安裝步驟有些不同:
在Vista或Windows 7上:
啟用壓縮
- Enable dynamic content compression: 除非服務(wù)器已經(jīng)使用了很多CPU,啟動動態(tài)內(nèi)容壓縮。
- Enable static content compression: 壓縮的靜態(tài)內(nèi)容會被壓縮。所以只在初始壓縮時,會占用CPU周期。
- Only compress files larger than (in bytes): 壓縮小文件可以會使得它更大。
- Cache directory: 靜態(tài)文件的存儲位置。可以更換位置。確保驅(qū)動器是本地驅(qū)動器或NTFS分區(qū),并且沒有被壓縮或共享。
- Per application pool disk space limit (in MB): 如果有很多應(yīng)用程序池,并且磁盤空間有限,可以調(diào)整。如果有100個應(yīng)用程序池,這個選項值為100MB,緩存靜態(tài)文件會使用100 * 100 MB = 10GB。
針對站點、文件夾或文件設(shè)置壓縮
壓縮等級
壓縮等級超高,壓縮比率越大,CPU占用越大。
靜態(tài)文件和動態(tài)文件的壓縮等級可以分別設(shè)置。對于靜態(tài)文件,使用9,最高等級。對于動態(tài)文件,壓縮等級4更好一點,可以參考:
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)壓縮等級是不一樣的,這取決于空閑的CPU能力、頁面文件壓縮率、帶寬成本。進(jìn)行實驗選擇最優(yōu)的壓縮等級。
設(shè)置壓縮等級:
?
| 1 2 3 4 | C:\Windows\System32\Inetsrv\Appcmd.exe? ??set config -section:httpCompression? ??-[name='gzip'].staticCompressionLevel:9 ??-[name='gzip'].dynamicCompressionLevel:4 |
根據(jù)CPU利用率禁用壓縮
為了確保壓縮沒有使CPU超載,IIS7每30秒計算平均CPU利用率。當(dāng)CPU利用率超過一個限制時,它會自動關(guān)閉壓縮。當(dāng)CPU利用率低于限制時, 它會重新啟用壓縮。
限制的默認(rèn)值是:
| ? | 關(guān)閉壓縮 | 重啟壓縮 |
| 動態(tài)文件 | 90% | 50% |
| 靜態(tài)文件 | 100% | 50% |
注意這意味著如果服務(wù)器上的CPU一直在50%以上,但偶然高于90%,動態(tài)文件壓縮會被關(guān)閉,但再也不會重新開啟了。
可以通過修改applicationHost.config文件修改這些限制,通常它在C:\Windows\System32\inetsrv\config文件夾下。
?
| 1 | <httpCompression dynamicCompressionEnableCpuUsage="70" .... > |
如果需要修改其它限制,修改屬性:
| ? | 關(guān)閉壓縮 | 重啟壓縮 |
| 動態(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)文件訪問頻率閾值
只有當(dāng)靜態(tài)文件被頻繁請求時,IIS7才會壓縮靜態(tài)文件并將它放到緩存中。如果請求頻率不高,IIS7不會壓縮靜態(tài)文件,這樣可以節(jié)省CPU和緩存空間。
默認(rèn)情況下,一個文件只有每10秒被請示2次或更多次時,才會被認(rèn)為是頻繁請求。這是在web.config的serverRuntime元素的兩個屬性決定的:
| 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秒被請求7次,需要緩存,使用:
?| 1 2 3 4 5 6 7 8 | <configuration> ... ??<system.webServer> ????<serverRuntime frequentHitThreshold="7" ??????frequentHitTimePeriod="00:00:15" /> ??</system.webServer> ... </configuration> |
緩存壓縮的動態(tài)文件
IIS7只緩存靜態(tài)文件的壓縮版本,而動態(tài)文件在每次請求時進(jìn)行壓縮。這意味著壓縮動態(tài)文件比靜態(tài)文件占用更多的CPU。
如果動態(tài)文件對每個訪問者都不同時,這是有意義的。但是,如果動態(tài)頁面對所有訪問者都一樣的,緩存它們的壓縮版本也是有意義的。
在這種情況下可以使用ASP.NET OutputCache指令。這個方法的問題是,IIS默認(rèn)在輸出緩存中存儲文件的未壓縮版本。對于每個請求,IIS必須在發(fā)送到瀏覽器前壓縮緩存的內(nèi)容。這樣的效率很低。
在輸出緩存中存儲壓縮的文件
IIS緩存文件的壓縮版本,而不是未壓縮版本。這樣就不用在每次請求時都壓縮文件,減少了CPU的使用。
因為使用了ASP.NET的輸出緩存,需要在頁面中加入OutputCache指令:
?| 1 | <%@ OutputCache Duration="300" VaryByParam="none" %> |
如果客戶端不接受壓縮后的內(nèi)存
我們緩存了壓縮后的內(nèi)容,如果有一個訪問者使用不支持壓縮內(nèi)容的瀏覽器訪問了網(wǎng)站會發(fā)生什么?
當(dāng)IIS收到請求不壓縮內(nèi)容的請求,會丟棄緩存中的壓縮內(nèi)容,重新生成內(nèi)容,并緩存未壓縮的內(nèi)容。它會一直使用未壓縮的內(nèi)容,直到緩存過期,即使客戶端能夠接受壓縮內(nèi)容。
可以通過同時緩存壓縮和未壓縮版本解決這個問題。在OutputCache指令中加入VaryByContentEncoding:
?| 1 | <%@ OutputCache Duration="300" VaryByParam="none" VaryByContentEncoding="gzip;deflate" %> |
在IIS6中配置壓縮
略
提高頁面的可壓縮性
如果服務(wù)器使用了壓縮,優(yōu)化文本文件的可壓縮性是很有意義的。壓縮算法對重復(fù)內(nèi)容的效果最好:
- 始終以同一順序指定HTML屬性。其中一個方法是使用高級web控件和自定義服務(wù)器控件生成HTML,不要使用低級HTML服務(wù)器控件。這會稍微提高CPU使用率,但會保證一致性,例如,使用
<asp:Hyperlink runat="server"......>
代替
<a runat="server" .... > - 類似地,在CSS選擇器中,以字母順序書寫屬性。
- 使用一致的大小寫。對HMTL標(biā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站点性能提升-压缩的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TreeView复选框选择逻辑判断
- 下一篇: asp.net 中Gridview 使用