ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 왜 Cloudwatch의 CPU 사용량과 top 결과가 다를까?
    DevOps/AWS 2020. 7. 13. 11:48

    AWS 클라우드의 모니터링 서비스인 Cloudwatch에서 제공하는 CPU Utilization 의 소스는 무엇일까? AWS는 사용자의 자원에 접근해서 뭔가 볼 수 없다는데, 내 EC2에 들어가서 top 쳐보면 값이 다른 거 보니까 실제로도 그런 것 같은데. 나는 이 두 개의 다른 값 중에서 뭘 믿어야 하는 걸까?

    CPU와 vCPU에 대하여

    이걸 이해하기 위해서는 우선 우리가 사용하는 EC2(가상 서버)가 사용하는 CPU 구조를 이해할 필요가 있다.
    우리가 사용하는 가상 서버는, 가상화된 물리 서버의 자원을 가져다 쓴다. 그리고 가상 서버에는 vCPU가 할당된다고 말한다.
    이 vCPU는 위 그림에서처럼, 물리 서버의 실제 프로세서 중에서도 core를 기반으로 주어지게 되는 것.
    즉 core 당 x 개의 vCPU를 할당한다, 라는 방식으로 가상화해서 운영을 하게 되는 것이다.

    다시 말하면, AWS는 이런 물리 서버와 가상화 인프라를 갖추어두고 우리는 “VM 하나 만들어줘” 하는 게 EC2이고 이 때 물리적 CPU와 우리 EC2가 사용하는 vCPU는 분리해서 생각할 필요가 있다는 것이다. 왜?!

    Stolen CPU

    왜냐하면 AWS에서 Cloudwatch를 통해 모니터링 해주는 항목은, 이 가상화 컨텍스트를 아는 하이퍼바이저에서 제공되는 값인 반면에 EC2 안에 들어가서 top 명령어를 쳐서 나오는 것은 그렇지 않기 때문이다.

    이게 무슨 말인고 하니, AWS가 가상화해서 나누어주는 자원 범위를 아는 것은 그 하이퍼바이저 뿐이라는 것이다. 즉, 내가 할당 받은 EC2가 코어 중 얼마 만큼만 사용할 수 있는지 그 하이퍼바이저가 알고 있다는 것. 그리고 그 범위 내에서 내 EC2가 얼마나 쓰고 있는지 역시 AWS의 하이퍼바이저다.

    그럼 그 인스턴스에서 top으로 보여주는 것은 뭐냐? 우리의 EC2 뿐만 아니라 다른 인스턴스들이 돌고 있는, 물리 CPU 코어의 사용량을 보여준다. 이 가상 서버 입장에서는 그 코어가 자기 것이라고 착각하는 상태에서가상화의 핵심 일을 하기 때문에 그렇다. 그렇기 때문에 인스턴스 안에서 top은, 그 인스턴스가 할당받은 자원 내에서 실제로 얼마나 자원을 쓰고 있는지 정확히 보여줄 수 없다.

    그럼 인스턴스 입장에서는 아무것도 모르는 수밖에는 없나? top 명령어 결과를 자세히 보면, 약간의 힌트를 찾을 수 있다

    CPU steal time 이라는 것이, 위 스크린샷에서 붉은 박스 안의 st 값으로 백분율로 표시된다. 이 CPU steal time 이라는 것은 해당 인스턴스가 실제 물리 CPU에게 자원을 받기 위해 기다리는 시간을 보여준다. 나는 아무것도 돌리지 않고 있어서 0 이라고 나오지만, CPU 사용이 실제로 발생하다가 한도를 초과하게 되면 st 값이 올라간다. 인스턴스 차원에서는 이 st 값을 확인해서 내 자원이 더 많은 용량을 필요로 하는지 등을 파악할 수 있다.

    참고

    https://axibase.com/news/ec2-monitoring-the-case-of-stolen-cpu/

Designed by Tistory.