自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

會(huì)誘發(fā) Goroutine 掛起的 27 個(gè)原因

開發(fā) 后端
有小伙伴提到,雖然我們知道了 runtime.gopark 函數(shù)的緣起和內(nèi)在,但其實(shí)沒有提到 runtime.gopark 的誘發(fā)原因,畢竟他會(huì)導(dǎo)致 Goroutine 掛起,這是我們?nèi)粘>幋a中需要關(guān)注的。

[[422810]]

本文轉(zhuǎn)載自微信公眾號(hào)「腦子進(jìn)煎魚了」,作者陳煎魚。轉(zhuǎn)載本文請(qǐng)聯(lián)系腦子進(jìn)煎魚了公眾號(hào)。

大家好,我是煎魚。

上個(gè)月面向讀者的提問,我們針對(duì) goroutine 泄露中都會(huì)看到的大頭 runtime.gopark 函數(shù)進(jìn)行了學(xué)習(xí)和了解,輸出了 《Goroutine 一泄露就看到他,這是個(gè)什么?》。

有小伙伴提到,雖然我們知道了 runtime.gopark 函數(shù)的緣起和內(nèi)在,但其實(shí)沒有提到 runtime.gopark 的誘發(fā)原因,畢竟他會(huì)導(dǎo)致 Goroutine 掛起,這是我們?nèi)粘>幋a中需要關(guān)注的。

為此我整理了一下筆記,今天這篇文章就和大家一起圍觀 gopark 的 27 個(gè)誘發(fā)原因。為了方便閱讀,我們會(huì)根據(jù)分類進(jìn)行說明。

第一部分

標(biāo)識(shí) 含義
waitReasonZero
waitReasonGCAssistMarking GC assist marking
waitReasonIOWait IO wait
  • waitReasonZero:無正式解釋,從使用情況來看。主要在 sleep 和 lock 的 2 個(gè)場(chǎng)景中使用。
  • waitReasonGCAssistMarking:GC 輔助標(biāo)記階段會(huì)使得阻塞等待。
  • waitReasonIOWait:IO 阻塞等待時(shí),例如:網(wǎng)絡(luò)請(qǐng)求等。

 

第二部分

標(biāo)識(shí) 含義
waitReasonChanReceiveNilChan chan receive (nil chan)
waitReasonChanSendNilChan chan send (nil chan)
  • waitReasonChanReceiveNilChan:對(duì)未初始化的 channel 進(jìn)行讀操作。
  • waitReasonChanSendNilChan:對(duì)未初始化的 channel 進(jìn)行寫操作。

第三部分

標(biāo)識(shí) 含義
waitReasonDumpingHeap dumping heap
waitReasonGarbageCollection garbage collection
waitReasonGarbageCollectionScan garbage collection scan
  • waitReasonDumpingHeap:對(duì) Go Heap 堆 dump 時(shí),這個(gè)的使用場(chǎng)景僅在 runtime.debug 時(shí),也就是常見的 pprof 這一類采集時(shí)阻塞。
  • waitReasonGarbageCollection:在垃圾回收時(shí),主要場(chǎng)景是 GC 標(biāo)記終止(GC Mark Termination)階段時(shí)觸發(fā)。
  • waitReasonGarbageCollectionScan:在垃圾回收掃描時(shí),主要場(chǎng)景是 GC 標(biāo)記(GC Mark)掃描 Root 階段時(shí)觸發(fā)。

第四部分

標(biāo)識(shí) 含義
waitReasonPanicWait panicwait
waitReasonSelect select
waitReasonSelectNoCases select (no cases)
  • waitReasonPanicWait:在 main goroutine 發(fā)生 panic 時(shí),會(huì)觸發(fā)。
  • waitReasonSelect:在調(diào)用關(guān)鍵字 select 時(shí)會(huì)觸發(fā)。
  • waitReasonSelectNoCases:在調(diào)用關(guān)鍵字 select 時(shí),若一個(gè) case 都沒有,會(huì)直接觸發(fā)。

第五部分

標(biāo)識(shí) 含義
waitReasonGCAssistWait GC assist wait
waitReasonGCSweepWait GC sweep wait
waitReasonGCScavengeWait GC scavenge wait
  • waitReasonGCAssistWait:GC 輔助標(biāo)記階段中的結(jié)束行為,會(huì)觸發(fā)。
  • waitReasonGCSweepWait:GC 清掃階段中的結(jié)束行為,會(huì)觸發(fā)。
  • waitReasonGCScavengeWait:GC scavenge 階段的結(jié)束行為,會(huì)觸發(fā)。GC Scavenge 主要是新空間的垃圾回收,是一種經(jīng)常運(yùn)行、快速的 GC,負(fù)責(zé)從新空間中清理較小的對(duì)象。

第六部分

