오늘 글에서는 고파크가 발생하는 27가지 원인에 대해 알려드리겠습니다. 읽기의 편의를 위해 카테고리별로 설명하겠습니다.
1부
로고 |
의미 |
waitReasonZero |
None |
waitReasonGCAssistMarking |
GC 지원 표시 |
waitReasonIOWait |
IO 대기 |
- waitReasonZero: 사용법으로 볼 때 공식적인 설명은 없습니다. 주로 절전 및 잠금이라는 두 가지 시나리오에 사용됩니다.
- waitReasonGCAssistMarking: GC 보조 표시 단계로 인해 차단 대기가 발생합니다.
- waitReasonIOWait: IO가 차단되어 대기 중인 경우(예: 네트워크 요청 등)
2부
로고 |
의미 |
waitReasonChanReceiveNilChan |
chan 수신 찬) |
waitReasonChanSendNilChan |
찬 보내(닐찬) |
- waitReasonChanReceiveNilChan: 초기화되지 않은 채널에 대한 읽기 작업입니다.
- waitReasonChanSendNilChan: 초기화되지 않은 채널에 작업을 씁니다.
3부
Logo |
Meaning |
waitReasonDumpingHeap |
덤핑 힙 |
waitReasonGarbageCollection |
가비지 수집 |
waitReasonGarbageCollectionScan |
가비지 수집 스캔 |
- waitReasonDumpingHeap: Go Heap 힙을 덤프할 때 이 사용 시나리오는 일반적인 pprof 유형의 컬렉션인 Runtime.debug 중에만 차단됩니다.
- waitReasonGarbageCollection: 가비지 수집 중에 트리거되며 주요 시나리오는 GC 마크 종료 단계입니다.
- waitReasonGarbageCollectionScan: 가비지 컬렉션 스캔 중에 GC 마크(GC 마크)가 루트 단계를 스캔하면 기본 시나리오가 트리거됩니다.
4부
Logo |
Meaning |
waitReasonPanic기다려 |
panicwait |
waitReasonSelect |
select |
waitReasonSelectNoCases |
select(사례 없음) |
- waitReasonPanicWait: 메인 고루틴에서 패닉이 발생할 때 트리거됩니다.
- waitReasonSelect: 키워드 선택을 호출할 때 트리거됩니다.
- waitReasonSelectNoCases: 키워드 선택 호출 시 사례가 없으면 직접 트리거됩니다.
5부
Logo |
Meaning |
waitReasonGCAssistWait |
GC 지원 대기 |
waitReasonGCScavengeWait |
GC 스윕 대기 |
waitReasonGCScavengeWait |
GC 청소 기다려 |
- waitReasonGCAssistWait: GC 보조 표시 단계의 종료 동작이 트리거됩니다.
- waitReasonGCSweepWait: GC 스윕 단계의 종료 동작이 트리거됩니다.
-
waitReasonGCScavengeWait: GC 청소 단계의 종료 동작이 트리거됩니다. GC Scavenge는 주로 새 공간의 가비지 수집입니다. 이는 새 공간에서 작은 개체를 정리하는 작업을 담당하는 자주 실행되는 빠른 GC입니다. ㅋㅋㅋ
waitReasonChanSend
chan sendwaitReasonFinalizerWait
finalizer 기다려
- waitReasonChanReceive: 채널에 대한 읽기 작업이 트리거됩니다.
- waitReasonChanSend: 채널에 쓸 때 트리거됩니다.
- waitReasonFinalizerWait: 종료자가 종료되면 트리거됩니다. Go 프로그램에서는
runtime.SetFinalizer 함수를 호출하여 개체에 대한 종료자 함수를 설정할 수 있습니다. 이 동작은 종료 단계로 인한 재활용에 해당합니다.
7부
logo |
meaning |
waitReasonForceGCIdle |
force gc(유휴) |
waitReasonSemacquire |
semacquire |
waitReasonSleep |
수면 |
- waitReasonForceGCIdle: 강제 GC(유휴 시간)가 종료되면 트리거됩니다.
- waitReasonSemacquire: 세마포어 처리가 끝나면 트리거됩니다.
- waitReasonSleep: 전형적인 수면 동작이 실행됩니다.
8부
Logo |
Meaning |
waitReasonSyncCondWait |
sync.Cond.Wa |
waitReasonTimerGoroutineIdle |
타이머 고루틴(유휴) |
waitReasonTraceReaderBlocked |
추적 판독기(차단됨) |
- waitReasonSyncCondWait:
sync.Cond 用法能知道,是在调用 sync.Wait 메서드와 결합하면 트리거됩니다.
- waitReasonTimerGoroutineIdle: 타이머와 관련하여 타이머가 작업을 수행할 필요가 없을 때 트리거됩니다.
-
waitReasonTraceReaderBlocked: Trace와 관련하여 ReadTrace는 바이너리 추적 데이터를 반환하고 데이터를 사용할 수 있을 때까지 차단합니다. ㅋㅋㅋ 주기
waitReasonGCWorkerIdleGC 작업자(유휴)
waitReasonPreempted
선점
|
waitReasonDebugCall |
디버그 호출
- waitReasonWaitForGCCycle: GC 주기를 기다리는 동안 잠자기 상태가 되어 차단이 발생합니다.
- waitReasonGCWorkerIdle: GC 작업자가 유휴 상태이면 절전 모드가 되어 차단이 발생합니다.
- waitReasonPreempted: 순환 호출 선점이 발생하면 절전 모드로 전환되어 예약을 기다립니다.
- waitReasonDebugCall: GODEBUG가 호출될 때 트리거됩니다.
요약
오늘의 글은 시작 부분에 있는 Runtime.gopark 함수에 대한 자세한 설명을 보충한 것입니다.
주요 장면은 다음과 같습니다.
이러한 특성을 이용하여 막힘을 유발할 수 있는 원인을 분해할 수 있습니다. 사실 기억할 필요도 없고, 제어 흐름에 영향을 미치는 요소가 있어서 블로킹을 일으키게 되고, 이로 인해 고파크 호출이 발생하게 됩니다.
|
|
위 내용은 고루틴이 중단되는 27가지 이유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!