쿼리 수 제한
GitLab v19.1각 컨트롤러, API 엔드포인트, Sidekiq 워커는 최대 100개의 SQL 쿼리를 실행할 수 있습니다. 테스트 환경에서는 이 임계값을 초과하면 오류가 발생합니다. 테스트가 100개 이상의 SQL 쿼리를 실행하여 실패하는 경우 다음 두 가지 해결 방법이 있습니다:
각 컨트롤러, API 엔드포인트, Sidekiq 워커는 최대 100개의 SQL 쿼리를 실행할 수 있습니다. 100개 이상의 SQL 쿼리가 실행되는 경우, 이는 수정이 필요한 성능 문제입니다.
실패한 테스트 해결#
테스트 환경에서는 이 임계값을 초과하면 오류가 발생합니다.
테스트가 100개 이상의 SQL 쿼리를 실행하여 실패하는 경우 다음 두 가지 해결 방법이 있습니다:
-
실행되는 SQL 쿼리 수를 줄입니다.
-
해당 컨트롤러 또는 API 엔드포인트에 대한 쿼리 제한을 일시적으로 비활성화합니다.
쿼리 제한 비활성화는 기존 컨트롤러 또는 엔드포인트가 원인인 경우에만 사용해야 합니다. 이 경우 SQL 쿼리 수를 줄이는 데 많은 노력이 필요할 수 있습니다. 새로 추가된 컨트롤러와 엔드포인트는 100개 이상의 SQL 쿼리를 실행할 수 없으며, 이 규칙에는 예외가 없습니다.
파이프라인 안정성#
기본 브랜치 파이프라인에서 쿼리 제한 오류가 발생하기 시작하면, 지침에 따라 쿼리 제한을 비활성화하세요. 제한을 비활성화할 때는 항상 이슈를 연결하고 우선순위를 지정하여 과도한 쿼리 수를 조사할 수 있도록 해야 합니다.
쿼리 제한 비활성화#
컨트롤러에 대한 쿼리 제한을 비활성화해야 하는 경우, 먼저 이슈를 생성해야 합니다.
이 이슈는 (가급적 제목에) 해당 컨트롤러 또는 엔드포인트를 언급하고
적절한 라벨(database, performance, 그리고 Discussion과 같은 팀별 라벨 중 하나 이상)을 포함해야 합니다.
GitLab 17.2 이후,
QueryLimiting.disable은 새로운 임계값(무제한이 아닌)을 설정해야 합니다.
이슈가 생성된 후, 해당 코드에서 쿼리 제한을 비활성화할 수 있습니다.
Rails 컨트롤러의 경우 가능한 한 일찍 실행되는 before_action 훅을 생성하는 것이 좋습니다.
호출된 메서드는 Gitlab::QueryLimiting.disable!('이슈 URL') 을 호출해야 합니다. 예를 들면:
class MyController < ApplicationController
before_action :disable_query_limiting, only: [:show]
def index
# ...
end
def show
# ...
end
def disable_query_limiting
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/...', new_threshold: 200)
end
end
before_action을 사용하면 해당 컨트롤러 메서드를 수정할 필요가 없어 머지 충돌 가능성이 줄어듭니다.
Grape API 엔드포인트의 경우 특정 엔드포인트 이전에 훅을 실행하는 신뢰할 수 있는 방법이 없습니다. 따라서 다음과 같이 엔드포인트에 직접 허용 목록 호출을 추가해야 합니다:
get '/projects/:id/foo' do
Gitlab::QueryLimiting.disable!('...', new_threshold: 200)
# ...
end
Sidekiq 워커의 경우에도 직접 허용 목록을 추가해야 합니다:
def perform(args)
Gitlab::QueryLimiting.disable!('...', new_threshold: 200)
# ...
end