InfoGrab DocsInfoGrab Docs

쿼리 수 제한

요약

각 컨트롤러, 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

쿼리 수 제한

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