Category Archives: 관련기술 시리즈

주변기술 시리즈 #4, KVM live-migration internal

주변기술 시리즈 #4, KVM live-migration (가상머신의 라이브마이그레이션)

가상화 기술의 장점중 하나가 바로 라이브마이그레이션입니다. 라이브마이그레이션이 필요한 이유는 여러가지가 있으나 결과적으로 가상머신의 downtime을 줄이고 서비스의 High Availability를 달성하기 위함이라고 볼 수 있습니다. 심지어 service의 life-cycle이 상대적으로 짧고, HA를 application layer에 의존하도록 하는 IaaS cloud computing 플랫폼에서도 대세는 라이브마이그레이션을 지원하는 방향으로 가고 있습니다. OpenStack의 지원이 그 단적인 예라고 할 수 있지요.

라이브마이그레이션을 위한 조건 및 실패사례는 이전 포스팅을 참고하시고요,
https://ovirtkorea.wordpress.com/2014/06/23/%EC%8B%A4%EC%A0%84-%ED%99%9C%EC%9A%A9%ED%8C%81-%EB%9D%BC%EC%9D%B4%EB%B8%8C-%EB%A7%88%EC%9D%B4%EA%B7%B8%EB%A0%88%EC%9D%B4%EC%85%98-%EC%A4%80%EB%B9%84/

최근에 KVM 라이브마이그레이션 시에 내부적으로 어떤 일들이 읽어나는지, 왜 메모리 변화가 큰(높은 부가) 가상머신의 라이브마이그레이션이 실패하는지에 대한 분석해야할 일이 있었는데요, 관련하여 유용한 자료가 있어 공유합니다.
http://developerblog.redhat.com/2015/03/24/live-migrating-qemu-kvm-virtual-machines/

대략적인 동작은 다음과 같습니다.

  • Stage 1: 가상머신의 모든 메모리를 dirty(복사 대상)으로 설정합니다.
  • Stage 2: 반복적인 iteration을 거쳐 이들 dirty page들을 복사합니다. (1회 iteration을 전송하는 사이에 추가 변경된 page들은 dirty로 재전환), 만약 live migration에 주어진 현재 전송되는 속도(지속적으로 계산)를 고려하여 남은 dirty page가 downtime(기본값 300 ms)내 전송이 가능한 수준이 되면 Stage 3로 전환
  • Stage 3: Source로부터 가상머신을 일시 멈추고, 나머지 dirty page를 destination에 복사합니다. 그리고 destination에서 가상머신을 재시작합니다.

위 과정중에 가장 중요한 부분은 Stage 2 단계로서 이에 영향을 미칠 수 있는 요소는 2가지 입니다.

  • downtime : 허용 가능한 최대 downtime(마이그레이션 마지막 단계에서 일시적, 기본값 300 ms)
  • speed : 초당 전송에 사용할 최대 bandwidth 값(기본 32 MiB/s)

그러나 stage 2에서 전송되는 속도보다 dirty로 변하는 속도가 클 경우에는 결국 라이브 마이그레이션은 실패하게 됩니다. dirty로 변하는 page는 KVM이 추적하게 되며 QEMU에서 KVM API를 통해 각 iteration에서 확인하게 됩니다.

Advertisements

RHEL7 will bring better performance for virtualization

주변기술 시리즈 #3,  RHEL7 가상화 성능 개선점

가상화, 가상화… 온통 가상화가 화두죠. 클라우드가 가능한 것도 자원과 공간의 가상화가 있었기에 가능한 것이고요.
얼마전 Red Hat Enterprise Linux(RHEL) 7.0이 릴리즈되었습니다. 클라우드와 가상화가 자리잡아가고 있는 시점에 등장했기에 더욱 기대가 되는 버전입니다. 그만큼 가상화 측면에서 개선된 점도 많은데요 오늘은 관련 기술들 몇가지 살펴보겠습니다.

Multiple Queue NICs
이전에 RHEL 6.6에 포함될 예정이고 7.0에도 포함될 것이라고 말씀드렸던 그 기능. virtio_net 반가상화 네트워크 드라이버가 드디어 Multiple Queue를 지원합니다. 네트워크 부하가 클 때 인터럽트를 하나 이상의 vCPU에 분산하여 성능을 개선시킬 수 있는 기능으로 RHEL을 비롯한 리눅스 가상머신에서만 지원됩니다.

Multiple Queue virtio_scsi
네트워크쪽에서 개선되었다면 스토리지쪽도 필요하겠죠? SCSI 장치를 위한 virtio_scsi 드라이버도 역시 Multiple Queue를 지원하게 되었습니다.

