쿼리 수 제한
각 컨트롤러, 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