日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

記一次 .NET 某酒店后臺服務(wù)卡死分析

來源: 責編: 時間:2024-05-20 17:54:09 223觀看
導(dǎo)讀一、背景1. 講故事停了一個月沒有更新文章了,主要是忙于寫 C#內(nèi)功修煉系列的PPT,現(xiàn)在基本上接近尾聲,可以回頭繼續(xù)更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統(tǒng)出現(xiàn)了大量的http超時,程序不響應(yīng)處

一、背景

1. 講故事

停了一個月沒有更新文章了,主要是忙于寫 C#內(nèi)功修煉系列的PPT,現(xiàn)在基本上接近尾聲,可以回頭繼續(xù)更新這段時間分析dump的一些事故報告,有朋友微信上找到我,說他們的系統(tǒng)出現(xiàn)了大量的http超時,程序不響應(yīng)處理了,讓我?guī)兔聪略趺椿厥拢琩ump也抓到了。Q7G28資訊網(wǎng)——每日最新資訊28at.com

二、WinDbg分析

1. 為什么會出現(xiàn)請求超時

既然超時說明server端不響應(yīng)這個請求,繼而達到了超時時間的一種異常情況,所以首先要想到的就是 線程池的健康度,可以用 !tp 命令觀察,輸出如下:Q7G28資訊網(wǎng)——每日最新資訊28at.com

0:000> !tpCPU utilization: 0%Worker Thread: Total: 537 Running: 537 Idle: 0 MaxLimit: 32767 MinLimit: 12Work Request in Queue: 82    Unknown Function: 00007fff566a17d0  Context: 0000020f08cbd658    Unknown Function: 00007fff566a17d0  Context: 0000020f09acfa80    Unknown Function: 00007fff566a17d0  Context: 0000020f08702198    Unknown Function: 00007fff566a17d0  Context: 0000020f09ad9068    Unknown Function: 00007fff566a17d0  Context: 0000020f09abffe8    Unknown Function: 00007fff566a17d0  Context: 0000020f093c9948    Unknown Function: 00007fff566a17d0  Context: 0000020f093cfd28    Unknown Function: 00007fff566a17d0  Context: 0000020f093d9358    Unknown Function: 00007fff566a17d0  Context: 0000020f093c34e8    Unknown Function: 00007fff566a17d0  Context: 0000020f093dc568    ...--------------------------------------Number of Timers: 2--------------------------------------Completion Port Thread:Total: 2 Free: 2 MaxFree: 24 CurrentLimit: 2 MaxLimit: 1000 MinLimit: 12

從上面的卦象看異常非常明顯,線程池總共有 537個工作線程都是處于運行狀態(tài),相信有經(jīng)驗的朋友應(yīng)該一眼就知道是怎么回事,專業(yè)術(shù)語叫:線程饑餓,并且線程池隊列也積壓了 82個 待處理的任務(wù)。Q7G28資訊網(wǎng)——每日最新資訊28at.com

2. 線程為什么會饑餓

線程饑餓的原因有更多,我特意問了下 chatgpt,列舉如下:Q7G28資訊網(wǎng)——每日最新資訊28at.com

  • 優(yōu)先級傾斜:如果某些線程的優(yōu)先級設(shè)置過高,而其他線程的優(yōu)先級設(shè)置過低,高優(yōu)先級的線程可能會長時間占用CPU資源,導(dǎo)致低優(yōu)先級線程無法獲得執(zhí)行機會。
  • 死鎖:當多個線程相互等待對方釋放資源時,可能會導(dǎo)致死鎖。在死鎖情況下,所有線程都無法繼續(xù)執(zhí)行,從而導(dǎo)致線程饑餓。
  • 資源競爭:多個線程競爭有限的資源(如共享內(nèi)存、文件、網(wǎng)絡(luò)連接等)時,可能會導(dǎo)致某些線程長時間無法獲取到所需的資源而處于饑餓狀態(tài)。
  • 不公平的調(diào)度策略:調(diào)度器可能存在不公平的調(diào)度策略,導(dǎo)致某些線程無法獲得公平的CPU時間片,從而長時間無法執(zhí)行。
  • 線程阻塞:某些線程可能由于等待I/O操作、鎖或其他原因而被阻塞,如果阻塞時間過長,可能導(dǎo)致其他線程饑餓。
  • 線程池配置不當:如果線程池中的線程數(shù)量設(shè)置不當,可能會導(dǎo)致某些任務(wù)長時間等待執(zhí)行,從而引發(fā)線程饑餓。

