主頁 > 知識(shí)庫 > 阿里云上從ASP.NET線程角度對“黑色30秒”問題的全新分析

阿里云上從ASP.NET線程角度對“黑色30秒”問題的全新分析

熱門標(biāo)簽:云南外呼系統(tǒng)代理 上海市三維地圖標(biāo)注 南昌自動(dòng)外呼系統(tǒng)線路 西寧電銷外呼系統(tǒng)公司 辦公用地圖標(biāo)注網(wǎng)點(diǎn)怎么操作 聊城智能電銷機(jī)器人電話 海東防封電銷卡 寧德防封版電銷卡 安陸市地圖標(biāo)注app

在這篇博文中,我們拋開對阿里云的懷疑,完全從ASP.NET的角度進(jìn)行分析,看能不能找到針對問題現(xiàn)象的更合理的解釋。

“黑色30秒”問題現(xiàn)象的主要特征是:排隊(duì)的請求(Requests Queued)突增,到達(dá)HTTP.SYS的請求數(shù)(Arrival Rate)下降,QPS(Requests/Sec)下降,CPU消耗下降,Current Connections上升。

昨天晚上18:08左右發(fā)生了1次“黑色30秒”,正好借此案例分析一下。

1、為什么Requests Queued會(huì)突增?

最直接的原因是ASP.NET沒有可用的線程處理當(dāng)前請求。為什么會(huì)沒有可用的線程呢?ASP.NET可用的線程畢竟是有限的,可能是當(dāng)時(shí)瞬間的并發(fā)請求太多,ASP.NET來不及創(chuàng)建足夠的線程處理這些請求。

我們來看一下ASP.NET中線程相關(guān)的設(shè)置——machine.config中的processModel(位于C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)。

有4個(gè)相關(guān)設(shè)置:maxWorkerThreads(默認(rèn)值是20), maxIoThreads(默認(rèn)值是20), minWorkerThreads(默認(rèn)值是1), minIoThreads(默認(rèn)值是1)。(這些設(shè)置是針對每個(gè)CPU核)

我們用的就是默認(rèn)設(shè)置,由于我們的Web服務(wù)器是8核的,于是實(shí)際的maxWorkerThreads是160,實(shí)際的maxIoThreads是160,實(shí)際的minWorkerThreads是8,實(shí)際的minIoThreads是8。

基于這樣的設(shè)置,是不是如果瞬間并發(fā)請求是169,就會(huì)出現(xiàn)排隊(duì)?不是的,ASP.NET沒這么傻!因?yàn)镃LR 1秒只能創(chuàng)建2個(gè)線程,等線程用完時(shí)才創(chuàng)建,黃花菜都涼了。我們猜測ASP.NET只是根據(jù)這個(gè)設(shè)置去預(yù)測線程池中的可用線程是不是緊張,是不是需要?jiǎng)?chuàng)建新的線程,以及創(chuàng)建多少線程。

那什么情況下會(huì)出現(xiàn)“黑色30秒”期間那樣的大量請求排隊(duì)?假如并發(fā)請求數(shù)平時(shí)是300,突然某個(gè)瞬間并發(fā)請求數(shù)是600,超出了ASP.NET預(yù)估的所需的可用線程數(shù),于是那些拿不到線程的請求只能排隊(duì)等待正在執(zhí)行的請求釋放線程以及CLR創(chuàng)建新的線程。隨著時(shí)間的推移,釋放出來的線程+新創(chuàng)建的線程足以處理這些排隊(duì)的請求,就恢復(fù)了正常。

那如何驗(yàn)證這個(gè)猜測呢? 修改maxWorkerThreads, maxIoThreads, minWorkerThreads, minIoThreads的設(shè)置,讓ASP.NET提供更多的可用線程,目前我們采用的設(shè)置如下:

processModel enable="true" requestQueueLimit="5000" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50"/>

如果采用這個(gè)設(shè)置之后,“黑色30秒”現(xiàn)象幾乎不出現(xiàn),就能驗(yàn)證問題出在這個(gè)地方?,F(xiàn)在主站www.cnblogs.com已經(jīng)使用了這個(gè)設(shè)置,需要觀察一段時(shí)間進(jìn)行驗(yàn)證。

【啟示】

1) 通過Windows性能監(jiān)視器監(jiān)視\ASP.NET\Requests Queued可以直觀地評估ASP.NET應(yīng)用程序的吞吐能力(throughput)。

2) 通過ASP.NET異步編程(async/await)可以有效減少可用線程緊張?jiān)斐傻恼埱笈抨?duì)問題。

2、為什么Arrival Rate會(huì)下降?

(上圖中的橙色線條)

