AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

記一次 .NET某網絡邊緣計算系統 卡死分析

來源: 責編: 時間:2024-07-01 17:13:43 138觀看
導讀一、背景1. 講故事早就聽說過有什么 網絡邊緣計算,這次還真給遇到了,有點意思,問了下 chatgpt 這是干嘛的 ?網絡邊緣計算是一種計算模型,它將計算能力和數據存儲位置從傳統的集中式數據中心向網絡邊緣的用戶設備、傳感器

一、背景

1. 講故事

早就聽說過有什么 網絡邊緣計算,這次還真給遇到了,有點意思,問了下 chatgpt 這是干嘛的 ?3LT28資訊網——每日最新資訊28at.com

網絡邊緣計算是一種計算模型,它將計算能力和數據存儲位置從傳統的集中式數據中心向網絡邊緣的用戶設備、傳感器和其他物聯網設備移動。這種模型的目的是在接近數據生成源頭的地方提供更快速的計算和數據處理能力,從而減少數據傳輸延遲并提高服務質量。網絡邊緣計算使得在設備本地進行數據處理和決策成為可能,同時也有助于減輕對中心數據中心的網絡流量和負載。3LT28資訊網——每日最新資訊28at.com

看到.NET還有這樣的應用場景還是挺欣慰的,接下來就來分析下這個dump到底是怎么回事?3LT28資訊網——每日最新資訊28at.com

二、WinDbg 分析

1. 為什么會卡死

不同程序的卡死有不同的分析方式,所以要先鑒別下程序的類型以及主線程的調用棧即可,參考如下:3LT28資訊網——每日最新資訊28at.com

0:000> !eeversion5.0.721.255085.0.721.25508 @Commit: 556582d964cc21b82a88d7154e915076f6f9008eServer mode with 64 gc heapsSOS Version: 8.0.10.10501 retail build0:000> k # Child-SP          RetAddr               Call Site00 0000ffff`e0dddac0 0000fffd`c194c30c     libpthread_2_28!pthread_cond_wait+0x238...18 (Inline Function) --------`--------     libcoreclr!RunMain::$_0::operator()::{lambda(Param *)#1}::operator()+0x14c [/__w/1/s/src/coreclr/src/vm/assembly.cpp @ 1536] 19 (Inline Function) --------`--------     libcoreclr!RunMain::$_0::operator()+0x188 [/__w/1/s/src/coreclr/src/vm/assembly.cpp @ 1538] 1a 0000ffff`e0dde600 0000fffd`c153e860     libcoreclr!RunMain+0x298 [/__w/1/s/src/coreclr/src/vm/assembly.cpp @ 1538] ...20 0000ffff`e0dded10 0000fffd`c1bf7800     libhostpolicy!corehost_main+0xc0 [/root/runtime/src/installer/corehost/cli/hostpolicy/hostpolicy.cpp @ 409] 21 (Inline Function) --------`--------     libhostfxr!execute_app+0x2c0 [/root/runtime/src/installer/corehost/cli/fxr/fx_muxer.cpp @ 146] 22 (Inline Function) --------`--------     libhostfxr!<unnamed-namespace>::read_config_and_execute+0x3b4 [/root/runtime/src/installer/corehost/cli/fxr/fx_muxer.cpp @ 520] 23 0000ffff`e0ddeeb0 0000fffd`c1bf6840     libhostfxr!fx_muxer_t::handle_exec_host_command+0x57c [/root/runtime/src/installer/corehost/cli/fxr/fx_muxer.cpp @ 1001] 24 0000ffff`e0ddf000 0000fffd`c1bf4090     libhostfxr!fx_muxer_t::execute+0x2ec25 0000ffff`e0ddf130 0000aaad`c9e1d22c     libhostfxr!hostfxr_main_startupinfo+0xa0 [/root/runtime/src/installer/corehost/cli/fxr/hostfxr.cpp @ 50] 26 0000ffff`e0ddf200 0000aaad`c9e1d468     dotnet!exe_start+0x36c [/root/runtime/src/installer/corehost/corehost.cpp @ 239] 27 0000ffff`e0ddf370 0000fffd`c1c63fe0     dotnet!main+0x90 [/root/runtime/src/installer/corehost/corehost.cpp @ 302] 28 0000ffff`e0ddf3b0 0000aaad`c9e13adc     libc_2_28!_libc_start_main+0xe029 0000ffff`e0ddf4e0 00000000`00000000     dotnet!start+0x34

從卦中的指標來看,這是一個 Linux 上部署的 Web網站,既然是網站的卡死,那就要關注各個線程都在做什么。3LT28資訊網——每日最新資訊28at.com

2. 線程都在干嘛

