Oracle Cloud Infrastructure에서 VM을 파서 운영하다 보면 오라클이 엄청 상세한 설정을 제공함을 알 수 있다. 그 중 하나가 VNIC(Virtual NIC)이다. 오라클에서는 VM을 생성할 때 반가상화 NIC와 하드웨어 가속화 NIC중 하나를 선택할 수 있다.
반 가상화 모드(Paravirtualized)는 OpenStack 계열 VM에서 자주 볼 수 있는 VirtIO NIC이고, 하드웨어 가속 NIC는 mellanox의 NIC로 인식되는 장치가 붙는다.
이 두개는 PPS가 클 때 차이가 발생한다. 필자는 데이터 크기는 적지만 초당 패킷양이 많은 실시간 처리 프로그램을 관리한다. 이 서버 프로그램은 상황에 따라서 200Kpps의 패킷 발신량을 보인다. 이 상황에서 반가상화 모드의 NIC를 보면 다음과 같은 CPU 사용량이 찍힌다
위 그래프의 하늘색 부분은 CPU Steal이다. CPU-Steal이 한 코어에서 거의 90%를 차지하는 모습을 볼 수 있다. 호스트에서 VirtIO를 거쳐서 패킷을 처리하다 보니까 추가적인 CPU 사용량이 필요한 것이다. CPU-Steal은 패킷 처리량이 많아질 수록 더 심해진다.
항간에는 CPU Steal이 같은 호스트에서 같은 코어를 돌려쓰는 VM 서버에 의해 발생한다고 소문이 나 있다. 이런 경우도 분명 있긴 하지만, 이런 반가상화 레이어에 의해서 소모되는 CPU 시간도 CPU-Steal로 잡힌다.
OCI나 Vultr의 Dedicated CPU 상품군 처럼 독립 코어 사용을 보장해 주는 곳에서도 CPU-Steal가 발생한다. 이들에서 발생하는 CPU-Steal은 대부분 이런식으로 Host에서 추가적인 처리에 사용되는 CPU Cost이다.
이런 상황에서 NIC만 하드웨어 가속 모드(SR-IOV, VFIO)로 바꾸면 아래와 같이 CPU-Steal이 사라진다. 그러므로, 네트워크 사용률이 높은 시스템을 구성중이라면 하드웨어 가속 모드로 바꾸기를 권장한다.
대신, 하드웨어 가속 모드를 사용하면 Live Migration이 불가능 하다. Live Migration은 [A 물리 서버]에 있는 VM을 무중단으로 [B 물리 서버]로 이전하는 기술이다. LM이 켜진 상태에서 Host 물리 서버에 장애가 발생하면 알아서 무중단으로 다른 물리 서버로 이전된다.
두가지 모드를 번갈아가서 봐도 220Kpps~250Kpps (수·발신 합산시 450Kpps) 정도의 천장을 넘지 못했다. 다만에 하드웨어 가상화 모드에서는 좀더 세밀한 튜닝을 통해서 20~30kps의 PPS 이득을 볼 수 있었다.
필자는 5~6만명이 접속하는 실시간 시스템을 운영중이다. 22만 패킷이 커보이기는 하지만, 6만명이 초당 3.5개 메세지 밖에 처리를 못하는 수준이다.
이것 저것 테스트 해 본 결과, 반가상화와 SR-IOV 끼리의 차이는 CPU 사용률을 제외하고는 크게 없어 보인다. 사실 10%도 큰 숫자이긴 하지만, 어짜피 원하는 수준으로는 못가기 때문에 (천장이 있기 때문에) 거기서 거기인 느낌이다.
그렇기 때문에, 만약 무중단(Live Migration)이 중요하다면 굳이 SR-IOV를 선택할 필요는 없다는 생각이 든다. 물론 그에 맞춰서 CPU는 널널하게 잡아야 할 것이다.
답글 남기기