天天看點

.Net+SQL Server企業應用性能優化筆記—精确查找瓶頸

首先我們需要部署一個測試環境,将Web項目的源代碼拷到測試環境Web伺服器IIS上,使得可以直接通過IE通路我們的網站。SQL Server環境可以部署在同一台機器上,條件允許的話有專門的資料庫測試伺服器那當然是更好,沒有也無所謂。部署完測試環境後保證我們這個測試環境沒有其他使用者在通路,隻有我們通路,免得其他使用者的操作影響了我們。

假設我們的網站在首頁打開的時候很慢,需要10多秒鐘才能打開,首頁打開是調用了多個函數,函數中調用了多個存儲過程,到底是哪個函數慢?到底是哪個存儲過程慢?是Web伺服器上的函數執行花費了大量的時間還是資料庫中的存儲過程執行花費了大部分時間?到底每個函數,每個存儲過程各自花費了多少時間呢?這些問題就需要通過ANTS Profiler和SQL Server Profiler來解決。

使用ANTS Profiler和SQL Server Profiler進行瓶頸查找的過程如下:

(1)在Web伺服器上安裝并打開ANTS Profiler,在Profiler項目向導中選擇Profiler類型為詳細模式,如圖所示:

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_48A7C1D5.png"></a>

(2)單擊“下一步”按鈕,出現要進行跟蹤的應用程式類型,這裡是将項目釋出到IIS中的,是以選擇第二個。

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_334A0C6D.png"></a>

(3)單擊“下一步”按鈕,出現ASP.NET應用程式配置界面,設定應用程式起始頁、.NET版本、IIS版本和要進行跟蹤的端口。

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_347E7F7F.png"></a>

(4)單擊“下一步”按鈕進入代碼跟蹤選擇界面,選擇将所有的.NET方法進行跟蹤,也可以選擇第一個選擇,隻對有調試檔案和源代碼的方法進行跟蹤。

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_2235B8BD.png"></a>

(5)這裡我們要跟蹤的是首頁,是以一旦單擊“完成”按鈕系統就會打開IE浏覽器載入首頁,在單擊“完成”按鈕之前,需要對測試環境資料庫開啟SQL Server Profiler。SQL Server Profiler負責跟蹤資料庫上執行的腳本情況,建議将跟蹤結果儲存到資料庫中,這樣可以通過SQL語句來查找跟蹤的腳本。将跟蹤結果儲存到資料庫的配置如下圖:

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_7AFB6F87.png"></a>

(6)對于跟蹤事件,如果是進行簡單的性能跟蹤,則隻需要選中RPC:Completed和SQL:BatchCompleted兩個事件即可。至于關注的列,主要是關注TextData、CPU、Reads、Writes、Duration等列,其他列不用特别關心,采用預設選項即可,如圖所示:

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_0B273781.png"></a>

(7)單擊SQL Server Profiler中的“運作”按鈕,開始對資料庫的跟蹤,然後單擊ANTS Profiler向導中的“完成”按鈕,開啟對ASP.NET應用程式的跟蹤。

(8)系統将打開IE浏覽器,提示輸入有效的使用者名和密碼,過幾十秒鐘後,首頁就可以完整展示出來了。SQL Server Profiler中也跟蹤到了大量在首頁載入時執行的SQL語句和存儲過程。

(9)單擊ANTS Profiler工具欄中的“獲得快照”按鈕,系統将會為ASP.NET應用程式建立快照,然後列出從運作開始到快照時刻系統中執行時間最長的方法和方法的源代碼,如圖所示:

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_2FD84EF8.png"></a>

(10)從上圖中可以看到目前最長時間的一個方法是ViewMainQueryFGS.aspx.cs中的Page_Load方法,該方法花費了13.27秒,而具體花費時間的地方是在Page_Load方法中調用了BindTable方法。

(11)使用VS打開程式源代碼,或者是在ANTS Profiler中,點選檢視BindTable方法,我們可以看到該方法中有兩個函數調用比較耗時,一個是378行,花費了11.1秒,另一個是38行,花費了2.14秒,如圖所示。

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_74384037.png"></a>

(12)使用同樣的方法可以檢視到GetDataListBySQL方法具體調用了哪些方法,各個方法多少秒。這裡通過檢視源代碼我們可以知道,該方法最終是調用了資料層中的p_cx_prodplanfinish存儲過程,切換到SQL Server Profiler,我們可以看到系統調用該存儲過程花費了10.98秒。

<a target="_blank" href="http://images.cnblogs.com/cnblogs_com/studyzy/image_10194F63.png"></a>

(13)現在我們再回過頭來算一下,整個頁面載入花了13.27秒(Page_Load方法的時間),其中光執行這個存儲過程就花了10.98秒,顯然,這個瓶頸是在存儲過程p_cx_prodplanfinish上,首先應該對該存儲過程進行優化。另外還有個2.14秒的地方調用了另外一個存儲過程,也可以進行優化。

使用同樣的方法,用ANTS Profiler和SQL Server Profiler就可以找出具體是哪個函數最耗時,耗了多少時間,哪個存儲過程最耗時,耗了多少時間。确定了到底是應用程式消耗了大量時間還是存儲過程消耗了大量時間,接下來可以有的放矢了。