如何提升ASP.NET網站首次打開速度?

http://asp.net 4.0 + sql2012 + win2008 + ii7。

百度了一些方法,測試後均感覺不好用。

每當應用程序池回收後,初次打開頁面,總要轉一分鐘左右才能打開。

求指點。謝謝。

----

謝謝各位,現在每次更新(回收)後,首次載入速度已經控制在 10s 左右。

非常感謝。


這類問題沒標準答案,題主得自己先找出慢的原因,有時候往往出人意料。

早些年,接到一個客戶的技術支持請求說提高首次請求速度。那個時候發現速度比題主還慢。不過有一個現象,在首次返回的過程中,CPU和硬碟都很空閑,這意味著有另一個IO柱塞。通過一個工具發現.net framework往一個site發請求,由於沒設置對外代理,請求hang在那。

但代碼沒有發這種請求啊。觀察了一下site域名,好像跟證書有關。於是靈光一閃,所有的dll在正式發布時會進行簽名,.NET在載入時會驗證簽名,需要驗證證書的有效性,檢查證書吊銷情況等步驟需要網路訪問。

於是把證書驗證步驟關了,首次訪問10秒內。一個應屆生解決了公司幾年沒解決的問題。只不過比其他人知道多一點,會觀察多一點。


真要方法,這裡有些文章里列舉的方法已經夠用了:HowTo increase IIS StartUp Speed on first StartUpProgrammer Ramblings: ASP.NET Site Warmup

一句話解決這個問題?那就是延長 IIS 里應用程序池回收時間。

你看到,確實有一些方法來減少 http://ASP.NET 網站所需時間,但實際上,這並沒有什麼用。

你要解決的問題是:

  1. 為什麼你的網站老是沒多少人訪問?
  2. 一個沒什麼訪問的網站,在載入時要干那麼多事情做什麼?


你首次打開的時候需要做1分鐘的事情,當然沒人幫得了你,你要先看這1分鐘里究竟做了什麼。


你新建一個空白的http://asp.net站點看看是不是需要一分鐘。。。


需要1分鐘得自己檢查程序。

考慮對項目預編譯。


1.VS頭頂上有一排菜單,其中有一項叫【分析】,子菜單里有一項【性能與診斷】,喝杯咖啡、輕點幾下滑鼠就能進行一次全自動的性能分析,幫你定位你的哪行代碼,或哪個函數最耗時。

這個方法用來解決由bug或人為疏漏造成的性能低。

2.【.net】、【java】等動態語言,第一次慢,後續快,典型原因是【緩存】與【資料庫連接】問題。

緩存:舉個例子,你的項目有一堆類、靜態類等等。項目啟動後,由於它們沒被使用,因此不會生成緩存。第一次使用時,生成緩存是一個大動作,所以慢。有了緩存,後續訪問就快了。

資料庫連接:同理,如果項目需要頻繁使用資料庫連接,那麼第一次訪問需要初始化連接池,需要打開新連接。這個過程也很耗時。第一次訪問完畢後,一般這些連接都會被存放回連接池,供後續快速調用。

明白了原因,解決方案也就很簡單了。那就是:所有的類、靜態類,都想辦法在啟動時,把它們載入或運行一次。比如,在不影響業務的情況下,網站啟動後,寫個腳本來實現:

1.把所有類能new的都new一次,比如:

XXClass newXXClass = new XXClass();//只要new一次,其他什麼事情都不要干。

2.靜態類能調用的都調用一次,即使什麼都不做:

int result_whatEver = StaticXXClass.MeaninglessIntValue;

StaticXXClass.DoNothing();

3.函數能跑的都跑一次:

int result_whatEver = newXXClass.Function_DoNothin();

4.資料庫能跑的都跑一次:

XXEntities et_whatEver = new XXEntities();

XXSet result_whatEver = et_whatEver.XXSet.Where( o =&> o.ID == 1).ToArray();

et_whatEver.Dispose();


大概寫一下過程,萬一下面網站關了,大家看不到答案.

主要是需要安裝一個模塊Application Initialization Module for IIS 7.5

這個模塊可以實現IIS8的新功能.

IIS8的配置

應用程序池-高級設置-啟動模式:AlwaysRunning

應用程序池-高級設置-進程模型-閑置超時:1740 (分鐘)

應用程序-高級設置-常規-預載入已啟用:True

然後首次啟動的這個問題就基本解決了..........雖然不知道為什麼

---------------------------------------------------------------------------

剛好前兩天遇到這個問題

你看一個打字員的博客剛寫完


熱啟動,每隔一段時間訪問下你的網站。。。


寫個程序每次啟動Application之後,主要的頁面全部Request一次。


這個要預熱的,寫一個程序或服務,每隔1分鐘訪問一次網站的主頁(或其它頁面,或某個api)


我查了一下,發現用下面這個還是能較大改善第一次啟動時間的,如果其他優化都沒有辦法了的話:

ASP.NET Compilation Tool (Aspnet_compiler.exe)


打開要一分鐘,喪心病狂啊。第二次打開要多久呢?


推薦閱讀:

.NET 下的性能問題如何定位?
自學編程十年,依然沒有編寫出過什麼有用的東西,想知道下一步怎麼走?
如何使一個變數的名稱等於另一個變數的值?-.net?
.NET Core是否會取代.NET Framework?
為什麼沒有新的支持底層達到類似C++這種程度,而易用性達到C#的語言出現?

TAG:伺服器 | NET | ASPNET | IIS | 網站速度 |