Bridge Zero Copy Transmit
가상머신과 KVM 호스트 사이에 네트워크 연결은 보통 논리적인 네트워트 스위치 역할을 수행하는 Linux Bridge 사용하게 되는데요, 가상머신 <-> Bridge로 트래픽이 이동하면서 Memory Copy가 일어나게 됩니다. 대량의 데이터가 송수신되는 환경이라면 이 Memory Copy에 따른 Overhead가 성능에 지대한 영향을 미치는데요, Zero Copy Transmit라는 말은 말그대로 가상머신에 Mapping되어 있는 데이터를 Bridge로 Memory Copy하지 않고 바로 Mapping하여 사용할 수 있도록 하는 기능입니다. Zero Copy는 10G NIC 장치에서 널리 사용하는 기술인데, 이제 Bridge에서도 경험할 수 있게 되었습니다. 상당한 성능 개선이 기대되는 부분입니다. (기본은 비활성화되어있네요.)

⁠Para-Virtualized Ticketlocks
가상머신의 vCPU는 사실 KVM 호스트 입장에서는 하나의 Thread로 동작합니다. 때문에 물리적인 CPU core가 8개라도 가상머신에는 그 이상의 vCPU를 할당할 수도 있고 여러 가상머신이 물리적인 core보다 몇배 많은 vCPU를 사용할 수도 있는 것 입니다. 그러나 그만큼 vCPU간에 상호 scheduling하고 대기하는 시간도 길어질 수 있는데요, 경우에 따라 먼저 대기하던 vCPU보다 나중에 도착한 vCPU thread가 물리 CPU를 사용하는 등 불공평등한 상황이 벌어질 수 있습니다. 때문에 이들 locking 매커니즘을 개선한 반가상화 드라이버인 pvticketlocks를 도입하여 이러한 불평등이 다소간 해소되었습니다. 역시 성능 개선이 예상됩니다.

⁠Intel VT-d Large Pages
IOMMU 기능을 활용하면 NIC등 물리적인 장치를 Emulation 없이 가상머신이 직접 Local 장치인 것처럼 점유하여 사용할 수 있습니다. 이를 PCI pass-through라고도 하는데요, 그동안 IOMMU를 사용하더라도 데이터를 리눅스 커널의 page 단위(4 KiB)로 밖에 처리하지 못하는 제약이 있었습니다. 역시 대량의 데이터를 처리하는 하드웨어, 예를 들면 10G NIC,에서는 이러한 제약으로 인해 PCI pass-through에 따른 하드웨어 성능을 100% 경험하지 못하는 어려움이 있었습니다. 7.0부터는 2MiB, 1GiB 단위의 Large Page 크기를 지원하게 되어 TLB hit률이 높아져 상당한 성능 개선이 이뤄질 수 있습니다. 기능의 특성상 일부 하드웨어제 제한적인 지원이 되는데요,  RHEL 6.6에도 포함될 예정입니다.

⁠KVM Clock Get Time Performance
시스템 콜이나 라이브러리 콜을 추적해보면 생각보다 많은 프로그램들이 시스템 시간을 읽는데 CPU 시간을 소진하는 것을 알 수 있습니다. 라이브러리에 의한 간접적인 영향도 있어서 실제로 응용 프로그램에서 호출하지 않더라도 발생할 수 있습니다. 특히 금융권이나 공공시장의 응용프로그램에서 중요한데요, RHEL7에서는 KVM 가상 머신에서의 성능이 개선되어 효과를 보실 수 있습니다.

⁠Live Migration Thread
이 부분은 바로 이전에 ‘실전 시리즈, 라이브 마이그레이션시 가상머신 CPU 사용량 변화’에서 라이브 마이그레이션시에 CPU steal time에 따른 overhead가 있다고 지적해드렸던 부분입니다. RHEL 7.0부터는 라이브 마이그레이션이 별도의 Thread에서 처리되도록 분리되어 vCPU에서의 성능 저하가 사라질 것으로 예상됩니다. 실험에서 확인했던 바와 같이 일시적으로 15%정도 하락되었던 만큼 느낌으로 와닿는 성능 개선의 폭이 크지 않을 수도 있지만, CPU 사용률이 높은 가상머신에서는 민감한 부분이 아닐 수 없습니다.

그외에도 여기에 다 거론하기 힘들만큼 다수의 기능이 개선되었습니다. 하루가 다르게 변화하고 있는 가상화, 클라우드 환경이니만큼 성능상 이점을 얻고자 하신다면 RHEL 7.0을 고민할 때입니다.

참고자료
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/7.0_Release_Notes/chap-Red_Hat_Enterprise_Linux-7.0_Release_Notes-Virtualization.html