모노레포 성능 메트릭용 메트릭

다음 메트릭을 사용하여 모노레포의 서버 측 성능을 메트릭할 수 있습니다. 이러한 메트릭은 모노레포 성능에 국한되지 않으며 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 질문할 리포지터리. 프로젝트 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 virtual_storage 가상 스토리지 이름
gitaly_praefect_read_distribution storage 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