Cloud

Hypervisor KVM 모니터링하기 1

naleejang 2021. 3. 6. 13:40

안녕하세요~!! 오늘은 모니터링 시스템이 없을경우 오픈스택의 컴퓨트 노드에 구성된 하이퍼바이저인 KVM을 virsh 명령어를 통해 모니터링할 수 있는 방법들에 대해서 알아보고자 합니다.

최근에 제가 고객사에 오픈스택 환경을 점검하러 갈 사례가 꽤 있었는데요~!! 그럴때마다 물어보는게 모니터링은 어떻게 하나요? 라는 질문이였어요. 물론 모니터링 시스템을 직접 구축하거나, 그럴 역량과 시간이 되지 않는다면 누군가가 개발해 놓은 모니터링 시스템을 사용하면 됩니다. 물론, 시스템을 구축하기까지는 시간이 필요하므로, 그동안은 KVM을 관리할 수 있는 명령어인 virsh 명령어를 이용해 컴퓨트 노드의 VM 개수 및 해당 VM의 상태를 확인할 수 있습니다. 뿐만 아니라, 호스트 노드(여기서는 컴퓨트 노드가 되겠죠~!!)의 정보까지도 확인이 가능합니다. 

물론, 오픈스택을 사용하지 않는 일반 리눅스 사용자들도 KVM이 설치되어 있다면 얼마든지 사용할 수 있습니다. 지금부터 알아보려고 하는건 일반 리눅스 시스템에 설치된 KVM을 활용하여 어떻게 모니터링을 할 수 있는지 명령어들을 알아볼 예정입니다. 

역시 이번에도 글이 길면 가독성이 떨어지므로, 여러편으로 나누어서 글을 포스팅하고자 합니다.

리눅스와 KVM 그리고, 네트워크의 개념

모든 하드웨어는 운영체제가 있어야 사용을 할 수 있습니다. 하드웨어에는 프로세싱을 처리하는 CPU와 무언가를 저장하고 기억하는 메모리, 서버와 서버간의 통신을 담당하는 네트워크 카드, 컴퓨터가 꺼져도 데이터를 저장할 수 있는 디스크로이루어집니다. 그리고, 이 하드웨어 운영체제를 설치하는 순간 살아있는 생명체가 되게 됩니다. 

아래 그림은 리눅스를 설치한 서버에 KVM 하이퍼바이저를 설치하고, 하이퍼바이저에 의해 생성된 가상 네트워크와 가상 서버를 표현한 그림입니다. 이런 형태로 구성된 서버가 매우 많이 있다고 생각해 봅시다. 아래 그림에는 가상서버가 2대 밖에 없지만, 이런 가상서버도 많이 있다고 생각해 봅시다. 

가상자원도 많고, 실제 물리 서버도 여러대가 있을경우, 그 많은 서버의 자원 상태를 사용현황을 확인해야 할 필요도 있고, 또 얼마나 자원을 사용하고 있는지도 궁금할 것입니다. 그래서, 많은 사람들은 모니터링 시스템을 구축합니다. 시스템에서 남겨주는 다양한 이벤트 로그나 상태 모니터링 로그를 수집하여 저장하고, 가공하여 웹 페이지로 보여주는 것이지요. 그런데, 모니터링 도구나 시스템이 없을 경우에는 간단하게 KVM을 관리할 수 있는 virsh 명령어를 이용하여 쉽게 호스트 및 가상 서버의 자원 사용 상태 등을 모니터링 할 수 있습니다. 

호스트 서버 자원 정보 확인하기

먼저 주변에 있는 리눅스에 서버에 한번 접속해 봅시다. 그리고, KVM 하이퍼바이저가 설치되어 있는지 확인해 봅시다. 호스트 노드의 CPU 정보가 알고 싶다면 아래와 같이 virsh nodeinfo 명령어를 통해 쉽게 확인할 수 있습니다.

[nalee@rhel8 ~]$ sudo virsh nodeinfo
CPU model:           x86_64
CPU(s):              8
CPU frequency:       2416 MHz
CPU socket(s):       1
Core(s) per socket:  4
Thread(s) per core:  2
NUMA cell(s):        1
Memory size:         32295544 KiB

호스트명이 궁금하신가요? 그럼, virsh hostname 명령어를 통해 호스트명을 확인할 수 있습니다. 호스트명이 나와 있어서 궁금하지 않다구요? 이건 IP 정보만 알고 있는 서버에 ssh로 접근하여 호스트명을 확인할 때 매우 유용할 수 있습니다.

[nalee@rhel8 ~]$ sudo virsh hostname
rhel8

그럼, 이번에는 cpu와 메모리 사용률을 확인해 볼까요? 아래와 같이 cpu는 virsh nodecpustats 명령어를 통해 확인할 수 있고, 메모리는 virsh nodememstats 명령어를 통해 확인할 수 있습니다. 봐도 뭔지 모르겠다구요? 저도 비슷하긴 하지만, 영어 단어를 조금만 이해할 수 있다면 쉽게 무슨 뜻인지 알 수 있습니다. 

# cpu 사용률 확인
[nalee@rhel8 ~]$ sudo virsh nodecpustats
user:                  4247100000000
system:                 648330000000
idle:                 51298910000000
iowait:                  54430000000

# memory 사용률 확인
[nalee@rhel8 ~]$ sudo virsh nodememstats
total  :             32469668 KiB
free   :             17931792 KiB
buffers:                 4108 KiB
cached :              4052260 KiB

