1. 程式人生 > >雲端計算之路-阿里雲上:從ASP.NET執行緒角度對“黑色30秒”問題的全新分析

雲端計算之路-阿里雲上:從ASP.NET執行緒角度對“黑色30秒”問題的全新分析

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

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

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

黑色30秒

1、為什麼Requests Queued會突增?

最直接的原因是ASP.NET沒有可用的執行緒處理當前請求。為什麼會沒有可用的執行緒呢?ASP.NET可用的執行緒畢竟是有限的,可能是當時瞬間的併發請求太多,ASP.NET來不及建立足夠的執行緒處理這些請求。

我們來看一下ASP.NET中執行緒相關的設定——machine.config中的processModel(位於C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config)。

有4個相關設定:maxWorkerThreads(預設值是20), maxIoThreads(預設值是20), minWorkerThreads(預設值是1), minIoThreads(預設值是1)。(這些設定是針對每個CPU核)

我們用的就是預設設定,由於我們的Web伺服器是8核的,於是實際的maxWorkerThreads是160,實際的maxIoThreads是160,實際的minWorkerThreads是8,實際的minIoThreads是8。

基於這樣的設定,是不是如果瞬間併發請求是169,就會出現排隊?不是的,ASP.NET沒這麼傻!因為CLR 1秒只能建立2個執行緒("The CLR ThreadPool injects new threads at a rate of about 2 per second. "),等執行緒用完時才建立,黃花菜都涼了。我們猜測ASP.NET只是根據這個設定去預測執行緒池中的可用執行緒是不是緊張,是不是需要建立新的執行緒,以及建立多少執行緒。

那什麼情況下會出現“黑色30秒”期間那樣的大量請求排隊?假如併發請求數平時是300,突然某個瞬間併發請求數是600,超出了ASP.NET預估的所需的可用執行緒數,於是那些拿不到執行緒的請求只能排隊等待正在執行的請求釋放執行緒以及CLR建立新的執行緒。隨著時間的推移,釋放出來的執行緒+新建立的執行緒足以處理這些排隊的請求,就恢復了正常。

那如何驗證這個猜測呢? 修改maxWorkerThreads, maxIoThreads, minWorkerThreads, minIoThreads的設定,讓ASP.NET提供更多的可用執行緒,目前我們採用的設定如下:

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

如果採用這個設定之後,“黑色30秒”現象幾乎不出現,就能驗證問題出在這個地方。現在主站www.cnblogs.com已經使用了這個設定,需要觀察一段時間進行驗證。

【啟示】

1) 通過Windows效能監視器監視\ASP.NET\Requests Queued可以直觀地評估ASP.NET應用程式的吞吐能力(throughput)。

2) 通過ASP.NET非同步程式設計(async/await)可以有效減少可用執行緒緊張造成的請求排隊問題。

2、為什麼Arrival Rate會下降?

(上圖中的橙色線條)

這是“黑色30秒”問題中最讓人不解的地方,ASP.NET中請求再怎麼排隊,怎麼會造成到達HTTP.SYS的請求數下降呢?一開始我們總是不相信是請求排隊引起的Arrival Rate下降,但是監檢視中卻鐵證如山。

寫這篇部落格之前,我們突然想通了!之前忽略了一個地方——當你打這篇博文時,第1個請求是html頁面,如果這個請求得到正常響應,瀏覽器在載入這個頁面時會發出多個ajax請求;如果第1個請求被排隊,瀏覽器處於等待狀態,後續的ajax請求就不會發出,這樣到達HTTP.SYS的請求數就會下降。這也解釋了為什麼有時會在“黑色30秒”的中間階段Arrival Rate會飆高,正是因為當時被排隊的請求所對應的頁面中有很多ajax,當它結束排隊被執行後,後續的很多ajax請求(可能排隊的很多是這樣的請求)到達了HTTP.SYS。

於是,我們相信了是請求排隊引起的Arrival Rate下降。

【啟示】

不能把目光侷限於當前看到的問題表現,而要綜合考慮,將諸多因素聯絡起來理清各種現象之間的關係。

3、QPS下降

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

於是,QPS下降也是因為請求排隊。

4、CPU消耗下降

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

於是,CPU消耗下降也是因為請求排隊。

5、Current Connections上升

Current Connections是請求排隊的一個直接表現,請求還沒被執行,連線當然會保持著。

於是,Current Connection上升也是因為請求排隊。

6、看一個新指標Requests Executing

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

在請求排隊的期間,正在被ASP.NET執行的請求數(Requests Executing)在增加,說明隨著被釋放出來的執行緒增多以及更多的新執行緒被建立,排列中的請求正在被越來越多地執行。這從側面說明了執行中的執行緒可能是正常的,沒有被卡住。(接下來的IIS日誌資訊會進一步驗證這一點)