這是“黑色30秒”問題中最讓人不解的地方,ASP.NET中請求再怎么排隊(duì),怎么會(huì)造成到達(dá)HTTP.SYS的請求數(shù)下降呢?一開始我們總是不相信是請求排隊(duì)引起的Arrival Rate下降,但是監(jiān)視圖中卻鐵證如山。

寫這篇博客之前,我們突然想通了!之前忽略了一個(gè)地方——當(dāng)你打這篇博文時(shí),第1個(gè)請求是html頁面,如果這個(gè)請求得到正常響應(yīng),瀏覽器在加載這個(gè)頁面時(shí)會(huì)發(fā)出多個(gè)ajax請求;如果第1個(gè)請求被排隊(duì),瀏覽器處于等待狀態(tài),后續(xù)的ajax請求就不會(huì)發(fā)出,這樣到達(dá)HTTP.SYS的請求數(shù)就會(huì)下降。這也解釋了為什么有時(shí)會(huì)在“黑色30秒”的中間階段Arrival Rate會(huì)飆高,正是因?yàn)楫?dāng)時(shí)被排隊(duì)的請求所對應(yīng)的頁面中有很多ajax,當(dāng)它結(jié)束排隊(duì)被執(zhí)行后,后續(xù)的很多ajax請求(可能排隊(duì)的很多是這樣的請求)到達(dá)了HTTP.SYS。

于是,我們相信了是請求排隊(duì)引起的Arrival Rate下降。

【啟示】

不能把目光局限于當(dāng)前看到的問題表現(xiàn),而要綜合考慮,將諸多因素聯(lián)系起來理清各種現(xiàn)象之間的關(guān)系。

3、QPS下降

與Arrival Rate下降同理,QPS(Requests/Sec)與Arrival Rate是直接相關(guān)的,成正比關(guān)系。

于是,QPS下降也是因?yàn)檎埱笈抨?duì)。

4、CPU消耗下降

也是同理,Arrival Rate與QPS下降,說明CPU要干的活少了,自然消耗就下降。

于是,CPU消耗下降也是因?yàn)檎埱笈抨?duì)。

5、Current Connections上升

Current Connections是請求排隊(duì)的一個(gè)直接表現(xiàn),請求還沒被執(zhí)行,連接當(dāng)然會(huì)保持著。

于是,Current Connection上升也是因?yàn)檎埱笈抨?duì)。

6、看一個(gè)新指標(biāo)Requests Executing

(上圖綠色的線條表示的是Requests Executing)

在請求排隊(duì)的期間,正在被ASP.NET執(zhí)行的請求數(shù)(Requests Executing)在增加,說明隨著被釋放出來的線程增多以及更多的新線程被創(chuàng)建,排列中的請求正在被越來越多地執(zhí)行。這從側(cè)面說明了執(zhí)行中的線程可能是正常的,沒有被卡住。(接下來的IIS日志信息會(huì)進(jìn)一步驗(yàn)證這一點(diǎn))

于是,Requests Executing在增加也是因?yàn)檎埱蟊慌抨?duì),而且說明這個(gè)排隊(duì)是正常的,沒有哪個(gè)地方卡住了。

7、再來看看IIS日志中請求的time-taken

在“黑色30秒”階段,IIS日志中沒有time-taken超過1s的請求!這說明了什么?說明了正在被執(zhí)行的請求處理速度很快,沒有什么地方被卡住。。。除了因?yàn)榭捎镁€程不夠,請求被排隊(duì)。

于是,IIS日志說明除了請求排隊(duì),其他地方一切正常。

【總結(jié)】

如果把“黑色30秒”問題歸因于ASP.NET線程問題,除了30秒左右的這個(gè)時(shí)間,其他問題表現(xiàn)都得到了更合理的解釋。

寫這篇博客之前,我們當(dāng)時(shí)覺得ASP.NET線程問題引起“黑色30秒”問題的可能性是80%,寫完這7點(diǎn)分析之后,我們覺得可能性是99%,除非這次分析的“黑色30秒”與之前的“黑色30秒”不是同一個(gè)問題。

現(xiàn)在還需要我們使用新設(shè)置(maxWorkerThreads="100", maxIoThreads="100", minWorkerThreads="50", minIoThreads="50")之后的驗(yàn)證。

大結(jié)局即將來臨,重要的可能不是結(jié)局是什么,而是其中的過程,我們分享的也是解決問題的過程。

標(biāo)簽:汕尾 南寧 衢州 贛州 青海 洛陽 崇左

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《阿里云上從ASP.NET線程角度對“黑色30秒”問題的全新分析》,本文關(guān)鍵詞  阿里,云,上,從,ASP.NET,線程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《阿里云上從ASP.NET線程角度對“黑色30秒”問題的全新分析》相關(guān)的同類信息!
  • 本頁收集關(guān)于阿里云上從ASP.NET線程角度對“黑色30秒”問題的全新分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章