以我多年的分析經驗,絕大多數都是由于 線程饑餓 或者說 線程池耗盡 導致的,首先我們看下線程池的情況。3LT28資訊網——每日最新資訊28at.com

0:000> !tThreadCount:      365UnstartedThread:  0BackgroundThread: 354PendingThread:    0DeadThread:       10Hosted Runtime:   no                                                                                                            Lock   DBG   ID     OSID ThreadOBJ           State GC Mode     GC Alloc Context                  Domain           Count Apt Exception   0    1    31eaf 0000AAADF267C600  2020020 Preemptive  0000000000000000:0000000000000000 0000aaadf26634b0 -00001 Ukn ... 423  363    36d30 0000FFDDB4000B20  1020220 Preemptive  0000000000000000:0000000000000000 0000aaadf26634b0 -00001 Ukn (Threadpool Worker)  424  364    36d31 0000FFDDA8000B20  1020220 Preemptive  0000000000000000:0000000000000000 0000aaadf26634b0 -00001 Ukn (Threadpool Worker)  425  365    36d32 0000FFDDAC000B20  1020220 Preemptive  0000000000000000:0000000000000000 0000aaadf26634b0 -00001 Ukn (Threadpool Worker) 0:000> !tpUsing the Portable thread pool.CPU utilization:  9%Workers Total:    252Workers Running:  236Workers Idle:     13Worker Min Limit: 64Worker Max Limit: 32767Completion Total:   0Completion Free:    0Completion MaxFree: 128Completion Current Limit: 0Completion Min Limit:     64Completion Max Limit:     1000

從卦中看當前有 365 個托管線程,這個算多嗎?對于64core 來說,這個線程其實算是正常,訓練營里的朋友都知道,server版的gc僅gc線程就有 64*2=128 個,接下來再看一個指標就是當前是否存在任務積壓?可以使用 !ext tpq 命令,參考輸出如下:3LT28資訊網——每日最新資訊28at.com

0:000> !ext tpqglobal work item queue________________________________local per thread work items_____________________________________

從卦中看當前沒有任務積壓,這就有點反經驗了。3LT28資訊網——每日最新資訊28at.com

3. 真的不是線程饑餓嗎

最后一招比較徹底,就是看各個線程棧都在做什么,可以使用 ~*e !clrstack 命令。3LT28資訊網——每日最新資訊28at.com

這不看不知道,一看嚇一跳,有 193 個線程在 Task.Result 上等待,這玩意太經典了,然后從上面的調用棧 UIUpdateTimer_Elapsed 來看,貌似是一個定時器導致的,接下來我就好奇這代碼是怎么寫的?3LT28資訊網——每日最新資訊28at.com

分析上面的代碼之后,我發現它是和 Linux Shell 窗口進行命令交互,不知道為何 Shell 沒有響應導致代碼在這里卡死。3LT28資訊網——每日最新資訊28at.com

4. 為什么線程池沒有積壓

相信有很多朋友對這個反經驗的東西很好奇為什么請求沒有積壓在線程池,其實這個考驗的是你對 PortableThreadPool 的底層了解,這里我就簡單說一下吧。3LT28資訊網——每日最新資訊28at.com

  • 在 ThreadPool 中有一個 GateThread 線程是專門給線程池動態注入線程的,參考代碼如下:
private static class GateThread{    private static void GateThreadStart()    {        while (true)        {            bool wasSignaledToWake = DelayEvent.WaitOne((int)delayHelper.GetNextDelay(tickCount));            WorkerThread.MaybeAddWorkingWorker(threadPoolInstance);        }    }}
  • 一旦有人調用了 Task.Result 代碼,內部會主動喚醒 DelayEvent 事件,告訴 GateThread 趕緊通過 MaybeAddWorkingWorker 方法給我注入新的線程,參考代碼如下:
private bool SpinThenBlockingWait(int millisecondsTimeout, CancellationToken cancellationToken){    bool flag3 = ThreadPool.NotifyThreadBlocked();}internal static bool NotifyThreadBlocked(){    if (UsePortableThreadPool)    {        return PortableThreadPool.ThreadPoolInstance.NotifyThreadBlocked();    }    return false;}public bool NotifyThreadBlocked(){    GateThread.Wake(this);}

上面這種主動喚醒的機制是 C# 版 PortableThreadPool 做的優化來緩解線程饑餓的,這里有一個重點就是它只能緩解,換句話說如果上游太猛了還是會有請求積壓的,但為什么這里沒有積壓呢?很顯然上游不猛唄,那如何眼見為實呢?這就需要看 timer 的周期數即可,到當前的線程棧上給扒出來。3LT28資訊網——每日最新資訊28at.com