那到底是哪一種情況呢?可以用 ~*e !clrstack 看一下各個線程此時正在做什么,輸出如下:Q7G28資訊網(wǎng)——每日最新資訊28at.com

0:000> ~*e !clrstack...OS Thread Id: 0x2924 (74)        Child SP               IP Call Site000000e0ef47dc30 00007fff60fd6974 [GCFrame: 000000e0ef47dc30] 000000e0ef47dd58 00007fff60fd6974 [HelperMethodFrame_1OBJ: 000000e0ef47dd58] System.Threading.Monitor.ObjWait(Boolean, Int32, System.Object)000000e0ef47de70 00007ffef33e7269 System.Threading.ManualResetEventSlim.Wait(Int32, System.Threading.CancellationToken)000000e0ef47df00 00007ffef33e6b58 System.Threading.Tasks.Task.SpinThenBlockingWait(Int32, System.Threading.CancellationToken)000000e0ef47df70 00007ffef33e69e1 System.Threading.Tasks.Task.InternalWait(Int32, System.Threading.CancellationToken)000000e0ef47e040 00007ffef60cce33 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(System.Threading.Tasks.Task)000000e0ef47e070 00007ffef9df2c73 Exceptionless.Submission.DefaultSubmissionClient.SendHeartbeat(System.String, Boolean, Exceptionless.ExceptionlessConfiguration)000000e0ef47e110 00007ffef109f03f System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)000000e0ef47e1e0 00007ffef109e784 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)000000e0ef47e210 00007ffef15b670b System.Threading.TimerQueueTimer.CallCallback()000000e0ef47e270 00007ffef15b644d System.Threading.TimerQueueTimer.Fire()000000e0ef47e2e0 00007ffef15b5613 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()000000e0ef47e320 00007ffef10b8319 System.Threading.ThreadPoolWorkQueue.Dispatch()000000e0ef47e7a0 00007fff4fa06993 [DebuggerU2MCatchHandlerFrame: 000000e0ef47e7a0] 000000e0ef47e908 00007fff4fa06993 [ContextTransitionFrame: 000000e0ef47e908] 000000e0ef47eb40 00007fff4fa06993 [DebuggerU2MCatchHandlerFrame: 000000e0ef47eb40] ...

發(fā)現(xiàn)有 473 個線程都在 Exceptionless.Submission.DefaultSubmissionClient.SendHeartbeat 方法上進行等待,這就有意思了,原來是開源的日志收集組件發(fā)送的心跳檢測方法,接下來趕緊看一下這個方法的源碼。Q7G28資訊網(wǎng)——每日最新資訊28at.com

public void SendHeartbeat(string sessionIdOrUserId, bool closeSession, ExceptionlessConfiguration config){ if (!config.IsValid) {  return; } string requestUri = $"{GetHeartbeatServiceEndPoint(config)}/events/session/heartbeat?id={sessionIdOrUserId}&close={closeSession}"; try {  _client.Value.AddAuthorizationHeader(config.ApiKey);  _client.Value.GetAsync(requestUri).ConfigureAwait(continueOnCapturedContext: false).GetAwaiter()   .GetResult(); } catch (Exception exception) {  config.Resolver.GetLog().Error("Error submitting heartbeat: " + exception.GetMessage()); }}

從源碼看,居然用同步的方式發(fā)送 http請求,在這異步方法滿天飛的世界里,上面的寫法實屬異類。Q7G28資訊網(wǎng)——每日最新資訊28at.com

3. 該如何解決呢?

既然是 Exceptionless 內(nèi)部寫的 SendHeartbeat 方法,我們程序員基本上無法干預(yù),能做到的無非如下兩點:Q7G28資訊網(wǎng)——每日最新資訊28at.com

  • 升級框架

看下了用的還是超老的 4.3 版本,可以升級到目前最新的 6.0.4 觀察試試。Q7G28資訊網(wǎng)——每日最新資訊28at.com

