단일 저장소 성능 측정 메트릭

다음 메트릭은 당신의 단일 저장소의 서버 측 성능을 측정하는 데 사용될 수 있습니다. 이러한 메트릭은 단일 저장소 성능에 한정되지 않으며 Gitaly 성능을 측정하는 보다 일반적인 메트릭이지만, 단일 저장소를 실행할 때 특히 관련이 있습니다.

복제 및 가져오기

가장 빈번한 비용이 많이 드는 작업은 복제 및 가져오기입니다. 시스템 자원의 백분율로 볼 때, 이러한 작업들은 종종 Gitaly 노드의 시스템 자원의 90% 이상을 차지합니다. 유용한 신호를 제공할 수 있는 로그 및 메트릭은 다음과 같습니다.

CPU 및 메모리

복제/가져오기를 처리하는 주요 RPC는 두 가지가 있습니다. 다음은 주어진 저장소에 의해 복제/가져오기 작업이 얼마나 많은 시스템 자원을 사용하는지 검사하는 데 사용될 수 있는 로그 항목입니다.

다음은 Gitaly 로그의 로그 항목 필드들이며, 여기에서 필터링할 수 있는 값들입니다:

로그 필드 필터링할 값 이유
json.grpc.method PostReceivePack 이것은 HTTP 복제/가져오기를 처리하는 RPC입니다
json.grpc.method SSHReceivePack 이것은 SSH 복제/가져오기를 처리하는 RPC입니다
json.grpc.code OK RPC가 성공적으로 요청을 처리했음을 나타냅니다
json.grpc.code Canceled 종종 클라이언트가 연결을 종료했음을 나타내며, 보통은 어떤 종류의 타임아웃 때문입니다
json.grpc.code ResourceExhausted 기계에서 동시에 너무 많은 Git 프로세스들이 생성되고 있음을 나타냅니다
json.user_id 클론/가져오기를 시작한 user_id. 예: user-22345 기계에서 동시에 너무 많은 Git 프로세스들이 생성되고 있음을 나타냅니다
json.username 클론/가져오기를 시작한 사용자 이름. 예: ilovecoding 주어진 사용자에 의한 너무 많은 복제 작업을 찾는 데 도움이 됩니다
json.grpc.request.glRepository 특정 저장소. project-<project_id> 형식입니다. 예: project-214 주어진 저장소에 대한 복제/가져오기가 얼마나 많은지 확인하기 위함입니다
json.grpc.request.glProjectPath 특정 저장소. 프로젝트 경로 형식입니다. 예: my-org/coolproject 주어진 저장소에 대한 복제/가져오기가 얼마나 많은지 확인하기 위함입니다

다음은 CPU 및 메모리에 대한 유용한 정보를 제공하는 로그 항목 필드입니다:

검사할 로그 필드 의미
json.command.cpu_time_ms 이 RPC가 생성한 서브프로세스에서 사용한 CPU 시간은 얼마나 되는가
json.command.maxrss 이 RPC가 생성한 서브프로세스에서 사용된 메모리의 양은 어떻게 되는가

예시 로그 메시지:

{
    "command.count":2,
    "command.cpu_time_ms":420,
    "command.inblock":0,
    "command.majflt":0,
    "command.maxrss":3342152,
    "command.minflt":24316,
    "command.oublock":56,
    "command.real_time_ms":626,
    "command.spawn_token_fork_ms":4,
    "command.spawn_token_wait_ms":0,
    "command.system_time_ms":172,
    "command.user_time_ms":248,
    "component":"gitaly.StreamServerInterceptor",
    "correlation_id":"20HCB3DAEPLV08UGNIYT9HJ4JW",
    "environment":"gprd",
    "feature_flags":"",
    "fqdn":"file-99-stor-gprd.c.gitlab-production.internal",
    "grpc.code":"OK",
    "grpc.meta.auth_version":"v2",
    "grpc.meta.client_name":"gitlab-workhorse",
    "grpc.meta.deadline_type":"none",
    "grpc.meta.method_operation":"mutator",
    "grpc.meta.method_scope":"repository",
    "grpc.meta.method_type":"bidi_stream",
    "grpc.method":"PostReceivePack",
    "grpc.request.fullMethod":"/gitaly.SmartHTTPService/PostReceivePack",
    "grpc.request.glProjectPath":"r2414/revenir/development/machinelearning/protein-ddg",
    "grpc.request.glRepository":"project-47506374",
    "grpc.request.payload_bytes":911,
    "grpc.request.repoPath":"@hashed/db/ab/dbabf83f57affedc9a001dc6c6f6b47bb431bd47d7254edd1daf24f0c38793a9.git",
    "grpc.request.repoStorage":"nfs-file99",
    "grpc.response.payload_bytes":54
    "grpc.service":"gitaly.SmartHTTPService",
    "grpc.start_time":"2023-10-16T20:40:08.836",
    "grpc.time_ms":631.486,
    "hostname":"file-99-stor-gprd",
    "level":"info",
    "msg":"finished streaming call with code OK",
    "pid":1741362,
    "remote_ip":"108.163.136.48",
    "shard":"default",
    "span.kind":"server",
    "stage":"main",
    "system":"grpc",
    "tag":"gitaly",
    "tier":"stor",
    "time":"2023-10-16T20:40:09.467Z",
    "trace.traceid":"AAB3QAeD8G+H9VNmzOi2CztMAcJv1+g4+l1cAgA=",
    "type":"gitaly",
    "user_id":"user-14857500",
    "username":"ctx_ckottke",
  }

