1. 개요

EC2 내부에 CPU 사용률이 정확하지 않게 표현된다.


2. 데이터

2-1. top

Tasks:  95 total,   1 running,  94 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,60000.0%id,  0.0%wa,  0.0%hi,  0.0%si,-253701324800.0%st
Mem:   4047964k total,  1347616k used,  2700348k free,   360528k buffers
Swap:  2097148k total,        0k used,  2097148k free,   827908k cached

2-2. sar

12:36:00 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:01 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:02 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:03 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:04 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:05 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:06 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:07 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:08 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:09 AM     all      0.00      0.00      0.00      0.00      0.00      0.00
12:36:10 AM     all      0.00      0.00      0.00      0.00      0.00      0.00

2-3. iostat

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2700056 360528 827936    0    0     0     0    0    0  0  0  0  0 100
 0  0      0 2699956 360528 827936    0    0     0     0   63   37  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     4   41   25  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   70   59  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   38   17  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   33   13  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   59   44  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   40   18  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   45   28  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   61   34  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   57   38  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   38   18  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   45   24  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   54   40  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   37   17  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   62   51  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   38   18  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0    24   56   33  0  0  0  0  0
 0  0      0 2699956 360528 827936    0    0     0     0   49   27  0  0  0  0  0

3. 해결책

  • EC2를 stop -> start하여 VM 위치를 옮긴다.
  • CPU Credit을 확인한다.

4. 설명

4-1. top

  • EC2 서비스는 다수의 EC2 인스턴스가 하나의 underlying host 위에서 host의 resource를 공유하게 되는데, 각각의 instance type 마다 share하는 리소스의 비율이 지정되어 있음 예를 들어 A라는 type의 인스턴스는 host 전체 CPU cycle의 10% 이런 식으로 할당됨
  • CPU Usage를 모니터링할 때 top에서는 Instance에 할당된 CPU cycle만을 보는 것이 아니라 host 전체의 CPU를 대상으로 보게 됨. 따라서 위의 예의 인스턴스의 경우 top에서 10%의 CPU usage를 보인다고 하면 실제 할당 받은 host CPU cycle의 10%를 다 쓰게 되는 것임
  • 만약 해당 인스턴스에서 할당 받은 CPU cycle 이상을 host로 요청하면 그 요청되는 값만큼 top 상에서 ST 값으로 보이게 됨. 따라서 top로는 실제 instance 상의 CPU usage를 정확하게 보실 수가 없기 때문에 CloudWatch를 이용해야 함

4-2. t2 인스턴스

  • t2.medium의 경우 할당된 vCPU의 40%가 Baseline Performance며, 2 vCPU 모델이기 때문에 20%/vCPU의 Baseline Performance를 가지도록 설계되어 있음. 이 Baseline Performance에 맞춰서 CPU Credit이 할당되는데, Baseline Performance보다 CPU usage가 낮을 경우 이 Credit은 누적이 되어 더 많은 CPU Usage가 필요할 때 사용이 됨
  • 만약 Burst 이후 Baseline Performance만 유지하고 있는 상태라면 하나의 vCPU당 20% 성능만 사용 가능한 상태이기 때문에, host의 구성 조건에 따라 ST값이 99%가 나올 수 있음
  • 해당 인스턴스들의 CloudWatch 상에서의 CPU usage가 계속 100%이거나 OS 상에서 top로 모니터링 했을 때 지속적으로 ST 값이 보인다면, 적절한 인스턴스 Type으로 변경을 핑요함