日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

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

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

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

大家好,我是煎魚。

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

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

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

第一部分

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

 

第二部分

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

第三部分

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

第四部分

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

第五部分

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

第六部分

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

第七部分

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

第八部分

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

第九部分

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

總結(jié)

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

主要場景為:

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

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


網(wǎng)站欄目:會誘發(fā)Goroutine掛起的27個原因
文章網(wǎng)址:http://www.5511xx.com/article/cosgede.html