성능 바
GitLab v19.5Offering: GitLab Self-Managed, GitLab Dedicated
요약
성능 바는 실시간 지표를 브라우저에 바로 표시하므로 로그를 뒤지거나 별도의 프로파일링 도구를 실행하지 않고도 상황을 파악할 수 있습니다. 개발팀은 성능 바를 통해 어디에 집중해야 하는지 정확히 확인할 수 있어 디버깅이 간단해집니다.
성능 바는 실시간 지표를 브라우저에 바로 표시하므로 로그를 뒤지거나 별도의 프로파일링 도구를 실행하지 않고도 상황을 파악할 수 있습니다.
개발팀은 성능 바를 통해 어디에 집중해야 하는지 정확히 확인할 수 있어 디버깅이 간단해집니다.

확인할 수 있는 정보#
성능 바는 왼쪽부터 순서대로 다음 항목을 표시합니다:
- Current Host: 현재 페이지를 제공하는 호스트입니다.
- Database queries: 데이터베이스 쿼리에 걸린 시간(밀리초)과 총 쿼리 수이며,
00ms / 00 (00 cached) pg형식으로 표시됩니다. 선택하면 더 자세한 내용을 담은 대화 상자가 표시됩니다. 여기에서 각 쿼리에 대해 다음 정보를 확인할 수 있습니다:- In a transaction: 쿼리가 트랜잭션 컨텍스트에서 실행된 경우 쿼리 아래에 표시됩니다
- Role: 데이터베이스 부하 분산이 활성화된 경우 표시됩니다. 쿼리에 사용된 서버 역할을 보여 줍니다. "Primary"는 쿼리가 읽기/쓰기 기본 서버로 전송되었음을 뜻합니다. "Replica"는 읽기 전용 복제본으로 전송되었음을 뜻합니다.
- Configuration name: GitLab 기능별로 구성된 여러 데이터베이스를 구분하는 데 사용합니다. 표시되는 이름은 GitLab에서 데이터베이스 연결을 구성할 때 사용한 이름과 같습니다.
- Gitaly calls: Gitaly 호출에 걸린 시간(밀리초)과 총 호출 수입니다. 선택하면 더 자세한 내용을 담은 대화 상자가 표시됩니다.
- Redis calls: Redis 호출에 걸린 시간(밀리초)과 총 호출 수입니다. 선택하면 더 자세한 내용을 담은 대화 상자가 표시됩니다.
- Elasticsearch calls: Elasticsearch 호출에 걸린 시간(밀리초)과 총 호출 수입니다. 선택하면 더 자세한 내용을 담은 대화 상자가 표시됩니다.
- External HTTP calls: 다른 시스템으로의 외부 호출에 걸린 시간(밀리초)과 총 호출 수입니다. 선택하면 더 자세한 내용을 담은 대화 상자가 표시됩니다.
- 페이지의 Load timings: 브라우저가 로드 타이밍을 지원하면 슬래시로 구분된
여러 값이 밀리초 단위로 표시됩니다.
선택하면 더 자세한 내용을 담은 대화 상자가 표시됩니다. 값은 왼쪽부터 순서대로 다음과 같습니다:
- Backend: 기본 페이지를 로드하는 데 걸린 시간입니다.
- First Contentful Paint:
사용자에게 무언가가 보이기까지 걸린 시간입니다. 브라우저가 이 기능을 지원하지 않으면
NaN이 표시됩니다. - DomContentLoaded 이벤트입니다.
- 페이지가 로드한 Total number of requests 입니다.
- Memory: 선택한 요청 동안 소비된 메모리 양과 할당된 오브젝트 수입니다. 선택하면 더 자세한 내용을 담은 창이 표시됩니다.
- Trace: Jaeger가 통합되어 있으면 Trace는 현재 요청의
correlation_id가 포함된 Jaeger 추적 페이지로 연결됩니다. - +: 요청의 세부 정보를 성능 바에 추가하는 링크입니다. 요청은
전체 URL(현재 사용자로 인증됨) 또는
X-Request-Id헤더 값으로 추가할 수 있습니다. - Download: 성능 바 보고서를 생성하는 데 사용된 원본 JSON을 내려받는 링크입니다.
- Memory Report: 현재 URL의 메모리 프로파일링 보고서를 생성하는 링크입니다.
- 모드가 포함된 Flamegraph: 선택한 Stackprof 모드로
현재 URL의 플레임그래프를 생성하는 링크입니다:
- Wall 모드는 벽시계 시간의 일정 간격마다 샘플링합니다. 간격은
10100마이크로초로 설정됩니다. - CPU 모드는 CPU 활동의 일정 간격마다 샘플링합니다. 간격은
10100마이크로초로 설정됩니다. - Object 모드는 일정 간격마다 샘플링합니다. 간격은
100할당으로 설정됩니다.
- Wall 모드는 벽시계 시간의 일정 간격마다 샘플링합니다. 간격은
- Request Selector: 성능 바 오른쪽에 표시되는 선택 상자로, 현재 페이지가 열려 있는 동안 발생한 모든 요청에 대해 이 지표를 확인할 수 있습니다. 고유 URL마다 처음 두 개의 요청만 수집됩니다.
- Stats(선택 사항):
GITLAB_PERFORMANCE_BAR_STATS_URL환경 변수가 설정되어 있으면 이 URL이 바에 표시됩니다. GitLab.com에서만 사용합니다.
모든 표시 항목을 모든 환경에서 사용할 수 있는 것은 아닙니다. 예를 들어 메모리 보기는 특정 패치가 적용된 Ruby로 실행해야 합니다. GDK로 GitLab을 로컬에서 실행할 때는 보통 그렇지 않으므로 메모리 보기를 사용할 수 없습니다.
키보드 단축키#
p + b 키보드 단축키를 누르면 성능 바가 표시되고, 다시 누르면 숨겨집니다.
관리자가 아닌 사용자에게 성능 바를 표시하려면 해당 사용자에게 성능 바를 활성화해야 합니다.
요청 경고#
미리 정의된 한도를 초과한 요청에는 지표 옆에 경고 ⚠️ 아이콘과 설명이 표시됩니다. 다음 예시에서는 Gitaly 호출 시간이 임계값을 초과했습니다.