[assembly: AssemblyTitle("Exceptionless")][assembly: AssemblyProduct("Exceptionless")][assembly: AssemblyCompany("Exceptionless")][assembly: AssemblyTrademark("Exceptionless")][assembly: AssemblyCopyright("Copyright (c) 2017 Exceptionless.  All rights reserved.")][assembly: AssemblyConfiguration("Release")][assembly: AssemblyFileVersion("4.3.2027.0")][assembly: AssemblyInformationalVersion("4.3.2027$(VERSION_SUFFIX) f8d73f2fd7")][assembly: TargetFramework(".NETFramework,Version=v4.5", FrameworkDisplayName = ".NET Framework 4.5")][assembly: AssemblyVersion("4.3.2027.0")]

圖片圖片Q7G28資訊網(wǎng)——每日最新資訊28at.com

  • 使用替代品,或者不用

哈哈,不用它,這是萬能的治根之法。Q7G28資訊網(wǎng)——每日最新資訊28at.com

三、對線程注入速度的解答

1. 朋友提了一個疑問

我現(xiàn)在知道這個 url 某個時段可能響應(yīng)出了問題,但我線程池里的線程增速應(yīng)該很快呀,多余的線程不是可以響應(yīng)客戶端請求嗎?為什么我發(fā)現(xiàn)的情況是全部卡死呢?Q7G28資訊網(wǎng)——每日最新資訊28at.com

2. 疑問的簡單解答

這個問題其實是考察對線程池底層的了解,尤其是多久會向線程池注入一個活線程,在 .NET Framework 時代,在線程饑餓的情況下線程池內(nèi)部的 GateThread線程 會 1s 注入一個活線程,那如何驗證呢?我們觀察后續(xù)的線程創(chuàng)建時間即可,使用 ~*e .ttime 。Q7G28資訊網(wǎng)——每日最新資訊28at.com

0:000> ~*e .ttime...Created: Thu Nov 16 11:10:21.582 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.000Created: Thu Nov 16 11:10:22.593 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.000Created: Thu Nov 16 11:10:23.562 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.000Created: Thu Nov 16 11:10:24.062 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.000Created: Thu Nov 16 11:10:24.577 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.000Created: Thu Nov 16 11:10:25.562 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.000Created: Thu Nov 16 11:10:26.562 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.015Created: Thu Nov 16 11:10:27.562 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.015Created: Thu Nov 16 11:10:28.562 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.015Created: Thu Nov 16 11:10:29.577 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.015Created: Thu Nov 16 11:10:30.562 2023 (UTC + 8:00)Kernel:  0 days 0:00:00.000User:    0 days 0:00:00.000

從卦中的輸出來看,每一個 Created 大概差 1s 鐘,這也是 GateThread 的功勞,這種注入速度在 .NET8 中已經(jīng)做了優(yōu)化,比如上面這種情況,Task 內(nèi)部會主動喚醒 GateThread 線程讓其立即注入新線程,從而提升程序的響應(yīng)速度。Q7G28資訊網(wǎng)——每日最新資訊28at.com

四、總結(jié)

很多時候分析下來發(fā)現(xiàn)是 第三方組件 拖垮了程序,自己又沒有太多的介入能力,真的很無奈,框架都用了那么久,現(xiàn)在看到了一只蒼蠅,已是食之無味,棄之可惜。Q7G28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-89402-0.html記一次 .NET 某酒店后臺服務(wù)卡死分析

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python 高效編程的 15 個優(yōu)秀實踐

下一篇: 說到Python處理大數(shù)據(jù)集,別說你會用Pandas

