메모리 사용량 감소
GitLab Rails 애플리케이션 코드에는 메모리 누수가 있습니다. 웹 요청에 대해서는 지정된 주거 공간 크기 (RSS) 한도를 초과한 경우 워커를 자동으로 다시 시작하는 관리 스레드를 사용하여 이 문제를 관리합니다. GitLab에서는 GitLab에서 사용하는 Sidekiq 프로세스도 동일한 방식으로 백그라운드 작업을 처리합니다.
기본적으로 GitLab은 사용 가능한 RSS 한도를 Linux 패키지 또는 Docker 설치에 대해서만 모니터링합니다. 이는 GitLab이 메모리로 인한 종료 후에 Sidekiq을 다시 시작하기 위해 runit을 사용하며, 직접 컴파일한 설치 및 Helm 차트 설치에는 runit이나 유사한 도구를 사용하지 않기 때문입니다.
기본 설정으로는 Sidekiq은 15분에 한 번 이상은 재시작하지 않으며, 재시작으로 인해 들어오는 백그라운드 작업에 대해 약 1분의 지연이 발생합니다.
일부 백그라운드 작업은 장기간 실행되는 외부 프로세스를 사용합니다. 이러한 프로세스가 Sidekiq을 다시 시작할 때 깔끔하게 종료되도록 하려면 각 Sidekiq 프로세스를 프로세스 그룹 리더로서 실행해야 합니다. Linux 패키지 설치 또는 runit
이 설치된 bin/background_jobs
스크립트를 사용하는 경우, 이 작업은 자동으로 처리됩니다.
제한 사항 구성하기
Sidekiq 메모리 제한은 환경 변수를 사용하여 제어됩니다.
-
SIDEKIQ_MEMORY_KILLER_MAX_RSS
(KB): 허용된 RSS에 대한 Sidekiq 프로세스 소프트 제한을 정의합니다. Sidekiq 프로세스의 RSS(킬로바이트 단위)가SIDEKIQ_MEMORY_KILLER_MAX_RSS
를 초과하고SIDEKIQ_MEMORY_KILLER_GRACE_TIME
보다 오랜 시간 동안 초과하는 경우 우아한 재시작이 트리거됩니다.SIDEKIQ_MEMORY_KILLER_MAX_RSS
를 설정하지 않거나 값이 0으로 설정된 경우, 소프트 제한이 모니터링되지 않습니다.SIDEKIQ_MEMORY_KILLER_MAX_RSS
의 기본값은2000000
입니다. -
SIDEKIQ_MEMORY_KILLER_GRACE_TIME
: 허용된 RSS 소프트 제한을 초과한 경우 Sidekiq 프로세스가SIDEKIQ_MEMORY_KILLER_GRACE_TIME
내에 허용된 RSS (소프트 제한) 아래로 내려가면 재시작이 중단됩니다. 기본값은 900초(15분)입니다. -
SIDEKIQ_MEMORY_KILLER_HARD_LIMIT_RSS
(KB): 허용된 RSS의 Sidekiq 프로세스 하드 제한을 정의합니다. Sidekiq 프로세스의 RSS(킬로바이트 단위)가SIDEKIQ_MEMORY_KILLER_HARD_LIMIT_RSS
를 초과하는 경우 Sidekiq의 즉각적인 우아한 재시작이 트리거됩니다. 이 값이 설정되지 않았거나 0으로 설정된 경우, 하드 제한은 모니터링되지 않습니다. -
SIDEKIQ_MEMORY_KILLER_CHECK_INTERVAL
: 프로세스 RSS를 확인하는 주기를 정의합니다. 기본값은 3초입니다. -
SIDEKIQ_MEMORY_KILLER_SHUTDOWN_WAIT
: 모든 Sidekiq 작업이 완료되는 데 허용된 최대 시간을 정의합니다. 이 기간 동안 새로운 작업은 수락되지 않습니다. 기본값은 30초입니다.Sidekiq에 의해 프로세스 재시작이 수행되지 않는 경우, Sidekiq 프로세스는 Sidekiq 종료 시간 제한(기본값은 25초) +2초 후에 강제로 종료됩니다. 그 시간 내에 작업이 완료되지 않는 경우, 현재 실행 중인 모든 작업은 Sidekiq 프로세스에 보내진
SIGTERM
신호로 중단됩니다. -
GITLAB_MEMORY_WATCHDOG_ENABLED
: 기본적으로 활성화되어 있습니다. Watchdog를 실행하지 않으려면GITLAB_MEMORY_WATCHDOG_ENABLED
를 false로 설정하세요.
워커 재시작 모니터링
GitLab은 메모리 사용량이 높아서 워커가 재시작된 경우 로그 이벤트를 발생시킵니다.
다음은 /var/log/gitlab/gitlab-rails/sidekiq_client.log
에 있는 이러한 로그 이벤트 중 하나의 예시입니다.
{
"severity": "WARN",
"time": "2023-02-04T09:45:16.173Z",
"correlation_id": null,
"pid": 2725,
"worker_id": "sidekiq_1",
"memwd_handler_class": "Gitlab::Memory::Watchdog::SidekiqHandler",
"memwd_sleep_time_s": 3,
"memwd_rss_bytes": 1079683247,
"memwd_max_rss_bytes": 629145600,
"memwd_max_strikes": 5,
"memwd_cur_strikes": 6,
"message": "rss memory limit exceeded",
"running_jobs": [
{
jid: "83efb701c59547ee42ff7068",
worker_class: "Ci::DeleteObjectsWorker"
},
{
jid: "c3a74503dc2637f8f9445dd3",
worker_class: "Ci::ArchiveTraceWorker"
}
]
}
여기서:
-
memwd_rss_bytes
는 실제 메모리 소비량입니다. -
memwd_max_rss_bytes
는per_worker_max_memory_mb
를 통해 설정된 RSS 제한입니다. -
running jobs
는 프로세스가 RSS 제한을 초과하고 우아한 재시작을 시작한 시간에 실행 중이던 작업을 나열합니다.