Cloud

Hypervisor KVM 모니터링하기 3

naleejang 2021. 3. 20. 01:12

요 근래에 고객사에서 KVM 하이퍼바이저에서 생성된 VM이 사용하고 있는 자원 사용률을 확인할 일이 있었습니다. 그때 저는 virsh 명령어를 이용해 유용하게 VM의 자원 사용률을 확인을 했었습니다. 그런데, KVM에 위에 생성된 VM에 할당해 준 VCPU는 호스트의 몇 번 CPU를 사용할까? 하고 궁금증이 일어났습니다. 분명히 봤는데, 기억이 안나서 오늘 virsh 명령어를 살펴보다가 내가 생성한 VM의 VCPU가 호스트의 몇번 CPU를 사용하는지 알 수 있는 virsh 명령어를 찾아냈습니다. 

그래서, 잃어버리전에 블로그에 적어놓아야겠다는 생각을 했습니다. 그럼, 시작해 볼까요?

제가 사용하는 노트북에는 오픈스택을 설치하기 위한 VM들이 KVM 하이퍼바이저 위에 생성되어 있어요. 제 노트북의 CPU는 4 Core인데, Hyperthread를 적용하여 8 Core로 보여요. 그런데, 저는 VM 4개를 생성할때 VM당 4vCore씩 할당을 해 주었어요. 그럼, 총 할당된 vCore는 16 vCore로 8 Core의 2배를 할당해 준 셈이 되는거죠~!! 그래서, 이런 경우를 보고 우리는 OverCommit 했다고 말해요~!! 사실 그래서 엄청 느리긴 해요~!! 아무튼 virsh 명령어를 통해 내가 생성한 VM의 vCPU가 호스트의 몇번 CPU를 사용하는지를 확인해 보니 아래와 같이 한 호스트 CPU에 2개 내지는 3개의 VM CPU가 함께 사용하고 있더라구요~!!

======================================
 VM의 VCPU는 호스트의 몇번 CPU를 사용할까?
======================================
Host CPU 0 : VM 2-2, VM 4-3
Host CPU 1 : VM 1-1, VM 1-2, VM 2-1
Host CPU 2 : VM 1-0, VM 4-1
Host CPU 3 : VM 3-3
Host CPU 4 : VM 3-1, VM 3-2, VM 4-2
Host CPU 5 : VM 4-0
Host CPU 6 : VM 2-0, VM 2-3
Host CPU 7 : VM 1-3, VM 3-0

여러분들의 이해를 돕기 위해 호스트 CPU에 점유중인 VM CPU를 그림으로 표현한 것이 바로 위 왼쪽 Overcommit CPU 할당 예에요. 클라우드와 같이 가상화 환경을 사용하다보면 때로는 성능을 중요하게 생각하는 VM도 있을것이고, 그렇지 않은 VM도 분명히 있을꺼예요~!! 성능을 중요하게 생각하고, 많은 사용자가 접속을 해야하는 시스템이 올라가는 VM을 생성할 경우에는 위 그림 오른쪽 좋은 성능을 위한 CPU 할당 예처럼 CPU를 사용해야 해요. 왜 그러냐구요? 상식적으로 생각해보세요~!! 여러 사람들하고 함께 사용하는 공중 화장실이 편한지, 나 혼자 단독으로 사용할 수 있는 우리 집 화장실이 더 편한지 말이예요~!! ㅋ 물론 청소가 잘 되어 있고, 사람이 별로 없다면 공중 화장실이 더 좋을수도 있어요. 하지만, 공중화장실에 사람이 몰린다고 생각해 보세요~!! 볼일은 급한데, 먼저 온 사람이 화장실을 다 사용할때까지 기다려야 하고, 화장실은 금방 더러워지겠죠~!! CPU도 마찬가지라고 저는 생각해요~!! 여러 VM의 CPU가 같은 호스트의 CPU를 사용한다면, 먼저 선점해서 사용하고 있는 CPU를 기다려야 하고, 같이 사용하는 VM의 CPU 개수가 많아질수록 나누어 사용할 수 있는 시간도 짧아지겠죠~!! 그런데, 호스트 CPU 하나를 VM CPU 혼자 사용한다고 생각해 보세요~!!! 언제든지 CPU 사용 요청이 오면 바로바로 사용할 수 있어요. 그렇기 때문에 성능을 요구하는 시스템이 올라가는 VM이 많을 경우에는 반드시 물리자원의 CPU 코어를 넘기지 않도록 할당해 주는 것이 중요합니다.

 

