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