읽기 분포

gitaly_praefect_read_distribution 프로메테우스 메트릭은 카운터이며, 어떤 Gitaly 노드로 얼마나 많은 읽기가 발생했는지를 나타냅니다. 이 메트릭에는 두 개의 벡터가 있습니다:

메트릭 이름 벡터 설명
gitaly_praefect_read_distribution 가상 저장소 가상 저장소 이름
gitaly_praefect_read_distribution 저장소 Gitaly 저장소 이름

팩 오브젝트 캐시

팩 오브젝트 캐시는 로그뿐만 아니라 프로메테우스 메트릭을 통해 관찰할 수 있습니다.

로그 필드 이름 설명
pack_objects_cache.hit 현재 팩 오브젝트 캐시가 명중되었는지를 나타냅니다 (true 또는 false)
pack_objects_cache.key 팩 오브젝트 캐시에 사용된 캐시 키
pack_objects_cache.generated_bytes 작성 중인 새 캐시의 크기(바이트)
pack_objects_cache.served_bytes 제공된 캐시의 크기(바이트)
pack_objects.compression_statistics 팩 오브젝트 생성에 대한 통계
pack_objects.enumerate_objects_ms 클라이언트가 보낸 오브젝트를 나열하는 데 소요된 총 시간(밀리초)
pack_objects.prepare_pack_ms 클라이언트에게 다시 보내기 전에 팩 파일을 준비하는 데 소요된 총 시간(밀리초)
pack_objects.write_pack_file_ms 클라이언트에게 팩 파일을 다시 보내는 데 소요된 총 시간(밀리초). 클라이언트의 인터넷 연결 상태에 크게 의존합니다
pack_objects.written_object_count Gitaly가 클라이언트에게 다시 보낸 총 오브젝트 수

예시 로그 메시지:

{
"bytes":26186490,
"correlation_id":"01F1MY8JXC3FZN14JBG1H42G9F",
"grpc.meta.deadline_type":"none",
"grpc.method":"PackObjectsHook",
"grpc.request.fullMethod":"/gitaly.HookService/PackObjectsHook",
"grpc.request.glProjectPath":"root/gitlab-workhorse",
"grpc.request.glRepository":"project-2",
"grpc.request.repoPath":"@hashed/d4/73/d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35.git",
"grpc.request.repoStorage":"default",
"grpc.request.topLevelGroup":"@hashed",
"grpc.service":"gitaly.HookService",
"grpc.start_time":"2021-03-25T14:57:52.747Z",
"level":"info",
"msg":"finished unary call with code OK",
"peer.address":"@",
"pid":20961,
"span.kind":"server",
"system":"grpc",
"time":"2021-03-25T14:57:53.543Z",
"pack_objects.compression_statistics": "Total 145991 (delta 68), reused 6 (delta 2), pack-reused 145911",
"pack_objects.enumerate_objects_ms": 170,
"pack_objects.prepare_pack_ms": 7,
"pack_objects.write_pack_file_ms": 786,
"pack_objects.written_object_count": 145991,
"pack_objects_cache.generated_bytes": 49533030,
"pack_objects_cache.hit": "false",
"pack_objects_cache.key": "123456789",
"pack_objects_cache.served_bytes": 49533030,
"peer.address": "127.0.0.1",
"pid": 8813,
}
프로메테우스 메트릭 이름 벡터 설명
gitaly_pack_objects_served_bytes_total   제공된 캐시의 크기(바이트)
gitaly_pack_objects_cache_lookups_total result 캐시 조회가 캐시 명중 또는 미스로 끝났는지 나타내는 hit 또는 miss