Kubernetes

Prometheus 메모리 튜닝

DevelopC 2023. 2. 22. 08:59
728x90

Prometheus 메모리 튜닝

Prometheus를 운영하다 보면 많은 메트릭 저장으로 인해 메트릭 보관주기를 짧게 설정해도 메모리를 많이 사용합니다. 과도한 메모리 사용 시 아래의 방법으로 메모리 사용율을 낮출 수 있습니다.

 

TSDB analyze

Prometheus와 함께 제공되는 promtool 명령어를 사용합니다. promtool tsdb analyze 사용하여 분석하고, 분석한 결과에서 Highest cardinality labels 목록에서 사용하지 않은 label을 골라 삭제하면 메모리 사용율을 낮출 수 있습니다.

# promtool tsdb analyze [data path]
$ promtool tsdb analyze /data

Duration: 2h0m0s
Series: 5547383
Label names: 248
Postings (unique label pairs): 159621
Postings entries (total label pairs): 44259261

Label pairs most involved in churning:
235023 kubernetes_io_os=linux
235023 beta_kubernetes_io_os=linux
235023 kubernetes_io_arch=amd64
235023 beta_kubernetes_io_arch=amd64
171437 app_kubernetes_io_managed_by=Helm
157630 app_kubernetes_io_component=metrics

Label names most involved in churning:
244783 instance
244783 job
244783 __name__
235023 beta_kubernetes_io_os
235023 kubernetes_io_arch
235023 beta_kubernetes_io_arch
235023 kubernetes_io_os
235023 kubernetes_io_hostname
233527 namespace

Most common label pairs:
2851712 beta_kubernetes_io_os=linux
2851712 kubernetes_io_arch=amd64
2851712 beta_kubernetes_io_arch=amd64
2851712 kubernetes_io_os=linux
2085329 app_kubernetes_io_managed_by=Helm

Label names with highest cumulative label value length:
928176 lease
872902 id
855778 container_id
639203 uid
599520 mountpoint
148595 pod
120729 __name__
77262 owner_name
65469 created_by_name
28118 address
27212 interface
25276 secret
24380 image_id
23028 replicaset
17923 instance
14984 device
14900 image
14014 ip
13599 pod_ip
12806 image_spec
9337 kubernetes_io_hostname

Highest cardinality labels:
31204 lease
21321 id
15463 uid
11114 container_id
5329 mountpoint
4746 pod
3028 __name__
3009 owner_name
2689 created_by_name
1948 interface
1654 address
1091 device
1049 ip
1016 pod_ip
889 secret
878 replicaset
644 instance
418 resource
333 cluster_ip
302 type
263 le
252 configmap
205 endpoint

Highest cardinality metric names:
93302 apiserver_request_duration_seconds_bucket
63602 apiserver_request_slo_duration_seconds_bucket
46852 coredns_dns_request_duration_seconds_bucket
45120 kubelet_runtime_operations_duration_seconds_bucket
38290 storage_operation_duration_seconds_bucket
34305 container_tasks_state
32670 coredns_dns_request_size_bytes_bucket
32670 coredns_dns_response_size_bytes_bucket
27444 container_memory_failures_total
22710 kube_pod_status_phase
22710 kube_pod_status_reason
21577 container_blkio_device_usage_total
20556 kubelet_http_requests_duration_seconds_bucket
20224 apiserver_response_sizes_bucket

Prometheus labeldrop 설정

prometheus scrape_configs에 아래의 설정을 적절한 곳에 추가합니다.  metric_relabel_configs 설정하면 메트릭 저장 시 아래의 label을 삭제하고 저장하게 됩니다.

metric_relabel_configs:
  - regex: "id"
    action: labeldrop
  - regex: "uid"
    action: labeldrop
  - regex: "lease"
    action: labeldrop

 

결과

tsdb analyze 결과를 토대로 id, uid, lease에 어떤값들이 들어가는지 확인하여 사용하지 않은 label이라 판단하고 삭제하였더니 메모리 사용율을 낮출 수 있었습니다.  3개의 label삭제로 메모리 60GB 사용 중 18GB가 줄어드는 걸 확인할 수 있었습니다. 

728x90