모노레포 성능 측정을 위한 메트릭

다음 메트릭은 귀하의 모노레포의 서버 측 성능을 측정하는 데 사용할 수 있습니다. 이러한 메트릭은 모노레포 성능에 국한되지 않고 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-<user_id> eg: user-22345 머신에서 동시에 너무 많은 Git 프로세스가 생성되고 있음을 나타냅니다.
json.username 클론/페치를 시작한 사용자 이름. 예: ilovecoding 특정 사용자로부터 얼마나 많은 클론/페치가 있었는지 확인하기 위함입니다. 단일 사용자의 과도한 클론 작업을 찾는 데 도움이 될 수 있습니다.
json.grpc.request.glRepository 문제의 리포지토리. 형식은 project-<project_id> eg: project-214 특정 리포지토리에 대해 얼마나 많은 클론/페치가 있었는지 확인하기 위함입니다.
json.grpc.request.glProjectPath 문제의 리포지토리. 형식은 프로젝트 경로 eg: 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 Prometheus 메트릭은 counter로, 어느 Gitaly 노드로 얼마나 많은 읽기가 갔는지를 나타냅니다. 이 메트릭은 두 개의 벡터를 가지고 있습니다:

메트릭 이름 벡터 이것은 무엇인가요?
gitaly_praefect_read_distribution virtual_storage 가상 스토리지 이름
gitaly_praefect_read_distribution storage Gitaly 스토리지 이름

패킷 객체 캐시

패킷 객체 캐시 는 로그와 Prometheus 메트릭을 통해 관찰할 수 있습니다.

로그 필드 이름 설명
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": "총 145991 (델타 68), 재사용 6 (델타 2), 패킷 재사용 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,
}
Prometheus 메트릭 이름 벡터 설명
gitaly_pack_objects_served_bytes_total   제공되는 캐시의 크기(바이트 단위)
gitaly_pack_objects_cache_lookups_total result hit 또는 miss, 캐시 조회가 캐시 히트를 초래하였는지 여부