Goroutine がハングする 27 の理由

リリース: 2023-08-08 16:25:34
転載
763 人が閲覧しました

今日の記事では、ゴーパークの 27 の原因を紹介します。読みやすいようにカテゴリー別に説明していきます。

#パート 1

##識別waitReasonZero##waitReasonGCAssistMarkingGC アシスト マーキング waitReasonIOWaitIO wait
  • waitReasonZero: 使用方法から判断すると、公式の説明はありません。主にスリープとロックの 2 つのシナリオで使用されます。
  • waitReasonGCAssistMarking: GC 補助マーキング フェーズにより、ブロッキング待機が発生します。
  • waitReasonIOWait: IO がブロックされて待機しているとき (例: ネットワーク リクエストなど)。

#パート 2

意味
なし
##識別#意味##waitReasonChanReceiveNilChanchan 受信 (ニルチャン)ちゃん送信 (ニルちゃん)
waitReasonChanSendNilChan
  • waitReasonChanReceiveNilChan: 初期化されていないチャネルを読み取ります。
  • waitReasonChanSendNilChan: 初期化されていないチャネルに書き込みます。

#パート 3

##識別waitReasonDumpingHeapダンプ ヒープガベージ コレクションガベージ コレクション スキャン
意味
waitReasonGarbageCollection
waitReasonGarbageCollectionScan
  • waitReasonDumpingHeap: Go Heap ヒープ ダンプの場合、この使用シナリオは、一般的な pprof タイプのコレクションである runtime.debug 中にのみブロックされます。
  • waitReasonGarbageCollection: ガベージ コレクション中にトリガーされ、メイン シナリオは GC マーク終了フェーズです。
  • waitReasonGarbageCollectionScan: ガベージ コレクションのスキャン中に、GC マーク (GC マーク) がルート ステージをスキャンすると、メイン シナリオがトリガーされます。

#パート 4

##識別#意味#waitReasonPanicWaitpanicwaitwaitReasonSelectselectwaitReasonSelectNoCases選択 (ケースなし)
  • waitReasonPanicWait: メイン goroutine でパニックが発生するとトリガーされます。
  • waitReasonSelect: キーワード select を呼び出すときにトリガーされます。
  • waitReasonSelectNoCases: キーワード select を呼び出すとき、大文字と小文字が存在しない場合は、直接トリガーされます。

#パート 5

##識別#意味#waitReasonGCAssistWaitGC アシスト待機##waitReasonGCSoupWait GC スイープ待機waitReasonGCScavengeWaitGC スイープ待機
  • waitReasonGCAssistWait: GC 補助マークフェーズの終了動作がトリガーされます。
  • waitReasonGCSoupWait: GC クリーニング フェーズの終了動作がトリガーされます。
  • waitReasonGCScavengeWait: GC スカベンジ フェーズの終了動作がトリガーされます。 GC Scavenge は主に新しいスペースのガベージ コレクションであり、新しいスペースから小さなオブジェクトをクリーンアップする役割を担う、頻繁に実行される高速な GC です。

#パート 6

##識別##waitReasonChanReceivechan 受信waitReasonChanSendchan sendwaitReasonFinalizerWaitファイナライザーの待機
  • waitReasonChanReceive: チャネルの読み取り操作がトリガーされます。
  • waitReasonChanSend: チャネルへの書き込み時にトリガーされます。
  • waitReasonFinalizerWait: ファイナライザーの終了時にトリガーされます。 Go プログラムでは、runtime.SetFinalizer 関数を呼び出すことで、オブジェクトのファイナライザー関数を設定できます。この動作は、終了フェーズによって引き起こされるリサイクルに対応します。

#パート 7

意味
##識別#意味waitReasonForceGCIdleforce gc (idle)semacquire sleep
waitReasonSemacquire
waitReasonSleep
  • waitReasonForceGCIdle: 強制 GC (アイドル時間) が終了するとトリガーされます。
  • waitReasonSemacquire: セマフォ処理が終了するとトリガーされます。
  • waitReasonSleep: 古典的な睡眠動作がトリガーされます。

#パート 8

##識別#意味#waitReasonSyncCondWaitsync.Cond.WaitwaitReasonTimerGoroutineIdleタイマーゴルーチン(アイドル)waitReasonTraceReaderBlockedトレース リーダー (ブロックされました)
  • waitReasonSyncCondWait: sync.Cond の使用法と組み合わせると、sync.Wait メソッドが呼び出されたときにトリガーされることがわかります。
  • waitReasonTimerGoroutineIdle: タイマーに関連し、タスクを実行する必要のないタイマーが存在しない場合にトリガーされます。
  • waitReasonTraceReaderBlocked: トレースに関連して、ReadTrace はバイナリ トレース データを返し、データが利用可能になるまでブロックします。

#パート 9

##識別#意味##waitReasonWaitForGCCycleGC サイクルを待つGC ワーカー(アイドル)preemptedデバッグ呼び出し
waitReasonGCWorkerIdle
waitReasonPreempted
waitReasonDebugCall
  • waitReasonWaitForGCCycle: GC サイクルを待機するとスリープになり、ブロックが発生します。
  • waitReasonGCWorkerIdle: GC ワーカーがアイドル状態の場合、スリープ状態になり、ブロックが発生します。
  • waitReasonPreempted: サイクリック コール プリエンプションが発生すると、スリープしてスケジューリングを待ちます。
  • waitReasonDebugCall: GODEBUG が呼び出されたときにトリガーされます。

概要

今日の記事は、冒頭の runtime.gopark 関数の詳細な説明の補足であり、runtime.gopark 関数について学ぶことができます。誘発要因。

メインシーンは:

  1. チャンネルです。
  2. ガベージ コレクション (GC)。 ############寝る。
  3. ロック待機中 (ロック)。
  4. プリエンプトされました。
  5. IO ブロック (IO 待機)
  6. その他: パニック、ファイナライザー、選択など。
  7. これらの特性を利用して、ブロッキングの原因となる可能性のある理由を解体できます。実際、覚えておく必要はありませんが、制御フローに影響を与える要因があるため、ブロックが発生し、gopark の呼び出しにつながります。

以上がGoroutine がハングする 27 の理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:Golang菜鸟
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!