일단 명령어를 좀 살펴볼까요? 노드의 cpu 상태를 알고 싶어요. 그럼 node라는 단어를 통해 아 이건 node의 자원정보를 보여주는 거구나 라는 걸 알 수 있어요. 그리고, cpu를 보고 싶은 거잖아요. 그래서 cpu 라는 단어가 또 사용되겠죠~!! 마지막은 상태는 영어로 stats라고 하잖아요. 그래서 nodecpustats 서브 명령어는 node의 cpu stat(상태)를 보여주는 명령어구나를 알수 있어요. 결과를 좀 볼까요? user 는 당연히 사용자가 현재 사용하고 있는 cpu 사용율이겠죠!! 그리고, system은 운영체제가 시스템을 운영하기 위해 사용하는 사용율일 것입니다. idle은 뭔가요? 놀고 있는 cpu 를 말하는겁니다. 그래서, 사용가능한 자원 정보라고 볼 수 있습니다. 마지막으로 iowait는 말그대로 디스크에 무엇가를 얼마나 쓰고(i, input) 읽었는지(o, output)를 확인할 수 있습니다. 메모지는 전체 사용량(total), 사용하지 않은 메모리량(free), 버퍼 메모리(buffer) 및 cach 메모리(cached) 정보들을 확인할 수 있습니다.

또한 해당 서버의 하드웨어 정보까지도 virsh 명령어를 통해 아래와 같이 확인할 수 있습니다. virsh 명령어를 통해 하드웨어를 제조사 정보 및 모델 정보를 확인할 수 있고, CPU 및 Memory의 모델 및 사양을 확인할 수 있습니다.

[nalee@rhel8 ~]$ sudo virsh sysinfo
<sysinfo type='smbios'>
  <bios>
    <entry name='vendor'>LENOVO</entry>
    <entry name='version'>N2IET80W (1.58 )</entry>
    <entry name='date'>11/26/2019</entry>
    <entry name='release'>1.58</entry>
  </bios>
  <system>
    <entry name='manufacturer'>LENOVO</entry>
    <entry name='product'>20N5S2NC14</entry>
    <entry name='version'>ThinkPad T590</entry>
    <entry name='serial'>PF14AV50</entry>
    <entry name='uuid'>7929a94c-318c-11b2-a85c-a9e6c3348634</entry>
    <entry name='sku'>LENOVO_MT_20N5_BU_Think_FM_ThinkPad T590</entry>
    <entry name='family'>ThinkPad T590</entry>
  </system>
  <baseBoard>
    <entry name='manufacturer'>LENOVO</entry>
    <entry name='product'>20N5S2NC14</entry>
    <entry name='version'>Not Defined</entry>
    <entry name='serial'>L1HF98E00V3</entry>
    <entry name='asset'>Not Available</entry>
    <entry name='location'>Not Available</entry>
  </baseBoard>
  <chassis>
    <entry name='manufacturer'>LENOVO</entry>
    <entry name='version'>None</entry>
    <entry name='serial'>PF14AV50</entry>
    <entry name='asset'>No Asset Information</entry>
    <entry name='sku'>Not Specified</entry>
  </chassis>
  <processor>
    <entry name='socket_destination'>U3E1</entry>
    <entry name='type'>Central Processor</entry>
    <entry name='family'>Core i7</entry>
    <entry name='manufacturer'>Intel(R) Corporation</entry>
    <entry name='signature'>Type 0, Family 6, Model 142, Stepping 12</entry>
    <entry name='version'>Intel(R) Core(TM) i7-8665U CPU @ 1.90GHz</entry>
    <entry name='external_clock'>100 MHz</entry>
    <entry name='max_speed'>2100 MHz</entry>
    <entry name='status'>Populated, Enabled</entry>
    <entry name='serial_number'>None</entry>
    <entry name='part_number'>None</entry>
  </processor>
  <memory_device>
    <entry name='size'>16 GB</entry>
    <entry name='form_factor'>SODIMM</entry>
    <entry name='locator'>ChannelA-DIMM0</entry>
    <entry name='bank_locator'>BANK 0</entry>
    <entry name='type'>DDR4</entry>
    <entry name='type_detail'>Synchronous</entry>
    <entry name='speed'>2667 MT/s</entry>
    <entry name='manufacturer'>Samsung</entry>
    <entry name='serial_number'>00000000</entry>
    <entry name='part_number'>M471A2G44AM0-CTD</entry>
  </memory_device>
  <memory_device>
    <entry name='size'>16 GB</entry>
    <entry name='form_factor'>SODIMM</entry>
    <entry name='locator'>ChannelB-DIMM0</entry>
    <entry name='bank_locator'>BANK 2</entry>
    <entry name='type'>DDR4</entry>
    <entry name='type_detail'>Synchronous</entry>
    <entry name='speed'>2667 MT/s</entry>
    <entry name='manufacturer'>Samsung</entry>
    <entry name='serial_number'>31F8C24F</entry>
    <entry name='part_number'>M471A2K43DB1-CTD</entry>
  </memory_device>
</sysinfo>

[nalee@rhel8 ~]$ 

이렇게해서 virsh 명령어를 통해 호스트 서버의 하드웨어 모델 및 사양(SPEC) 정보를 알아보고, 호스트의 CPU와 메모리 사용율도 함께 알아보았습니다.

다음 포스팅에서는 가상자원인 VM의 CPU, 메모리, 네트워크 정보 등을 어떻게 확인하면 되는지에 대해 알아보도록 하겠습니다. 그럼, 다음 포스팅에서 다시 만나요~!!!