Datadog와 kubectl top pod에서 얻을 수 있는 pod의 메모리 관련 정보의 차이에 대해서

4090 단어 Datadogkubernetes

개요



Kubernetes의 감시에 Datadog를 이용하고 있어, pod별의 메모리 사용률을 감시하고 있었는데, 상정하고 있던 메모리 사용률을 크게 넘고 있는 pod가 있었기 때문에 조사했습니다.

이변을 깨달았을 때의 증거



이번에는 Cluster Autoscaler의 pod 메모리 사용률이 다른 pod보다 눈에 띄었기 때문에 이를 중심으로 조사했습니다.
kubectl top pod에서 보이는 메모리 사용률이 42Mi 정도, Limit에서 설정하고 있는 메모리 할당은 256Mi이므로, 메모리 사용률은 16% 정도인 것이지만, Datadog로부터 취득할 수 있는 메모리 사용률은 99% 이상으로 되어 있다 네.

kubectl top pod에서 볼 수 있는 메모리 사용량


$ kubectl top pod -n kube-system cluster-autoscaler-xxxx
NAME                                  CPU(cores)   MEMORY(bytes)
cluster-autoscaler-xxxx               2m           42Mi


$ kubectl describe node ip-000-000-000-000.ap-northeast-1.compute.internal
~~~~中略
  Namespace                   Name                                   CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                   ----                                   ------------  ----------  ---------------  -------------  ---
  kube-system                 cluster-autoscaler-xxxx                200m (5%)     200m (5%)   256Mi (3%)       256Mi (3%)     4d22h

Datadog 모니터에서 볼 수 있는 메모리 사용량



Datadog는 kubernetes.memory.usage_pct의 지표를 사용합니다.
다음은 메모리 사용률의 그래프입니다만, 거의 100%에 붙어 있는 것을 알 수 있습니다.


컨테이너의 메모리 사용량을 봐도 252Mib 사용하고 있어 메모리 사용률과 마찬가지로 상정을 크게 웃도는 값을 계측하고 있었습니다.


조사 내용



Datadog는 pod의 메모리 사용률을 어떻게 계산합니까?



kubectl top pod에서 보이는 메모리 사용률이 이상하다는 가능성도 0이 아니었지만, 위의 kubectl get node의 결과와 시간이 경과해도 OOMKiller에서 pod가 죽지 않았기 때문에 , Datadog에서 보이는 지표가 이상하다고 가정하여 조사를 수행했습니다.

kubernetes.memory.usage_pct가 메모리 사용량을 계산하는 방법을 Datadog 지원 데스크에 문의 한 결과 Datadog는 kubelet API ( '/metrics/cadvisor')를보고 있다는 답변을 받았습니다.

cAdvisor의 memory_usage가 메모리 사용률을 계산하는 방법에 대한 자세한 내용은 issue에서 논의 된 내용과 소스 코드의 댓글 포함된 비활성 메모리도 사용률로 계산하는 것으로 나타났습니다.

또, issue내의 이하의 코멘트로부터 working_set 라고 하는 메트릭스를 이용하는 것으로, 비액티브인 메모리를 제외한 메모리 사용량을 취득할 수 있을 것이라고 하는 것을 알 수 있습니다.

memory_usage = RAM usage include pages that have not been accessed in a long time.
working set = memory usage - inactive memory.

대응



위의 조사에서 대체 메트릭으로 working_set을 이용한 결과, kubectl top pod에서 취득했을 때의 메모리 사용량과 같은 값을 취득할 수 있었습니다.



그러나 여기에서 확인한 값은 어디까지나 메모리 사용량이며, 모니터링하려는 메트릭은 메모리 사용률이므로 변환해야 합니다.
메모리 사용률은, 메모리 사용량과 kubernetes 매니페스트로 지정하고 있는 메모리의 자원 리미트로부터 산출할 수 있으므로, 이하의 계산 결과의 값을 설정하는 것으로 메모리 사용률을 취득할 수 있을 것 같습니다.

memory.working_set/Memory Limit 설정값 * 100

위의 계산식(memory.working_set/Memory의 Limit의 설정치 * 100)을 바탕으로 Datadog상에서 다음과 같이 설정했는데, 약 16%로 적절한 메모리 사용률을 얻을 수 있었습니다.

좋은 웹페이지 즐겨찾기