쿼리 카운트 제한

각 컨트롤러, API 엔드포인트 및 Sidekiq 워커는 최대 100개의 SQL 쿼리를 실행할 수 있습니다. 100개 이상의 SQL 쿼리가 실행되면 성능 문제가 발생하며 이를 수정해야 합니다.

실패한 테스트 해결

테스트 환경에서 이 임계값을 초과하면 오류가 발생합니다.

테스트가 100개 이상의 SQL 쿼리를 실행하여 실패하면 이 문제를 해결하는 두 가지 방법이 있습니다:

  • 실행되는 SQL 쿼리의 수를 줄입니다.
  • 컨트롤러나 API 엔드포인트의 쿼리 제한을 일시적으로 해제합니다.

쿼리 제한을 해제하는 것은 기존의 컨트롤러나 엔드포인트가 문제인 경우에만 시도해야 합니다. 이 때문에 SQL 쿼리의 수를 줄이는 것은 많은 노력을 요구할 수 있기 때문입니다. 새롭게 추가된 컨트롤러와 엔드포인트는 100개 이상의 SQL 쿼리를 실행할 수 없으며, 이 규칙에는 예외가 허용되지 않습니다.

파이프라인 안정성

기본 브랜치 파이프라인에서 스펙이 쿼리 제한 오류를 시작하는 경우, 쿼리 제한을 해제하려면 지시에 따르십시오. 제한을 해제하는 것은 항상 문제를 연결하고 우선순위를 매겨야 하므로 과도한 쿼리의 양을 조사할 수 있습니다.

쿼리 제한 해제

컨트롤러의 쿼리 제한을 해제해야 하는 경우, 먼저 이 문제에 대한 이슈를 작성해야 합니다. 이 이슈에는 콘트롤러나 엔드포인트를 (가능하면 제목에) 언급하고 database, performanceDiscussion과 같은 팀별 라벨을 포함해야 합니다.

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 엔드포인트의 경우 특정 엔드포인트 이전에 신뢰할 수 있는 후크를 실행하는 신뢰할 수 있는 방법이 아쉽게도 없습니다. 이는 해당 엔드포인트에 직접 allowlist 호출을 추가해야 함을 의미합니다. 다음과 같이 실행할 수 있습니다:

get '/projects/:id/foo' do
  Gitlab::QueryLimiting.disable!('...', new_threshold: 200)

  # ...
end

Sidekiq 워커의 경우에도 직접 allowlist를 추가해야 합니다:

def perform(args)
  Gitlab::QueryLimiting.disable!('...', new_threshold: 200)

  # ...
end