日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
會(huì)誘發(fā)Goroutine掛起的27個(gè)原因

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

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),西城企業(yè)網(wǎng)站建設(shè),西城品牌網(wǎng)站建設(shè),網(wǎng)站定制,西城網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,西城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

大家好,我是煎魚。

上個(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)用。


新聞標(biāo)題:會(huì)誘發(fā)Goroutine掛起的27個(gè)原因
當(dāng)前網(wǎng)址:http://www.dlmjj.cn/article/cosgede.html