標(biāo)識(shí) 含義
waitReasonChanReceive chan receive
waitReasonChanSend chan send
waitReasonFinalizerWait finalizer wait
  • waitReasonChanReceive:在 channel 進(jìn)行讀操作,會(huì)觸發(fā)。
  • waitReasonChanSend:在 channel 進(jìn)行寫操作,會(huì)觸發(fā)。
  • waitReasonFinalizerWait:在 finalizer 結(jié)束的階段,會(huì)觸發(fā)。在 Go 程序中,可以通過調(diào)用 runtime.SetFinalizer 函數(shù)來為一個(gè)對(duì)象設(shè)置一個(gè)終結(jié)者函數(shù)。這個(gè)行為對(duì)應(yīng)著結(jié)束階段造成的回收。

第七部分

標(biāo)識(shí) 含義
waitReasonForceGCIdle force gc (idle)
waitReasonSemacquire semacquire
waitReasonSleep sleep
  • waitReasonForceGCIdle:強(qiáng)制 GC(空閑時(shí)間)結(jié)束時(shí),會(huì)觸發(fā)。
  • waitReasonSemacquire:信號(hào)量處理結(jié)束時(shí),會(huì)觸發(fā)。
  • waitReasonSleep:經(jīng)典的 sleep 行為,會(huì)觸發(fā)。

第八部分

標(biāo)識(shí) 含義
waitReasonSyncCondWait sync.Cond.Wait
waitReasonTimerGoroutineIdle timer goroutine (idle)
waitReasonTraceReaderBlocked trace reader (blocked)
  • waitReasonSyncCondWait:結(jié)合 sync.Cond 用法能知道,是在調(diào)用 sync.Wait 方法時(shí)所觸發(fā)。
  • waitReasonTimerGoroutineIdle:與 Timer 相關(guān),在沒有定時(shí)器需要執(zhí)行任務(wù)時(shí),會(huì)觸發(fā)。
  • waitReasonTraceReaderBlocked:與 Trace 相關(guān),ReadTrace會(huì)返回二進(jìn)制跟蹤數(shù)據(jù),將會(huì)阻塞直到數(shù)據(jù)可用。

第九部分

標(biāo)識(shí) 含義
waitReasonWaitForGCCycle wait for GC cycle
waitReasonGCWorkerIdle GC worker (idle)
waitReasonPreempted preempted
waitReasonDebugCall debug call
  • waitReasonWaitForGCCycle:等待 GC 周期,會(huì)休眠造成阻塞。
  • waitReasonGCWorkerIdle:GC Worker 空閑時(shí),會(huì)休眠造成阻塞。
  • waitReasonPreempted:發(fā)生循環(huán)調(diào)用搶占時(shí),會(huì)會(huì)休眠等待調(diào)度。
  • waitReasonDebugCall:調(diào)用 GODEBUG 時(shí),會(huì)觸發(fā)。

總結(jié)

今天這篇文章是對(duì)開頭 runtime.gopark 函數(shù)的詳解文章的一個(gè)補(bǔ)充,我們能夠?qū)Υ肆私獾狡湔T發(fā)的因素。

主要場(chǎng)景為:

  • 通道(Channel)。
  • 垃圾回收(GC)。
  • 休眠(Sleep)。
  • 鎖等待(Lock)。
  • 搶占(Preempted)。
  • IO 阻塞(IO Wait)
  • 其他,例如:panic、finalizer、select 等。

我們可以根據(jù)這些特性,去拆解可能會(huì)造成阻塞的原因。其實(shí)也就沒必要記了,他們會(huì)導(dǎo)致阻塞肯定是由于存在影響控制流的因素,才會(huì)導(dǎo)致 gopark 的調(diào)用。

 

責(zé)任編輯:武曉燕 來源: 腦子進(jìn)煎魚了
相關(guān)推薦

2022-02-18 15:07:29

goroutinepanic協(xié)程

2013-03-08 10:07:20

GO語言Goroutine

2022-06-15 14:33:27

大數(shù)據(jù)數(shù)據(jù)宕機(jī)云遷移

2021-10-11 08:58:34

Goroutine操作系統(tǒng)

2012-04-10 09:47:09

jQuery

2015-02-01 09:40:48

軟件項(xiàng)目

2018-04-26 10:48:36

機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)TensorFlow

2021-03-12 08:53:09

GC調(diào)度Goroutine

2012-03-07 10:13:35

云計(jì)算云服務(wù)IT環(huán)境

2023-10-29 16:37:23

Goroutine泄露

2011-03-30 09:53:43

jQueryjQuery插件

2020-11-02 14:17:29

VsCode 插件

2015-07-27 09:49:39

IOS開源庫

2023-11-20 22:55:00

Goroutine調(diào)度器

2010-08-05 10:00:18

NFS服務(wù)掛起

2020-07-09 10:26:28

軟件項(xiàng)目軟件開發(fā)CIO

2021-10-06 10:40:23

Core JavaJava編程語言

2021-06-18 10:03:37

變革管理首席信息官CIO

2024-10-30 14:50:31

2019-08-07 15:08:48

開發(fā)者技能工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)