於是,Requests Executing在增加也是因為請求被排隊,而且說明這個排隊是正常的,沒有哪個地方卡住了。

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

日誌分析工具Log Parser Studio

在“黑色30秒”階段,IIS日誌中沒有time-taken超過1s的請求!這說明了什麼?說明了正在被執行的請求處理速度很快,沒有什麼地方被卡住。。。除了因為可用執行緒不夠,請求被排隊。

於是,IIS日誌說明除了請求排隊,其他地方一切正常。

【總結】

如果把“黑色30秒”問題歸因於ASP.NET執行緒問題,除了30秒左右的這個時間,其他問題表現都得到了更合理的解釋。

寫這篇部落格之前,我們當時覺得ASP.NET執行緒問題引起“黑色30秒”問題的可能性是80%,寫完這7點分析之後,我們覺得可能性是99%,除非這次分析的“黑色30秒”與之前的“黑色30秒”不是同一個問題。

現在還需要我們使用新設定(maxWorkerThreads="100", maxIoThreads="100", minWorkerThreads="50", minIoThreads="50")之後的驗證。

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

【“黑色30秒”相關博文】

【參考資料】

相關推薦

雲端計算-阿里ASP.NET執行角度黑色30”問題的全新分析

在這篇博文中,我們拋開對阿里雲的懷疑,完全從ASP.NET的角度進行分析,看能不能找到針對問題現象的更合理的解釋。 “黑色30秒”問題現象的主要特徵是:排隊的請求(Requests Queued)突增,到達HTTP.SYS的請求數(Arrival Rate)下降,QPS(Requests/Sec)下降,CP

雲端計算-阿里藉助IIS Log Parser Studio分析黑色30”問題