0:417> !DumpObj /d 0000ffee380757f8Name:        System.Timers.TimerMethodTable: 0000fffd4ab24030EEClass:     0000fffd4ad6e140Size:        88(0x58) bytesFile:        /home/user/env/dotnet/shared/Microsoft.NETCore.App/5.0.7/System.ComponentModel.TypeConverter.dllFields:              MT    Field   Offset                 Type VT     Attr            Value Name0000fffd4c947498  400001c        8 ...ponentModel.ISite  0 instance 0000000000000000 _site0000000000000000  400001d       10 ....EventHandlerList  0 instance 0000000000000000 _events0000fffd479195d8  400001b       98        System.Object  0   static 0000000000000000 s_eventDisposed0000fffd47926f60  400000e       40        System.Double  1 instance 3000.000000 _interval0000fffd4791fb10  400000f       48       System.Boolean  1 instance                1 _enabled0000fffd4791fb10  4000010       49       System.Boolean  1 instance                0 _initializing0000fffd4791fb10  4000011       4a       System.Boolean  1 instance                0 _delayedEnable0000fffd4ab241d8  4000012       18 ...apsedEventHandler  0 instance 0000ffee3807aae8 _onIntervalElapsed0000fffd4791fb10  4000013       4b       System.Boolean  1 instance                1 _autoReset0000fffd4c944ea0  4000014       20 ...SynchronizeInvoke  0 instance 0000000000000000 _synchronizingObject0000fffd4791fb10  4000015       4c       System.Boolean  1 instance                0 _disposed0000fffd49963e28  4000016       28 ...m.Threading.Timer  0 instance 0000ffee38098dc8 _timer0000fffd48b90a30  4000017       30 ...ing.TimerCallback  0 instance 0000ffee3807aaa8 _callback0000fffd479195d8  4000018       38        System.Object  0 instance 0000ffee38098db0 _cookie

從卦中看當前是 3s 為一個周期,這就能解釋為什么線程池沒有積壓的底層原因了。3LT28資訊網——每日最新資訊28at.com

三、總結

這個卡死事故還是蠻好解決的,如果有一些經驗直接用dotnet-counter也是能搞定的,重點在于這是一個 Linux的dump,同時又是 .NET上的一個很好玩的場景,故此分享出來。3LT28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-97895-0.html記一次 .NET某網絡邊緣計算系統 卡死分析

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

上一篇: 都用10年了,gRPC有什么不好的?

下一篇: 深入探討 C++ 中的內部類:封裝與模塊化的利器

標簽:
  • 熱門焦點
  • 紅魔電競平板評測:大屏幕硬實力

    前言:三年的疫情因為要上網課的原因激活了平板市場,如今網課的時代已經過去,大家的生活都恢復到了正軌,這也就意味著,真正考驗平板電腦生存的環境來了。也就是面對著這種殘酷的
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • 十個簡單但很有用的Python裝飾器

    裝飾器(Decorators)是Python中一種強大而靈活的功能,用于修改或增強函數或類的行為。裝飾器本質上是一個函數,它接受另一個函數或類作為參數,并返回一個新的函數或類。它們通常用
  • Temu起訴SHEIN,跨境電商戰事升級

    來源 | 伯虎財經(bohuFN)作者 | 陳平安日前據外媒報道,拼多多旗下跨境電商平臺Temu正對競爭對手SHEIN提起新訴訟,訴狀稱Shein&ldquo;利用市場支配力量強迫服裝廠商與之簽訂獨家
  • 自律,給不了Keep自由!

    來源 | 互聯網品牌官作者 | 李大為編排 | 又耳 審核 | 谷曉輝自律能不能給用戶自由暫時不好說,但大概率不能給Keep自由。近日,全球最大的在線健身平臺Keep正式登陸港交所,努力
  • 小米公益基金會捐贈2500萬元馳援北京、河北暴雨救災

    8月2日消息,今日小米科技創始人雷軍在其微博上發布消息稱,小米公益基金會宣布捐贈2500萬元馳援北京、河北暴雨救災。攜手抗災,京冀安康!以下為公告原文
  • 造車兩年股價跌六成,小米的估值邏輯變了嗎?

    如果從小米官宣造車后的首個交易日起持有小米集團的股票,那么截至2023年上半年最后一個交易日,投資者將浮虧59.16%,同區間的恒生科技指數跌幅為52.78%
  • 中關村論壇11月25日開幕,15位諾獎級大咖將發表演講

    11月18日,記者從2022中關村論壇新聞發布會上獲悉,中關村論壇將于11月25至30日在京舉行。本屆中關村論壇由科學技術部、國家發展改革委、工業和信息化部、國務
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top