GC
내가 참조하고 있는 글은 2019년에 Go 1.12v 때, 포스팅 된 글 이므로 최근의 Go와 다를 수 있다.
내가 알기론 STW도 제거하기 위해 시도하고 있다고 들었는데.. 이또한 찾아보아야겠다.
GC 과정
GC가 실행될 때, 세가지의 페이즈가 존재한다. 두가지는 STW 방식이고 한가지는 어플리케이션에 지연을 유발하는 동시성 방식이다. 세가지 페이즈는 순서대로
- Mark Setup - STW(Stop The World)
- Marking - Concurrent
- Mark Termination - STW
이다.
하나씩 살펴보자.
Mark Setup - STW
처음 GC가 실행되면 쓰기를 제한하는 튜닝을 하게되는데 이는 GC 고루틴과 어플리케이션 고루틴의 무결성을 위해서이다. 쓰기를 제한하기 위해 모든 고루틴은 멈춰야만 한다(STW). 이는 매우 순식간에 일어나는데 평균적으로 10~30 마이크로초가 소모된다.
하지만 이 과정에서 문제가 발생할 수 있다. 여러개의 고루틴 중 하나의 고루틴이 멈출 수 없는 단계에 있다면 나머지 고루틴은 그를 위해 계속해서 기다려야 할지도 모른다.
Marking - Concurrent
쓰기를 제한하는 튜닝이 종료되면 Marking이 시작된다. GC는 Marking을 하고자하는 그 고루틴을 사용하여 Marking 작업을 실행한다. 하지만 이 과정에 문제가 생긴다면 GC는 다른 고루틴으로 부터 Marking Assist를 모집한다. 이 Marking Assist를 모집하는 속도는 남은 heap 메모리가 차는 속도에 비례한다. 여기서 GC와 Marking Assist에 속하지 않는 고루틴은 본인의 일을 동시적으로 수행한다. GC의 일 중 하나는 이 Marking Assist의 생성을 적게하는 일이다. 만일 많은 수의 Marking Assist가 생성된다면 이를 줄이기 위해 다음 GC는 조금 더 빨리 수행될 것이다.
Mark Termination - STW
Marking 작업이 종료되면 다음은 그를 제거하는 일이다. 이 단계는 보통 60~90마이크로초가 소모된다. 그리고 쓰기를 제한하는 튜닝을 제거한다.
Sweeping
그리고 이와는 별개로 모든 GC 작업을 마치고 Sweeping 작업을 진행하는데 Marking 단계에서 사용하지 않는다 판단 된 메모리를 제거하는 일이다. 이 일은 GC 의 활동시간에 포함되지 않으며 각 고루틴의 메모리가 재 할당될 때에 일어난다.
---
참조 : https://www.ardanlabs.com/blog/2018/12/garbage-collection-in-go-part1-semantics.html
+++
Go release note를 살펴본 결과 go의 GC는 1.18버전에서의 수정이 있는데 Marking 단계에서 GC가 관리하는 부분을 non-heap 부분까지 확대시켰다고 한다. 이로써 조금 더 메모리 관리가 수월해 졌지만 더 많은 시간을 사용할 수 있는것에 유의하라는 내용이 있다.
'Study > Go' 카테고리의 다른 글
[Go] Google OAuth2.0 적용 (0) | 2022.08.29 |
---|---|
[Go] Context 패키지 알고쓰기 (0) | 2022.08.17 |
[Go] 고루틴(GoRoutine) 심화(7) - 파이프라인 (0) | 2022.06.24 |
[Go] 고루틴(GoRoutine) 심화(6) - 고루틴 에러 처리 (0) | 2022.06.20 |
[Go] 고루틴(GoRoutine) 심화(5) - 누수 관리 (0) | 2022.05.24 |