今天下午15:11-15:13間出現了類似“黑色30秒”的狀況,我們用強大的IIS日誌分析工具——Log Parser Studio進行了進一步的分析。 分析情況如下—— 先看一下Windows效能監視器中的問題表現: 然後用Log Parser Studio分析07:11:55與07:13:55(

雲端計算-阿里排查“黑色30”問題-為什麼請求會排隊

針對Web伺服器“黑色30秒”問題(詳見雲端計算之路-阿里雲上:Web伺服器遭遇奇怪的“黑色30秒”問題),經過分析,我們準備從這個地方下手——為什麼會出現\ASP.NET\Request Queued大於0的情況(為什麼請求會排隊)? 首先, 通過Windows效能監視器去觀察,看能不能找到這樣的線索——

雲端計算-阿里黑色30”問題的猜想

在雲上,底層的東西你無法觸及,遇到奇怪問題時只能靠猜想,所以使用雲端計算會鍛鍊你的想像力。 (上圖中藍色是ASP.NET的Requests Queued,另外一個是HTTP.SYS的Arrival Rate) 昨天我們發現了一個重要的線索——“黑色30秒”到來時,最初的表現是請求出現排隊(Reques

雲端計算-阿里結合IIS日誌分析黑色30”問題

在昨天針對“黑色30秒”問題的分析中,我們猜測Requests Queued上升是由於正在處理的請求出不去(到達不了客戶端)。今天我們結合IIS日誌驗證這個猜測。 IIS日誌中有一個重要的指標——time-taken,time-taken不僅包含了請求在服務端執行的時間,還包含了響應的內容從服務端到達客戶端

雲端計算-阿里Web伺服器遭遇奇怪的“黑色30”問題

今天下午訪問高峰的時候,主站的Web伺服器出現奇怪的問題,開始是2臺8核8G的雲伺服器(ECS),後來又加了1臺8核8G的雲伺服器,問題依舊。 而且3臺伺服器特地使用了不同的配置:1臺是禁用了虛擬記憶體的臨時磁碟雲伺服器,1臺是啟用了虛擬記憶體的臨時磁碟雲伺服器,1臺是禁用了虛擬記憶體的雲盤雲伺服器。這樣排

雲端計算-新篇章-出海記開篇

2012年10月30日,我們因為和阿里雲的合作,開始了雲端計算之路的第一篇章。 2020年10月30日,我們因為和 AWS 的合作,將開啟雲端計算之路的第二篇章——出海記。 我們將在 AWS 上建設園子的海外站,並將整個過程與大家分享。 我們很好奇,在阿里雲上開車7年多,在 A

雲端計算-出海記整一臺 aws 免費伺服器

上次蹭到一張船票,登上了 aws 這艘巨輪,今天要在船上的免費餐廳吃一頓免費晚餐 —— 整一臺 aws 免費套餐中的 EC2 伺服器體驗一下。 進入 EC2 控制檯,點選“啟動例項”,進入 AMI 系統映象選擇頁面,勾選“僅免費套餐”,從

雲端計算-試用Azure搭建自己的內網DNS伺服器

之前我們寫過一篇博文談到Azure內建的內網DNS伺服器不能跨Cloud Service,而我們的虛擬機器部署場景恰恰需要跨多個Cloud Service,所以目前只能選擇用Azure虛擬機器搭建自己的內網DNS伺服器。這篇博文分享的是我們在Azure上搭建自己的內網DNS

雲端計算-出海記蹭一張 aws 船票

出海記開篇之後,在 aws 上搭建部落格園海外站的出海計劃今天開始邁出第一步 —— 註冊一個 aws 海外區域賬號。 aws 現在針對新註冊使用者提供12個月免費套餐(正在園子裡推廣並提供了專屬註冊通道),正好借這個活動蹭一張有座的 aws 船票。 aws 中國區域與海外區域都有1

雲端計算-出海記-小目標Hello World from .NET 5.0 on AWS

品嚐過船上的免費晚餐,眺望著 aws 上搭建部落格園海外站的巨集偉目標,琢磨著眼前可以實現的小目標,不由自主地在螢幕上敲出了 —— "Hello World!",就從這個最簡單樸實的小目標開始吧 —— 用 ASP.NET Core on .NET 5.0 在 A

雲端計算-出海記命令列下的 AWS

俗話說“三百六十行,行行出狀元”,自從有了電腦之後,三百六十行又多了一行 —— 命令列。GUI 的誕生開創了繁榮的 PC “視窗”(windows)時代,網際網路的誕生給 GUI 家族增添新成員 Web UI,移動互相網的誕生又幫 GUI 家族生下了二胎 Mobile UI,但用情專一的程式設計師念念不忘的依

雲端計算-出海記建一個免費倉庫 Amazon RDS for SQL Server

上週由於園子[後院起火](https://www.cnblogs.com/cmt/tag/%E8%83%8C%E9%94%85%E6%A1%88/),不得不調兵回去救火,出海記暫時停更,這周繼續更新,“出海記”記錄的是我們在 AWS 上建設部落格園海外站的歷程。 在這一記中記錄的是我們基於 AWS [免費套

ApolloStudio高手(1)邊緣計算說起到全面認識ApolloStudio的架構體系

邊緣計算 全球製造業正在經歷一場數字化轉型的變革,邊緣計算這個概念這幾年逐漸進入了人們的視線,在介紹這個概念之前,我們先來認識一下未來工業網際網路全流域生態鏈的總體架構圖。 在上面這張圖中我們可以清楚的看到,邊緣計算是處於整個生態鏈的最底端,是整個工業產業鏈的“基石”,是所有上層設

成為阿里架構師的進階——阿里首批ACE認證通過者逸疏專訪

自2018年3月阿里雲釋出雲端計算架構師ACE(Alibaba Cloud Certified Expert,阿里雲認證高階工程師)級別認證後,上線不到3個月,吸引了近百位業界優秀從業者參與考試。獲得阿里雲ACE認證,對於業界資深架構師來說,是自身實力的最好證明。阿里雲大學致

雲端計算-虛擬化環境搭建及虛擬機器建立

1. 前言 在計算機技術中,虛擬化(Virtualization)是一種資源管理技術,它將計算機相關的各種資源(CPU、記憶體、磁碟、網路介面卡等)進行抽象、轉換後重新分配使用,大大增加了使用的靈活性。虛擬化有很多類別,包括硬體虛擬化、作業系統級虛擬化、應用虛擬化、服務

Tensorflow學習(一)MNIST資料集開始

MNIST資料集簡單介紹: MNIST 資料集可在 http://yann.lecun.com/exdb/mnist/ 獲取, 它包含了四個部分: Training set images: train-images-idx3-ubyte.gz (9.9 MB,

ApolloStudio高手(2)HelloWorld發散開去

Hello World! 作為“ApolloStudio高手之路 ”系列的開篇之章,自然需要以一個初學者的姿態來面對我們這位熟悉的老朋友了,在本章當中我們不準備在一開始就講太過深奧的技術話題,既然ApolloStudio包含完整的Python編譯執行環境,那麼我們按照“習俗”以He

Oracle學習(二)oracle多表查詢+分組查詢+子查詢講解與案例分析+經典練習題

1.笛卡爾集和叉集 笛卡爾集會在下面條件下產生:省略連線條件、連線條件無效、所有表中的所有行互相連線。 為了避免笛卡爾集, 可以在 WHERE 加入有效的連線條件。在實際執行環境下,應避免使用全笛卡爾集。 使用CROSS JOIN 子句使連線的表產生叉集。叉集和笛卡

程式碼審查 ArrayList 說執行安全

本文從程式碼審查過程中發現的一個 ArrayList 相關的「執行緒安全」問題出發,來剖析和理解執行緒安全。 ## 案例分析 前兩天在程式碼 Review 的過程中,看到有小夥伴用了類似以下的寫法: ```java List resultList = new ArrayList(); paramLis