그럼 지금부터 어떤 virsh 명령어로 VM의 CPU가 호스트의 몇번 CPU를 사용지를 알수 있는지 알아보겠습니다. 먼저 virsh list 명령어를 이용해 어떤 VM이 생성되어 있는지 확인합니다.

[root@rhel8 ~]# virsh list
 Id   Name         State
----------------------------
 1    cn01         running
 2    cn02         running
 3    con1         running
 4    director13   running

[root@rhel8 ~]# 

그리고, 확인하고자 하는 VM ID 또는 Name과 함께 아래와 같이 virsh vcpuinfo [VM ID or Name] 을 입력하면 해당 VM의 CPU가 호스트의 몇번 CPU를 사용하고 있는지 해당 VCPU가 호스트 CPU를 몇초나 사용했는지에 대한 정보를 알수가 있습니다.

[root@rhel8 ~]# virsh vcpuinfo 1
VCPU:           0
CPU:            2
State:          running
CPU time:       7468.8s
CPU Affinity:   yyyyyyyy

VCPU:           1
CPU:            1
State:          running
CPU time:       5679.4s
CPU Affinity:   yyyyyyyy

VCPU:           2
CPU:            1
State:          running
CPU time:       7727.6s
CPU Affinity:   yyyyyyyy

VCPU:           3
CPU:            7
State:          running
CPU time:       4886.3s
CPU Affinity:   yyyyyyyy

[root@rhel8 ~]# virsh vcpuinfo 2
VCPU:           0
CPU:            6
State:          running
CPU time:       2210.2s
CPU Affinity:   yyyyyyyy

VCPU:           1
CPU:            1
State:          running
CPU time:       2553.9s
CPU Affinity:   yyyyyyyy

VCPU:           2
CPU:            0
State:          running
CPU time:       2249.9s
CPU Affinity:   yyyyyyyy

VCPU:           3
CPU:            6
State:          running
CPU time:       2686.5s
CPU Affinity:   yyyyyyyy

[root@rhel8 ~]# virsh vcpuinfo 3
VCPU:           0
CPU:            7
State:          running
CPU time:       33341.5s
CPU Affinity:   yyyyyyyy

VCPU:           1
CPU:            4
State:          running
CPU time:       32795.3s
CPU Affinity:   yyyyyyyy

VCPU:           2
CPU:            4
State:          running
CPU time:       33079.7s
CPU Affinity:   yyyyyyyy

VCPU:           3
CPU:            3
State:          running
CPU time:       33567.9s
CPU Affinity:   yyyyyyyy

[root@rhel8 ~]# virsh vcpuinfo 4
VCPU:           0
CPU:            5
State:          running
CPU time:       31578.5s
CPU Affinity:   yyyyyyyy

VCPU:           1
CPU:            2
State:          running
CPU time:       38377.4s
CPU Affinity:   yyyyyyyy

VCPU:           2
CPU:            4
State:          running
CPU time:       41270.1s
CPU Affinity:   yyyyyyyy

VCPU:           3
CPU:            1
State:          running
CPU time:       43607.2s
CPU Affinity:   yyyyyyyy

이렇게해서 VM의 VCPU는 호스트의 몇번 CPU를 사용할까? 의 의문증은 해결이 되었습니다. 이 외에도 virsh --help 명령어를 이용하여 sub command를 살펴보다보면 유용한 명령어들이 많이 있습니다. 그러니 여러분도 시간날때 virsh --help 명령어를 살펴보는건 어떨까요?