경고 형식#
각 경고 메시지는 다음 형식을 따릅니다:
<metric> <type>: <actual> over <threshold>
예를 들어 es calls: 83 over 5는 Elasticsearch 호출이 83회 발생해
임계값 5회를 초과했음을 나타냅니다.
경고를 유발할 수 있는 임계값 유형은 세 가지입니다:
calls: 요청 동안 해당 서비스로 보낸 총 호출 수입니다.duration: 해당 서비스로의 모든 호출에 소요된 총 시간(밀리초)입니다.individual call: 해당 서비스로의 단일 호출에 소요된 시간(밀리초)입니다. 개별 호출 경고는 바 자체가 아니라 해당 지표의 세부 대화 상자에 표시됩니다.
지표 및 기본 임계값#
다음 지표는 요청이 임계값을 초과하면 경고를 표시합니다.
임계값은 프로덕션 환경과 그 밖의 모든 환경에서 다릅니다. 표에서 (development)로 표시된 값은
개발 및 테스트처럼 프로덕션이 아닌 모든 환경에 적용됩니다.
여기에 표시된 값은 lib/peek/views/ 아래 소스 파일에 정의된 기본값을
반영합니다.
| 지표 | 경고 레이블 접두사 | 호출 수 임계값 | 총 소요 시간 임계값 | 개별 호출 임계값 |
|---|---|---|---|---|
| Database (SQL) | active-record |
100 | 3,000 ms (development) / 15,000 ms (production) | 1,000 ms (development) / 5,000 ms (production) |
| Gitaly | gitaly |
30 | 1,000 ms | 500 ms |
| Elasticsearch | es |
5 | 1,000 ms | 1,000 ms |
| External HTTP | external-http |
10 | 1,000 ms | 100 ms |
| ClickHouse | ch |
5 | 1,000 ms | 1,000 ms |
| Zoekt | zkt |
3 (development) / 5 (production) | 500 ms (development) / 1,000 ms (production) | 500 ms (development) / 1,000 ms (production) |
성능 바는 Redis 호출을 추적해 표시하지만 임계값을 정의하지 않으므로 Redis에 대해서는 경고를 표시하지 않습니다.
Bullet 지표는 위 형식의 예외입니다. Bullet은 N+1 쿼리를 감지하며 기본적으로
개발 환경에서만 실행됩니다. 활성화된 경우 임계값 기반의
<metric> <type>: <actual> over <threshold> 메시지 대신 고정된
Unoptimized queries detected 경고를 표시합니다.
데이터베이스 지표의 프로덕션 임계값이 개발 기본값보다 높은 이유는 프로덕션 쿼리가 더 큰 데이터 양을 대상으로 실행되어 시간이 더 걸리는 경우가 많기 때문입니다. Zoekt를 제외한 나머지 지표는 모든 환경에서 동일한 임계값을 사용합니다. 이 값들은 소스 파일에 정의된 구성 가능한 기본값입니다. 임계값이 바뀌면 소스 파일이 기준이 됩니다.
경고에 대응이 필요한 경우#
경고는 해당 요청이 일반적인 페이지보다 많은 리소스를 사용하고 있음을 뜻합니다. 조사 여부를 판단할 때는 다음 기준을 활용합니다:
- 호출 수가 많으면(예:
gitaly calls: 45 over 30) 같은 유형의 호출이 반복되는 N+1 패턴인 경우가 많습니다. 해당 지표를 선택해 세부 대화 상자를 열고 비슷한 매개변수로 반복되는 호출이 있는지 확인합니다. - 총 소요 시간이 길면(예:
active-record duration: 4500 over 3000) 해당 서비스가 전반적으로 느린 것입니다. 비용이 큰 소수의 호출 때문인지, 아니면 작은 호출이 많이 누적된 것인지 확인합니다. - 개별 호출 소요 시간이 길면 세부 대화 상자에서 해당 호출 옆에 표시됩니다. 단일 호출이 느린 경우에는 인덱스 누락, 큰 페이로드 또는 최적화되지 않은 쿼리가 원인인 경우가 많습니다.
특정 상황에서는 일부 경고가 예상된 잡음입니다:
- 여러 프로젝트나 그룹의 데이터를 집계하는 페이지(예: 대시보드 또는 그룹 개요 페이지)는 단일 리소스 페이지보다 호출이 많습니다.
- 데이터가 적은 개발 환경에서는 프로덕션에서 나타나지 않는 소요 시간 경고가 발생할 수 있고, 프로덕션 데이터 양 때문에 개발 환경에서는 나타나지 않는 경고가 발생할 수 있습니다.
관리자가 아닌 사용자에게 성능 바 활성화#
성능 바는 관리자가 아닌 사용자에게는 기본적으로 비활성화되어 있습니다. 특정 그룹에 대해 활성화하려면 다음 단계를 따릅니다:
- 관리자 액세스 권한이 있는 사용자로 로그인합니다.
- 오른쪽 상단에서 Admin을 선택합니다.
- 왼쪽 사이드바에서 Settings > Metrics and profiling을 선택합니다.
- Profiling - Performance bar를 확장합니다.
- Allow non-administrators access to the performance bar를 선택합니다.
- Allow access to members of the following group 필드에 성능 바에 접근할 수 있는 그룹의 전체 경로를 입력합니다.
- Save changes를 선택합니다.