今日の記事では、ゴーパークの 27 の原因を紹介します。読みやすいようにカテゴリー別に説明していきます。
#パート 1
##識別
意味 |
|
waitReasonZero
なし |
| ##waitReasonGCAssistMarking
GC アシスト マーキング |
| waitReasonIOWait
IO wait |
|
- waitReasonZero: 使用方法から判断すると、公式の説明はありません。主にスリープとロックの 2 つのシナリオで使用されます。
- waitReasonGCAssistMarking: GC 補助マーキング フェーズにより、ブロッキング待機が発生します。
- waitReasonIOWait: IO がブロックされて待機しているとき (例: ネットワーク リクエストなど)。
#パート 2
##識別#意味 |
|
##waitReasonChanReceiveNilChan
chan 受信 (ニルチャン)
|
waitReasonChanSendNilChan |
ちゃん送信 (ニルちゃん)
|
- waitReasonChanReceiveNilChan: 初期化されていないチャネルを読み取ります。
- waitReasonChanSendNilChan: 初期化されていないチャネルに書き込みます。
#パート 3
##識別
意味 |
|
waitReasonDumpingHeap
ダンプ ヒープ |
waitReasonGarbageCollection |
ガベージ コレクション |
waitReasonGarbageCollectionScan |
ガベージ コレクション スキャン
|
- waitReasonDumpingHeap: Go Heap ヒープ ダンプの場合、この使用シナリオは、一般的な pprof タイプのコレクションである runtime.debug 中にのみブロックされます。
- waitReasonGarbageCollection: ガベージ コレクション中にトリガーされ、メイン シナリオは GC マーク終了フェーズです。
- waitReasonGarbageCollectionScan: ガベージ コレクションのスキャン中に、GC マーク (GC マーク) がルート ステージをスキャンすると、メイン シナリオがトリガーされます。
#パート 4
##識別#意味 |
|
#waitReasonPanicWait
panicwait
| waitReasonSelect | select
| waitReasonSelectNoCases | 選択 (ケースなし)
|
- waitReasonPanicWait: メイン goroutine でパニックが発生するとトリガーされます。
- waitReasonSelect: キーワード select を呼び出すときにトリガーされます。
- waitReasonSelectNoCases: キーワード select を呼び出すとき、大文字と小文字が存在しない場合は、直接トリガーされます。
#パート 5
##識別#意味 |
|
#waitReasonGCAssistWait
GC アシスト待機
| ##waitReasonGCSoupWait | GC スイープ待機
| waitReasonGCScavengeWait | GC スイープ待機
|
- waitReasonGCAssistWait: GC 補助マークフェーズの終了動作がトリガーされます。
- waitReasonGCSoupWait: GC クリーニング フェーズの終了動作がトリガーされます。
- waitReasonGCScavengeWait: GC スカベンジ フェーズの終了動作がトリガーされます。 GC Scavenge は主に新しいスペースのガベージ コレクションであり、新しいスペースから小さなオブジェクトをクリーンアップする役割を担う、頻繁に実行される高速な GC です。
#パート 6
##識別
意味 |
|
##waitReasonChanReceive
chan 受信 |
| waitReasonChanSend
chan send |
| waitReasonFinalizerWait
ファイナライザーの待機 |
|
- waitReasonChanReceive: チャネルの読み取り操作がトリガーされます。
- waitReasonChanSend: チャネルへの書き込み時にトリガーされます。
- waitReasonFinalizerWait: ファイナライザーの終了時にトリガーされます。 Go プログラムでは、
runtime.SetFinalizer 関数を呼び出すことで、オブジェクトのファイナライザー関数を設定できます。この動作は、終了フェーズによって引き起こされるリサイクルに対応します。
#パート 7
##識別#意味 |
|
waitReasonForceGCIdle
force gc (idle)
|
waitReasonSemacquire |
semacquire
|
waitReasonSleep |
sleep
|
- waitReasonForceGCIdle: 強制 GC (アイドル時間) が終了するとトリガーされます。
- waitReasonSemacquire: セマフォ処理が終了するとトリガーされます。
- waitReasonSleep: 古典的な睡眠動作がトリガーされます。
#パート 8
##識別#意味 |
|
#waitReasonSyncCondWait
sync.Cond.Wait
| waitReasonTimerGoroutineIdle | タイマーゴルーチン(アイドル)
| waitReasonTraceReaderBlocked | トレース リーダー (ブロックされました)
|
- waitReasonSyncCondWait:
sync.Cond の使用法と組み合わせると、sync.Wait メソッドが呼び出されたときにトリガーされることがわかります。
- waitReasonTimerGoroutineIdle: タイマーに関連し、タスクを実行する必要のないタイマーが存在しない場合にトリガーされます。
- waitReasonTraceReaderBlocked: トレースに関連して、ReadTrace はバイナリ トレース データを返し、データが利用可能になるまでブロックします。
#パート 9
##識別#意味 |
|
##waitReasonWaitForGCCycle
GC サイクルを待つ
|
waitReasonGCWorkerIdle |
GC ワーカー(アイドル)
|
waitReasonPreempted |
preempted
|
waitReasonDebugCall |
デバッグ呼び出し |
- waitReasonWaitForGCCycle: GC サイクルを待機するとスリープになり、ブロックが発生します。
- waitReasonGCWorkerIdle: GC ワーカーがアイドル状態の場合、スリープ状態になり、ブロックが発生します。
- waitReasonPreempted: サイクリック コール プリエンプションが発生すると、スリープしてスケジューリングを待ちます。
- waitReasonDebugCall: GODEBUG が呼び出されたときにトリガーされます。
概要
今日の記事は、冒頭の runtime.gopark 関数の詳細な説明の補足であり、runtime.gopark 関数について学ぶことができます。誘発要因。
メインシーンは:
- ガベージ コレクション (GC)。 ############寝る。
- これらの特性を利用して、ブロッキングの原因となる可能性のある理由を解体できます。実際、覚えておく必要はありませんが、制御フローに影響を与える要因があるため、ブロックが発生し、gopark の呼び出しにつながります。
|
|
|
|