모노레포 성능 측정 메트릭

다음 메트릭은 모노레포의 서버 측 성능을 측정하는 데 사용할 수 있습니다. 이러한 메트릭은 모노레포 성능에 국한되지 않으며 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> 형식으로 표시됩니다. 예: 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에서 생성된 하위 프로세스에 의해 소비된 메모리 양

예시 로그 메시지: json { "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 노드로의 읽기가 얼마나 많이 이루어졌는지를 나타내는 counter입니다. 이 메트릭에는 두 개의 벡터가 있습니다:

메트릭 이름 벡터 무엇인가?
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": "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