高性能ASP.NET站點(diǎn)構(gòu)建之識(shí)別性能瓶頸
高性能ASP.NET站點(diǎn)構(gòu)建系列文章目錄
- 高性能ASP.NET站點(diǎn)構(gòu)建之開篇
- 高性能ASP.NET站點(diǎn)構(gòu)建之剖析頁面的處理過程
- 高性能ASP.NET站點(diǎn)構(gòu)建之優(yōu)化HTTP請(qǐng)求
- 高性能ASP.NET站點(diǎn)構(gòu)建之細(xì)節(jié)決定成敗
- 高性能ASP.NET站點(diǎn)構(gòu)建之性能調(diào)優(yōu)綜述
- 高性能ASP.NET站點(diǎn)構(gòu)建之識(shí)別性能瓶頸
- 高性能ASP.NET站點(diǎn)構(gòu)建之簡單的優(yōu)化措施
- ASP.NET站點(diǎn)構(gòu)建之減少不必要的請(qǐng)求
- 高性能ASP.NET站點(diǎn)構(gòu)建之托管資源優(yōu)化
- 高性能ASP.NET站點(diǎn)構(gòu)建之監(jiān)測(cè)CLR性能
前言:從本篇開始就真正的進(jìn)入了性能調(diào)優(yōu)的階段,在之前的文章中提到了頁面加載過慢的四個(gè)性能問題,其中***個(gè)問題就是:服務(wù)端解析<頁面的時(shí)間過長,本篇就分析這個(gè)問題,給出一些方案,因?yàn)樯婕暗降膯栴}很多,的在后續(xù)文章會(huì)逐個(gè)詳細(xì)介紹。
因?yàn)楸酒钠^長,所以劃分為了多篇。
本篇的議題如下:
識(shí)別和分析服務(wù)端的性能瓶頸(上)
內(nèi)存
緩存
CPU
處理請(qǐng)求線程
提高性能的一些改進(jìn)措施(下)
部署優(yōu)化(前篇)
不必要回傳(中篇)
不必要的請(qǐng)求(后篇)
在服務(wù)端有很多可以優(yōu)化的地方,優(yōu)化的話題也很多,在本篇中我們主要關(guān)注:如果讓服務(wù)端更快的生成頁面,同時(shí)也關(guān)注如果更快的讓生成的頁面更快的到達(dá)客戶端瀏覽器。
其實(shí)我們就是在優(yōu)化下面的時(shí)間線
要縮短上面的那條時(shí)間線,就需要服務(wù)端更好的利用它的資源,例如更好的利用和分配內(nèi)存資源,CPU資源等。如何好的充分利用這些資源,一定程度上與我們寫的代碼的質(zhì)量息息相關(guān),一段好的,高效的代碼往往可以讓我們少花錢去更多的硬件設(shè)備(所以代碼的質(zhì)量非常重要)。
下面我們就來看看服務(wù)端一般可能出現(xiàn)的性能瓶頸:
內(nèi)存不足
缺乏緩存
CPU壓力
處理請(qǐng)求線程問題
接下來會(huì)介紹如何采用系統(tǒng)的性能診斷工具來辨明:到底是哪種性能瓶頸導(dǎo)致了服務(wù)端解析頁面過慢。在用性能診斷工具找出了問題之后,然后針對(duì)問題再次做詳細(xì)的分析,同時(shí)收集數(shù)據(jù),根據(jù)這些數(shù)據(jù)來采用對(duì)應(yīng)的措施,對(duì)癥下藥。至于每一種性能問題如何采取何種措施解決,我們后面的文章會(huì)一章章的詳細(xì)詳述,請(qǐng)大家稍安勿躁,在此我們先學(xué)會(huì)發(fā)現(xiàn)問題。發(fā)現(xiàn)站點(diǎn)的可能出現(xiàn)了性能問題之后,首先不要立刻的修改站點(diǎn)或者服務(wù)器,而是要先診斷出瓶頸出現(xiàn)在哪里。J
內(nèi)存
首先要判斷服務(wù)器是否內(nèi)存不足。因?yàn)槿绻麅?nèi)存不足,那么會(huì)增加服務(wù)器的CPU壓力和磁盤的IO讀寫操作,發(fā)過來說,如果解決了內(nèi)存不存的問題,自然而然的就減少了CPU和磁盤IO讀寫操作。
為什么內(nèi)存不存會(huì)增加CPU的壓力和磁盤的IO讀寫操作?
當(dāng)系統(tǒng)的內(nèi)存不足的時(shí)候,系統(tǒng)就會(huì)把原來需要放在內(nèi)存的一些數(shù)據(jù)轉(zhuǎn)移保存在磁盤上面,保存為pagefile.sys。當(dāng)這些數(shù)據(jù)被需要的時(shí)候,那么系統(tǒng)就會(huì)去讀寫磁盤。讀寫磁盤的操作會(huì)消耗CPU資源,同時(shí)增加了磁盤的IO操作。
下面我們就來看看,如何識(shí)別內(nèi)存不足性能瓶頸。
我們主要講述如何在Window服務(wù)器系統(tǒng)中診斷這個(gè)問題。
Window Server 2003
在系統(tǒng)的命令行中輸入”perfmon”。就會(huì)彈出如下的窗口。然后點(diǎn)擊工具欄上面的”+”按鈕,在”Performance object”下拉框中選擇”Memory”,然后再選擇”Pages/sec”計(jì)數(shù)器。如果這個(gè)值很大,就說明CPU在內(nèi)存和磁盤之間不斷的交換數(shù)據(jù)。
Windows Vista, Server 2008, Window 7
在Windows Vista和Windows Server 2008,Window 7中不僅可以運(yùn)行”perfmon”,打開性能監(jiān)視窗口。而且可以運(yùn)行”resmon”來開啟資源監(jiān)視窗口,從這個(gè)窗口看,可以更加直觀。在資源監(jiān)視窗口中看到”硬錯(cuò)誤/秒”(Hard Faults/sec).然后檢查每個(gè)進(jìn)程的這個(gè)值,如果進(jìn)程的”硬錯(cuò)誤/秒”數(shù)值很高,那么就說明服務(wù)器已經(jīng)是內(nèi)存不足了。(我們將會(huì)在后續(xù)的文章講述如何解決這個(gè)問題,此處我們先講述如何找出這個(gè)問題
緩存
大家都知道,在適當(dāng)?shù)?span style="font-family: SimSun">實(shí)用緩存策略可以極大的提高服務(wù)端的性能。我們一般把數(shù)據(jù)緩存在內(nèi)存中,例如瀏覽器的內(nèi)存,代理服務(wù)器的內(nèi)存等。而且可以把一些常用的對(duì)象,部分的頁面,甚至整個(gè)頁面緩存起來。
緩存的好處有很多,如下:
縮短服務(wù)端的響應(yīng)時(shí)間
減少CPU的使用壓力
避免頻繁的讀取數(shù)據(jù)庫
如果把數(shù)據(jù)緩存在瀏覽器或者代理服務(wù)器,還可以減少不必要的回傳
一般來說,我們把一些使用很頻繁的數(shù)據(jù)或者每次生成都要花費(fèi)大量資源的數(shù)據(jù)緩存起來。
但是如何才算得上是”使用很頻繁”?
沒有一定的標(biāo)準(zhǔn)了,還是那句話:看情況!例如,如果一個(gè)頁面在1秒鐘之內(nèi)被請(qǐng)求了10次,可能相比較其他的頁面而言,這個(gè)頁面的請(qǐng)求不算””頻繁(其他的頁面在1秒之內(nèi)請(qǐng)求100次),但是如果把這個(gè)頁面緩存1秒,也是對(duì)性能的極大提升,因?yàn)榭梢砸幻胫畠?nèi),有90%的請(qǐng)求都是由緩存響應(yīng)的。大家可以去參看一下”緩存的5分鐘法則”。至于如何進(jìn)行緩存,在后面的文章講解。
CPU
還是和之前內(nèi)存診斷一樣,我們可以運(yùn)行”perfmon”命令,然后在”Processor”分類下面選”%Processor Time”計(jì)數(shù)器。如下
同時(shí),我們還可運(yùn)行”resmon”來打開“資源監(jiān)視窗口”來看:
大家可以看到***個(gè)標(biāo)紅色框的”CPU”列,其實(shí)這個(gè)就是反應(yīng)了” %Processor Time”計(jì)數(shù)器監(jiān)控的結(jié)果。一般來說,如果某個(gè)進(jìn)程的這個(gè)值高于了80%,那么就說明這個(gè)進(jìn)程對(duì)CPU資源有很大的消耗。如果是w3wp.exe這個(gè)進(jìn)程消耗了80%,就說你的站點(diǎn)消耗了大量的CPU。我們會(huì)在后續(xù)的文章講述:如果減小CPU的壓力。
#p#
處理請(qǐng)求線程
我們知道:發(fā)送到服務(wù)器的每一個(gè)請(qǐng)求,都是有應(yīng)用程序池中的一個(gè)線程來處理的。而且用來處理請(qǐng)求的線程的數(shù)量是有IIS來控制的,如果應(yīng)用程序池中沒有空閑的線程來處理新的請(qǐng)求,那么這個(gè)請(qǐng)求就被放在請(qǐng)求隊(duì)列中進(jìn)行等待。如果在服務(wù)端的請(qǐng)求隊(duì)列太長了,服務(wù)器忙不過來,那么新來的請(qǐng)求很有可能被服務(wù)器拒絕
一般來說,一個(gè)應(yīng)用程序池中的可用的線程數(shù)量由服務(wù)端安裝的.NET Framework的版本和IIS的一些設(shè)置來決定的。
.NET Framework Version |
默認(rèn)的可用線程數(shù) |
1.1. |
20*CPU的數(shù)量-8 |
2.0 |
12* CPU的數(shù)量 |
3.5, 4.0 |
IIS 7經(jīng)典模式:12* CPU的數(shù)量 |
|
IIS 7 集成模式: 100* CPU的數(shù)量 |
如果在服務(wù)端沒有足夠的線程來處理請(qǐng)求,這種情況就是所謂的”線程饑餓”。我們可以通過系統(tǒng)的性能計(jì)數(shù)器來檢查站點(diǎn)的服務(wù)端是否發(fā)生了這種情況:
1. 在命令窗口運(yùn)行”perfmon”.如下:
2. 在打開的性能監(jiān)視窗口中,選擇”性能監(jiān)視器”,如下:
3. 點(diǎn)擊“+”按鈕,然后展開”ASP.NET”分類:
4. 添加如下計(jì)數(shù)器:
Request Execution Time |
處理一個(gè)請(qǐng)求花費(fèi)的時(shí)間(單位是:毫秒) |
Request Current |
現(xiàn)在ASP.NET運(yùn)行時(shí)要處理的請(qǐng)求數(shù)量,包括正在處理的請(qǐng)求和等待隊(duì)列中的請(qǐng)求。 |
5. 然后展開”ASP.NET Applications”分類,添加如下計(jì)數(shù)器:
Request Executing |
現(xiàn)在正在被處理的請(qǐng)求數(shù) |
如果”Request Current”的數(shù)量大于了Request Executing的數(shù)量,那么就說明有請(qǐng)求在等待被處理。后面的文章會(huì)詳細(xì)講述如何處理這種情況。
如果”Request Current”的數(shù)量大于了Request Executing的數(shù)量,那么就說明有請(qǐng)求在等待被處理。后面的文章會(huì)詳細(xì)講述如何處理這種情況。
原文鏈接:http://www.cnblogs.com/yanyangtian/archive/2011/02/14/1954005.html
【編輯推薦】
- 高性能ASP.NET站點(diǎn)構(gòu)建之開篇
- 高性能ASP.NET站點(diǎn)構(gòu)建之剖析頁面的處理過程
- 高性能ASP.NET站點(diǎn)構(gòu)建之優(yōu)化HTTP請(qǐng)求
- 高性能ASP.NET站點(diǎn)構(gòu)建之細(xì)節(jié)決定成敗
- 高性能ASP.NET站點(diǎn)構(gòu)建之性能調(diào)優(yōu)綜述
- 強(qiáng)化部署ASP.Net 2.0配置應(yīng)用程序
- 微軟PDC2009直擊:改進(jìn)ASP.NET 4運(yùn)行時(shí)