Hypervisor KVM 모니터링하기 2
안녕하세요~!! 지난 포스팅에서 KVM 이 설치된 호스트의 시스템 정보와 사용량을 알아보았다면, 이번에는 KVM 위에 생성된 VM의 자원 정보 및 사용량에 대해 어떻게 모니터링하면 되는지 알아보도록 하겠습니다. 이건 오픈스택의 컴퓨트 노드에 생성된 인스턴스를 이미 고객이 사용하고 있다고 가정했을 경우 운영자는 고객의 VM에 접속하여 시스템 정보를 확인하거나 모니터링을 할 수는 없을 것입니다. 그렇지만, VM의 자원정보와 사용량을 모니터링하여 자원 증설 계획을 세울 경우 유용하게 활용할 수 있습니다. 물론 모니터링 시스템을 준비하는 동안에 잠시 사용하는것이 좋겠지요~!!
인스턴스(VM) 자원 정보 확인하기
이번에는 주변에 있는 리눅스 서버에 먼저 접속을 해 봅시다. 그리고, 해당 서버에 KVM이 설치되어 있고, 그 위에는 VM도 생성되어 실행이 되고 있습니다. 먼저 VM이 실행중인지 확인해 보겠습니다. 제가 접속한 리눅스에는 아래와 같이 director13이라는 이름을 가진 vm 하나가 실행중입니다.
[nalee@rhel8 ~]$ sudo virsh list
Id Name State
----------------------------
1 director13 running
먼저 VM의 사양정보를 먼저 확인해 봅시다. CPU와 Memory는 얼마나 할당이 되어 있는지 궁금하니까요~!! 지금 확인해 본 VM은 현재 실행중이며, CPU는 4 코어가 할당되었으며, 메모리는 8 GB가 할당되었음을 알 수 있습니다. 그리고, 디스크는 Persistent 볼륨을 사용하고 있다는 사실도 알 수 있습니다.
[nalee@rhel8 ~]$ sudo virsh dominfo 1
Id: 1
Name: director13
UUID: 62c5743c-a403-4348-b54b-a4c8b040121c
OS Type: hvm
State: running
CPU(s): 4
CPU time: 5099.1s
Max memory: 8388608 KiB
Used memory: 8388608 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
Security label: system_u:system_r:svirt_t:s0:c348,c446 (enforcing)
VM의 기본 정보를 알아보았으니 이번에는 해당 VM의 CPU가 호스트의 CPU 자원을 얼마나 사용하는지 Memory는 얼마나 쓰고 있는지 알아보겠습니다. 아래와 같이 virsh vcpuinfo 명령어를 이용해 VCPU가 실제 호스트의 몇번째 CPU를 사용하고 있는지를 알수 있습니다.
[nalee@rhel8 ~]$ sudo virsh vcpuinfo 1
VCPU: 0
CPU: 3
State: running
CPU time: 401.4s
CPU Affinity: yyyyyyyy
VCPU: 1
CPU: 6
State: running
CPU time: 510.2s
CPU Affinity: yyyyyyyy
VCPU: 2
CPU: 2
State: running
CPU time: 572.8s
CPU Affinity: yyyyyyyy
VCPU: 3
CPU: 0
State: running
CPU time: 594.3s
CPU Affinity: yyyyyyyy
[nalee@rhel8 ~]$
virsh cpu-stats 명령어를 이용하면 아래와 같이 호스트의 어떤 CPU가 게스트의 CPU 사용을 위해 얼마나 사용이 되었는지를 확인할 수 있습니다. virsh 명령어를 이용하면 가상머신 자체 사용율 뿐만 아니라 실제 호스트의 자원 사용율을 함께 확인할 수 있어 성능이나 자원 정보를 확인할 경우 매우 도움이 많이 됩니다.
[nalee@rhel8 ~]$ sudo virsh cpu-stats 1
CPU0:
cpu_time 65.069415867 seconds
vcpu_time 64.803098365 seconds
CPU1:
cpu_time 59.371172217 seconds
vcpu_time 59.136108708 seconds
CPU2:
cpu_time 57.366378825 seconds
vcpu_time 57.013888348 seconds
CPU3:
cpu_time 25.145053735 seconds
vcpu_time 24.055350865 seconds
CPU4:
cpu_time 9.517770960 seconds
vcpu_time 8.360835460 seconds
CPU5:
cpu_time 30.533177965 seconds
vcpu_time 29.464196607 seconds
CPU6:
cpu_time 20.948436620 seconds
vcpu_time 19.580697413 seconds
CPU7:
cpu_time 52.430419193 seconds
vcpu_time 52.084173926 seconds
Total:
cpu_time 320.383843040 seconds
user_time 1.910000000 seconds
system_time 14.280000000 seconds
virsh domfsinfo 명령어를 VM이 사용중인 파일 시스템 정보를 아래와 같이 확인할 수 있습니다.
[nalee@rhel8 ~]$ sudo virsh domfsinfo 1
Mountpoint Name Type Target
-------------------------------------------------------------
/ dm-0 xfs vda
/boot vda1 xfs vda
/var/lib/containers/storage/overlay dm-0 xfs vda
virsh domblklist는 볼륨 정보를 확인할 수 있으며, VM의 OS 볼륨 위치를 확인할 수 있습니다.
[nalee@rhel8 ~]$ sudo virsh domblklist 1
Target Source
----------------------------------------------------
vda /var/lib/libvirt/images/director13.qcow2
sda
또한, virsh domblkstat 명령어를 통해 볼륨 I/O 정보 또한 확인이 가능합니다. 이와 같은 경우 볼륨에 데이터를 읽고 쓸 경우 얼마나 로드가 발생하는지에 대한 Input / Output 성능 정보를 확인할 수 있습니다.
[nalee@rhel8 ~]$ sudo virsh domblkstat 1
rd_req 33103
rd_bytes 955476908
wr_req 322107
wr_bytes 2361260032
flush_operations 37057
rd_total_times 7176918990
wr_total_times 82386233228
flush_total_times 53510892673
이번에는 VM에 할당된 네트워크 정보를 virsh domiflist 명령어를 통해 확인해 볼 수 있습니다. 지금 조회한 VM은 네트워크를 3개나 가지고 있는것을 확인할 수 있습니다. 이와 더불어 해당 네트워크의 MAC 주소까지 확인할 수 있습니다.
[nalee@rhel8 ~]$ sudo virsh domiflist 1
Interface Type Source Model MAC
---------------------------------------------------------------
vnet0 network external virtio 52:54:00:6b:97:28
vnet1 network provision virtio 52:54:00:71:99:4b
vnet2 network mgmt virtio 52:54:00:a5:64:bb
이렇게 조회된 네트워크는 각각 virsh domifstat 명령어를 이용해 아래와 같이 네트워크 I/O와 같은 성능 정보들을 확인할 수 있습니다.
[nalee@rhel8 ~]$ sudo virsh domifstat 1 vnet0
vnet0 rx_bytes 70888
vnet0 rx_packets 1051
vnet0 rx_errs 0
vnet0 rx_drop 0
vnet0 tx_bytes 2474
vnet0 tx_packets 28
vnet0 tx_errs 0
vnet0 tx_drop 0
[nalee@rhel8 ~]$ sudo virsh domifstat 1 vnet1
vnet1 rx_bytes 84781
vnet1 rx_packets 1289
vnet1 rx_errs 0
vnet1 rx_drop 0
vnet1 tx_bytes 17550
vnet1 tx_packets 321
vnet1 tx_errs 0
vnet1 tx_drop 0
[nalee@rhel8 ~]$ sudo virsh domifstat 1 vnet2
vnet2 rx_bytes 69111
vnet2 rx_packets 1090
vnet2 rx_errs 0
vnet2 rx_drop 0
vnet2 tx_bytes 2650
vnet2 tx_packets 49
vnet2 tx_errs 0
vnet2 tx_drop 0
물론 해당 VM의 CPU 정보부터 네트워크 디바이스의 I/O 성능 정보까지 모두 확인해 보고 싶다면 아래와 같이 virsh domstats 명령어를 이용하면 VM의 전체적인 성능 정보를 확인할 수 있습니다.
[nalee@rhel8 ~]$ sudo virsh domstats 1
Domain: 'director13'
state.state=1
state.reason=1
cpu.time=5310695690591
cpu.user=10840000000
cpu.system=335080000000
cpu.cache.monitor.count=0
balloon.current=8388608
balloon.maximum=8388608
balloon.swap_in=0
balloon.swap_out=0
balloon.major_fault=321
balloon.minor_fault=149592
balloon.unused=7778764
balloon.available=7997212
balloon.usable=7678828
balloon.last-update=1614951779
balloon.disk_caches=66000
balloon.hugetlb_pgalloc=0
balloon.hugetlb_pgfail=0
balloon.rss=7682848
vcpu.current=4
vcpu.maximum=4
vcpu.0.state=1
vcpu.0.time=968690000000
vcpu.0.wait=0
vcpu.1.state=1
vcpu.1.time=1351430000000
vcpu.1.wait=0
vcpu.2.state=1
vcpu.2.time=1463220000000
vcpu.2.wait=0
vcpu.3.state=1
vcpu.3.time=1492330000000
vcpu.3.wait=0
net.count=3
net.0.name=vnet0
net.0.rx.bytes=79924
net.0.rx.pkts=1198
net.0.rx.errs=0
net.0.rx.drop=0
net.0.tx.bytes=2544
net.0.tx.pkts=29
net.0.tx.errs=0
net.0.tx.drop=0
net.1.name=vnet1
net.1.rx.bytes=92301
net.1.rx.pkts=1411
net.1.rx.errs=0
net.1.rx.drop=0
net.1.tx.bytes=19282
net.1.tx.pkts=355
net.1.tx.errs=0
net.1.tx.drop=0
net.2.name=vnet2
net.2.rx.bytes=75159
net.2.rx.pkts=1192
net.2.rx.errs=0
net.2.rx.drop=0
net.2.tx.bytes=2776
net.2.tx.pkts=52
net.2.tx.errs=0
net.2.tx.drop=0
block.count=2
block.0.name=vda
block.0.path=/var/lib/libvirt/images/director13.qcow2
block.0.backingIndex=2
block.0.rd.reqs=33083
block.0.rd.bytes=955476480
block.0.rd.times=7176880319
block.0.wr.reqs=435532
block.0.wr.bytes=3092401152
block.0.wr.times=110727725424
block.0.fl.reqs=48858
block.0.fl.times=70697308478
block.0.allocation=98203009024
block.0.capacity=107374182400
block.0.physical=111672762368
block.1.name=sda
block.1.rd.reqs=20
block.1.rd.bytes=428
block.1.rd.times=38671
block.1.wr.reqs=0
block.1.wr.bytes=0
block.1.wr.times=0
block.1.fl.reqs=0
block.1.fl.times=0
이제 VM에 접속할 수 없다고, VM 내부에 성능 측정 에이전트를 설치하지 않았더라도, virsh 명령어를 통해 간단하게 VM의 사양 및 성능 정보를 확인할 수 있습니다. 이런 정보들만 로그로 잘 수집하여 가공한다면, 더없이 훌륭한 모니터링 데이터가 되겠지요~!! 임시로 가끔 필요한 정보를 확인해 보거나, 모니터링 시스템이 갖추어지기 전이라면 충분히 명령어를 통해 확인 할 수 있습니다.
다음 포스팅에서는 네트워크 패킷 캡처 프로그램이 없이도 리눅스 명령어를 통해 패킷 정보를 확인해 보는 방법에 대해 포스팅하고자 합니다. 그럼, 다음 포스팅에서 만나요~!!