標簽:
  • 熱門焦點
  • 小米官宣:2023年上半年出貨量中國第一!

    今日早間,小米電視官方微博帶來消息,稱2023年小米電視上半年出貨量達到了中國第一,同時還表示小米電視的巨屏風暴即將開始。“公布一個好消息2023年#小米電視上半年出貨量中國
  • 三言兩語說透設(shè)計模式的藝術(shù)-單例模式

    寫在前面單例模式是一種常用的軟件設(shè)計模式,它所創(chuàng)建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統(tǒng)中的其他對象共享,從而減少
  • 一篇聊聊Go錯誤封裝機制

    %w 是用于錯誤包裝(Error Wrapping)的格式化動詞。它是用于 fmt.Errorf 和 fmt.Sprintf 函數(shù)中的一個特殊格式化動詞,用于將一個錯誤(或其他可打印的值)包裝在一個新的錯誤中。使
  • 之家push系統(tǒng)迭代之路

    前言在這個信息爆炸的互聯(lián)網(wǎng)時代,能夠及時準確獲取信息是當今社會要解決的關(guān)鍵問題之一。隨著之家用戶體量和內(nèi)容規(guī)模的不斷增大,傳統(tǒng)的靠"主動拉"獲取信息的方式已不能滿足用
  • 如何使用JavaScript創(chuàng)建一只圖像放大鏡?

    譯者 | 布加迪審校 | 重樓如果您曾經(jīng)瀏覽過購物網(wǎng)站,可能遇到過圖像放大功能。它可以讓您放大圖像的特定區(qū)域,以便瀏覽。結(jié)合這個小小的重要功能可以大大改善您網(wǎng)站的用戶體驗
  • 慕巖炮轟抖音,百合網(wǎng)今何在?

    來源:價值研究所 作者:Hernanderz“難道就因為自己的一個產(chǎn)品牛逼了,從客服到總裁,都不愿意正視自己產(chǎn)品和運營上的問題,選擇逃避了嗎?”這一番話,出自百合網(wǎng)聯(lián)合創(chuàng)
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經(jīng)無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關(guān)心的“網(wǎng)紅”。7月5日至9日,為期5天的東方甄選“甘肅行”首次在自有App內(nèi)直播,
  • 自研Exynos回歸!三星Galaxy S24系列將提供Exynos和驍龍雙版本

    年初,全新的三星Galaxy S23系列發(fā)布,包含Galaxy S23、Galaxy S23+和Galaxy S23 Ultra三個版本,全系搭載超頻版驍龍8 Gen 2,雖同樣采用臺積電4nm工藝制
  • 三星Galaxy Z Fold/Flip 5國行售價曝光 :最低7499元/12999元起

    據(jù)官方此前宣布,三星將于7月26日也就是明天在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美在线视频二区| 精品二区视频| 欧美日韩三区| 国产精品入口麻豆原神| 国产麻豆精品视频| 一区二区三区在线看| 亚洲黑丝在线| 一区二区三区四区五区在线| 午夜日韩av| 久久久久欧美| 欧美日本不卡高清| 国产精品高清一区二区三区| 国产欧美精品久久| 亚洲国产另类久久精品| 一区二区三区黄色| 久久精品视频导航| 欧美日韩成人综合在线一区二区| 国产精品视频网址| 亚洲电影中文字幕| 亚洲一区二区在线免费观看| 欧美专区18| 欧美日本在线播放| 国产亚洲在线| 亚洲精品字幕| 久久精品人人爽| 欧美日韩精品在线视频| 韩国成人理伦片免费播放| 亚洲欧洲偷拍精品| 欧美一区二区精品在线| 欧美国产视频在线| 国产精品一区二区久激情瑜伽| 在线观看一区二区视频| 亚洲尤物精选| 欧美成人精品影院| 国产精品永久免费| 日韩视频在线观看| 久久中文在线| 国产欧美一区二区三区在线老狼| 亚洲精品影院| 久久久女女女女999久久| 欧美午夜片在线观看| 亚洲狠狠婷婷| 久久国产欧美日韩精品| 欧美日韩在线看| ●精品国产综合乱码久久久久| 午夜精品短视频| 欧美日韩亚洲高清一区二区| 在线观看日韩av先锋影音电影院| 亚洲香蕉网站| 欧美日韩精品欧美日韩精品一| 亚洲电影视频在线| 久久久精品动漫| 国产日韩欧美| 午夜精品久久久久久久久| 欧美日韩中文| 亚洲三级免费观看| 久久综合色天天久久综合图片| 国产农村妇女毛片精品久久麻豆 | 久久精品亚洲一区二区三区浴池| 欧美新色视频| 日韩一区二区精品葵司在线| 免费成人毛片| 影音先锋久久精品| 久久久久久久一区二区| 国产欧美一级| 午夜国产欧美理论在线播放| 国产精品久久久久高潮| 中文久久精品| 欧美日韩在线播放一区| 日韩午夜电影| 欧美日韩mv| 日韩一级在线观看| 欧美大片一区二区| 91久久在线视频| 欧美va亚洲va香蕉在线| 亚洲国产精彩中文乱码av在线播放| 久久久久久综合网天天| 尤物yw午夜国产精品视频| 久久免费国产精品| 一区免费观看| 麻豆国产精品va在线观看不卡| 好吊妞**欧美| 久久躁日日躁aaaaxxxx| 亚洲电影下载| 欧美激情国产精品| 亚洲美女中文字幕| 欧美日韩国产三区| 在线亚洲+欧美+日本专区| 欧美调教vk| 亚洲欧美国产日韩中文字幕| 国产精品网站一区| 欧美亚洲在线视频| 国产自产v一区二区三区c| 久久久夜夜夜| 亚洲激情第一区| 欧美精品综合| 亚洲天堂av图片| 国产精品天美传媒入口| 欧美专区亚洲专区| 一区在线观看视频| 欧美华人在线视频| 在线一区日本视频| 国产欧美韩国高清| 另类天堂av| 一区二区三欧美| 国产精品拍天天在线| 欧美综合二区| 在线日韩电影| 欧美日韩一区二区在线| 亚洲欧美成人一区二区三区| 国产一区二区久久| 欧美jizzhd精品欧美巨大免费| av成人免费在线观看| 国产精品稀缺呦系列在线| 久久精品亚洲一区二区三区浴池| 亚洲国产一区二区a毛片| 欧美日韩在线不卡一区| 久久黄色网页| 午夜精品婷婷| 狠狠爱成人网| 欧美人在线视频| 欧美一区二区三区在| 亚洲第一精品福利| 国产精品vvv| 久久久美女艺术照精彩视频福利播放| 亚洲日本成人在线观看| 国产精品日韩欧美一区二区| 久久久久久久尹人综合网亚洲| 亚洲精品一区在线| 国产日韩欧美成人| 欧美国产欧美亚洲国产日韩mv天天看完整 | 久久天堂精品| 99精品国产福利在线观看免费 | 欧美日韩免费观看一区=区三区| 午夜精品影院| 亚洲国产一区二区三区青草影视 | 欧美日韩一区在线播放| 欧美中文字幕在线视频| 亚洲精品日韩精品| 国产亚洲二区| 欧美日本免费| 久久人人爽爽爽人久久久| 在线视频日韩精品| 亚洲福利免费| 国产精品一二三四| 欧美韩国一区| 久久精品国产免费观看| 在线亚洲+欧美+日本专区| 激情五月婷婷综合| 国产精品久久久久国产精品日日| 老司机一区二区三区| 亚洲在线视频一区| 亚洲精品国产精品国自产观看浪潮 | 在线成人激情| 国产精品美女久久久久久免费| 麻豆成人综合网| 午夜精品国产精品大乳美女| 亚洲欧洲日本国产| 国产综合视频| 国产精品久久久久久福利一牛影视 | 久久精品伊人| 亚洲一区二区三区久久| 亚洲日本中文| 在线看视频不卡| 国产亚洲精品久久久久婷婷瑜伽 | 激情综合色综合久久| 国产精品美女午夜av| 欧美福利一区| 久久久久久久久久码影片| 亚洲欧美成人网| 在线中文字幕一区| 亚洲精品国久久99热| 在线观看日韩一区| 国模大胆一区二区三区| 国产精品久久久久久久久久直播| 欧美精品免费在线| 美女在线一区二区| 久久久久久久综合日本| 香蕉精品999视频一区二区| 亚洲午夜91| 宅男噜噜噜66一区二区| 亚洲免费观看高清在线观看 | 国产精品一区免费观看| 欧美三级电影一区| 欧美激情第8页| 免费一区二区三区| 久久综合九色综合欧美就去吻| 欧美一区二区三区精品电影| 亚洲一区二区精品视频| 中文亚洲欧美| 中文在线一区| 一区二区激情视频| 99精品欧美一区二区蜜桃免费| 亚洲国产美女| 伊人久久成人| 在线成人性视频| 亚洲大胆女人| 亚洲国产精品一区二区www| 在线日韩av片| 亚洲国产视频a| 亚洲欧洲一区二区在线播放| 亚洲韩国一区二区三区| 亚洲精品一区二区三区av| 日韩视频三区|