메모리 사용량 줄이기
GitLab v19.5요약
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 이 끝나지 않으면 Sidekiq 프로세스로 전송되는
SIGTERM시그널에 의해 실행 중인 모든 job 이 중단됩니다. -
GITLAB_MEMORY_WATCHDOG_ENABLED: 기본적으로 활성화되어 있습니다. Watchdog 실행을 비활성화하려면GITLAB_MEMORY_WATCHDOG_ENABLED를 false로 설정합니다.
워커 재시작 모니터링#
GitLab은 메모리 사용량이 많아 워커가 재시작되면 로그 이벤트를 남깁니다.
다음은 /var/log/gitlab/sidekiq/current에 남는 로그 이벤트의 예입니다.
{
"severity": "WARN",
"time": "2023-02-04T09:45:16.173Z",
"correlation_id": null,
"pid": 2725,
"worker_id": "sidekiq_1",
"memwd_handler_class": "Gitlab::Memory::Watchdog::Handlers::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는 프로세스가 초과한 RSS 제한(바이트 단위)입니다. 소프트 제한은SIDEKIQ_MEMORY_KILLER_MAX_RSS에서, 하드 제한은SIDEKIQ_MEMORY_KILLER_HARD_LIMIT_RSS에서 가져오며, 둘 다 킬로바이트 단위로 설정합니다.running_jobs는 프로세스가 RSS 제한을 초과해 정상 재시작을 시작한 시점에 실행 중이던 job 목록입니다.