Gitaly 타임아웃 및 재시도
Offering: GitLab Self-Managed
Gitaly는 두 가지 유형의 구성 가능한 타임아웃을 제공합니다: 장기 실행되는 Gitaly 호출이 불필요하게 리소스를 차지하지 않도록 다음 호출 타임아웃을 구성합니다. 다양한 Gitaly 작업에 대해 서로 다른 호출 타임아웃을 사용할 수 있습니다.
Gitaly는 두 가지 유형의 구성 가능한 타임아웃을 제공합니다:
- 호출 타임아웃: GitLab UI를 사용하여 구성합니다.
- 협상 타임아웃: Gitaly 구성 파일을 사용하여 구성합니다.
호출 타임아웃 구성#
장기 실행되는 Gitaly 호출이 불필요하게 리소스를 차지하지 않도록 다음 호출 타임아웃을 구성합니다.
사전 요구 사항:
- 관리자 액세스 권한.
호출 타임아웃을 구성하려면:
- 오른쪽 상단에서 관리자를 선택합니다.
- 왼쪽 사이드바에서 설정 > 기본 설정을 선택합니다.
- Gitaly 타임아웃 섹션을 확장합니다.
- 필요에 따라 각 타임아웃을 설정합니다.
사용 가능한 호출 타임아웃#
다양한 Gitaly 작업에 대해 서로 다른 호출 타임아웃을 사용할 수 있습니다.
| 타임아웃 | 기본값 | 설명 |
|---|---|---|
| 기본 | 55초 | 대부분의 Gitaly 호출에 대한 타임아웃(git fetch 및 push 작업 또는 Sidekiq 잡에는 적용되지 않음). 예를 들어 저장소가 디스크에 있는지 확인하는 경우. 웹 요청에서 이루어진 Gitaly 호출이 전체 요청 타임아웃을 초과할 수 없도록 합니다. Puma에 구성할 수 있는 워커 타임아웃보다 짧아야 합니다. Gitaly 호출 타임아웃이 워커 타임아웃을 초과하면 워커를 종료하지 않기 위해 워커 타임아웃의 남은 시간이 사용됩니다. |
| 빠름 | 10초 | 요청에서 사용되는 빠른 Gitaly 작업에 대한 타임아웃(때로는 여러 번). 예를 들어 저장소가 디스크에 있는지 확인하는 경우. 빠른 작업이 이 임계값을 초과하면 스토리지 샤드에 문제가 있을 수 있습니다. 빠른 실패는 GitLab 인스턴스의 안정성을 유지하는 데 도움이 됩니다. |
| 중간 | 30초 | 빠르게 처리해야 하지만(요청에서 가능하면) 요청에서 여러 번 사용하지 않는 것이 좋은 Gitaly 작업에 대한 타임아웃. 예를 들어 블롭 로딩. 기본과 빠름 사이로 설정해야 합니다. |
기본적으로 기본 타임아웃은 57초보다 높게 설정할 수 없습니다. 자세한 내용은 Gitaly 기본 타임아웃을 57초 이상으로 올릴 수 없음을 참조하세요.
협상 타임아웃 구성#
히스토리
- GitLab 16.5에서 도입되었습니다.
다음의 경우 협상 타임아웃을 늘려야 할 수 있습니다:
- 특히 큰 저장소의 경우.
- 이러한 명령을 병렬로 실행하는 경우.
다음에 대한 협상 타임아웃을 구성할 수 있습니다:
git-upload-pack(1):git fetch를 실행할 때 Gitaly 노드에서 호출됩니다.git-upload-archive(1):git archive --remote를 실행할 때 Gitaly 노드에서 호출됩니다.
이러한 타임아웃을 구성하려면:
/etc/gitlab/gitlab.rb를 편집합니다:
gitaly['configuration'] = {
timeout: {
upload_pack_negotiation: '10m', # 10 minutes
upload_archive_negotiation: '20m', # 20 minutes
}
}
/home/git/gitaly/config.toml을 편집합니다:
[timeout]
upload_pack_negotiation = "10m"
upload_archive_negotiation = "20m"
값에는 Go의 ParseDuration 형식을 사용합니다.
이러한 타임아웃은 원격 Git 작업의 협상 단계에만 영향을 미치며, 전체 전송에는 영향을 미치지 않습니다.
Gitaly 클라이언트 재시도#
히스토리
- GitLab 18.10에서 도입되었습니다.
Gitaly는 때때로 잠시 사용 불가능할 수 있습니다. 예를 들어 GitLab 업그레이드 중에. 특히 Kubernetes의 Gitaly에서는 Pod 시작 및 재시작이 몇 초가 걸립니다.
Gitaly가 잠시 사용 불가능할 때 클라이언트에 오류가 반환되는 것을 방지하려면 Gitaly 클라이언트 재시도를 구성합니다. Gitaly 클라이언트 재시도가 구성되고 Gitaly가 사용 불가능한 경우, Rails(GitLab 애플리케이션), Workhorse, GitLab Shell 등의 Gitaly 클라이언트가 지수 백오프 방식으로 요청을 재시도합니다.
두 가지 매개변수를 구성할 수 있습니다:
max_attempts: 2에서 5 사이의 최대 재시도 횟수.max_backoff: 클라이언트가 재시도를 중지하기 전의 최대 대기 시간. 값은1.4s또는10s와 같은 기간 문자열이어야 합니다.
백오프 배수는 2로 설정되며 초기 백오프는 두 매개변수에서 도출됩니다.
구성 가이드라인#
올바른 구성은 GitLab 인스턴스 설정과 이러한 이벤트 발생 시 Gitaly가 사용 불가능한 기간에 따라 다릅니다:
- Kubernetes에서 Gitaly Pod는 클라우드 제공자에 따라 시작하는 데 약 10~12초가 걸릴 수 있습니다. 이 시간에는 볼륨이 Pod에 연결 및 마운트되는 데 걸리는 시간이 포함됩니다.
- Linux 패키지 인스턴스의 경우 Gitaly 재시작이 프로세스 재시작이기 때문에 훨씬 빠르게 재시작될 수 있습니다.
또한 Gitaly는 정상적인 종료 타임아웃으로 구성될 수 있다는 점을 유의하세요. Gitaly가 종료 중일 때 새 요청은 거부되지만 gRPC 서버는 다음 중 하나가 될 때까지 진행 중인 요청을 계속 처리합니다:
- 모든 요청이 처리됩니다.
- 종료 타임아웃이 만료됩니다.
이 정상적인 종료 타임아웃은 새 요청에 대해 Gitaly가 사용 불가능한 기간에 영향을 줄 수 있습니다.
정상적인 종료 + (재)시작 시간의 합과 같거나 더 큰 max_backoff로 클라이언트 재시도를 구성해야 합니다.
클라이언트 재시도 구성#
다음 구성은 Rails(GitLab 애플리케이션), Workhorse, GitLab Shell에 적용되며 동일한 구성이 모든 클라이언트에 적용됩니다.
제공된 값은 예시이며 지침으로 취급하지 마세요.
gitlab.rb 파일을 이 구성으로 업데이트합니다:
gitlab_rails['gitaly_client_max_attempts'] = 5
gitlab_rails['gitaly_client_max_backoff'] = '1.4s'
values.yml 파일을 이 구성으로 업데이트합니다:
global:
gitaly:
client:
maxAttempts: 5
maxBackoff: '1.4s'
문제 해결#
Gitaly 타임아웃 작업 중 다음 문제가 발생할 수 있습니다.
Gitaly 기본 타임아웃을 57초 이상으로 올릴 수 없음#
이러한 값은 필요할 때만 올리세요. 워커 타임아웃이 높을수록 느리거나 멈춘 요청이 Puma 워커를 더 오래 점유하게 되어 인스턴스 용량이 감소합니다. Gitaly 기본 타임아웃을 올리는 일반적인 이유로는 느린 스토리지의 매우 큰 저장소, 비용이 많이 드는 diff 또는 compare 뷰, 또는 성능 저하된 Gitaly Cluster 노드 등이 있습니다. 임포트, 미러, 하우스키핑과 같은 백그라운드 작업의 경우 이 제한을 받지 않는 Sidekiq으로 오프로딩하는 것이 좋습니다.
기본적으로 기본 타임아웃은 57초 이상으로 올릴 수 없습니다.
타임아웃을 더 높게 설정하려고 하면 다음 유효성 검사 오류가 발생합니다:
Gitaly timeout default must be less than or equal to 57
이 제한은 세 가지 상호 작용하는 타임아웃에 의해 부과됩니다:
-
puma['worker_timeout']: 워커당 Puma 타임아웃. 기본값은60초입니다. 자세한 내용은 워커 타임아웃 변경을 참조하세요. -
gitlab_rails['max_request_duration_seconds']: Gitaly 기본 타임아웃을 제한하는 GitLab 애플리케이션 설정. 기본값은(worker_timeout * 0.95).ceil=57초입니다. 이 설정은puma['worker_timeout']보다 엄격하게 작아야 합니다. -
GITLAB_RAILS_RACK_TIMEOUT:Rack::Timeout미들웨어service_timeout. 기본값은60초입니다. 이 타임아웃은 다른 두 타임아웃과 독립적이며 다른 설정에 관계없이 이 값에서 요청을 종료합니다.
Gitaly 기본 타임아웃을 57초 이상으로 올리려면 세 가지 값을 모두 함께 올려야 합니다. 예를 들어 Gitaly 기본 타임아웃을 110초로 허용하려면:
/etc/gitlab/gitlab.rb를 편집합니다:
puma['worker_timeout'] = 120
gitlab_rails['max_request_duration_seconds'] = 114
gitlab_rails['env'] = {
'GITLAB_RAILS_RACK_TIMEOUT' => 120
}
- GitLab을 재구성합니다:
sudo gitlab-ctl reconfigure
-
오른쪽 상단에서 Admin을 선택합니다.
-
왼쪽 사이드바에서 설정 > 기본 설정을 선택합니다.
-
Gitaly 타임아웃을 확장합니다.
-
기본 타임아웃을 새 원하는 값(
max_request_duration_seconds까지)으로 설정합니다.
작은 여유를 두는 것이 권장됩니다. 기본 내장 기본값은 5% 간격을 사용하므로(max_request_duration_seconds = (worker_timeout * 0.95).ceil) Puma가 워커 타임아웃에 도달하기 전에 Rails 요청 기한이 먼저 트리거됩니다.
GITLAB_RAILS_RACK_TIMEOUT은 단독으로 Gitaly 제한을 올리지 않습니다.
Settings.gitlab.max_request_duration_seconds가 애플리케이션 설정 유효성 검사기가 참조하는 값이며, 이는 gitlab_rails['max_request_duration_seconds']에 의해 설정됩니다. 그러나 GITLAB_RAILS_RACK_TIMEOUT을 기본값인 60으로 유지하면 Rack 미들웨어가 60초보다 긴 요청(긴 Gitaly 호출 포함)을 완료되기 전에 종료합니다.
