메모리 사용량 줄이기
Sidekiq 메모리 킬러는 메모리를 과도하게 소비하는 백그라운드 job 프로세스를 자동으로 관리합니다. GitLab은 기본적으로 Linux 패키지 또는 Docker 설치에서만 사용 가능한 RSS 제한을 모니터링합니다.
Sidekiq 메모리 킬러는 메모리를 과도하게 소비하는 백그라운드 job 프로세스를 자동으로 관리합니다. 이 기능은 워커 프로세스를 모니터링하고 Linux 메모리 킬러가 개입하기 전에 재시작하여 백그라운드 job이 정상적으로 종료되기 전에 완료될 수 있도록 합니다. 이러한 이벤트를 로그에 기록함으로써 높은 메모리 사용량을 유발하는 job을 식별하기 쉽게 합니다.
Sidekiq 메모리 모니터링 방법#
GitLab은 기본적으로 Linux 패키지 또는 Docker 설치에서만 사용 가능한 RSS 제한을 모니터링합니다. 그 이유는 GitLab이 메모리로 인한 종료 후 Sidekiq를 재시작하기 위해 runit에 의존하는데, 직접 컴파일 설치 및 Helm 차트 설치는 runit 또는 동등한 도구를 사용하지 않기 때문입니다.
기본 설정을 사용하면 Sidekiq는 15분에 한 번 이상 재시작되지 않으며, 재시작으로 인해 들어오는 백그라운드 job에 약 1분의 지연이 발생합니다.
일부 백그라운드 job은 장시간 실행되는 외부 프로세스에 의존합니다. Sidekiq가 재시작될 때 이러한 프로세스가 정리되어 종료되도록 하려면 각 Sidekiq 프로세스를 프로세스 그룹 리더로 실행해야 합니다(예: chpst -P 사용). 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: Sidekiq 프로세스가 허용된 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 job이 완료될 때까지 허용되는 최대 시간을 정의합니다. 해당 시간 동안 새 job은 수락되지 않습니다. 기본값은 30초입니다.Sidekiq에 의해 프로세스 재시작이 수행되지 않는 경우 Sidekiq 프로세스는 Sidekiq 종료 타임아웃(기본값 25초) +2초 후에 강제 종료됩니다. 해당 시간 동안 job이 완료되지 않으면 현재 실행 중인 모든 job은 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 제한을 초과하여 정상 재시작을 시작했을 때 실행 중이던 job을 나열합니다.
