그리고 NIC multi queue를 사용하려면, model=virtio도 추가해야 한다.
VM(즉, Guest OS) 내부에서도 NIC Queue 설정 작업을 해야 한다.
# 현재 채널 확인
ethtool -l eth0
# combined 채널 8개로 설정
ethtool -L eth0 combined 8
그리고 위와 같이 NIC queue 개수가 늘어났으면, ksoftirqd 데몬 프로세스의 CPU 사용률을 확인해야 한다.
실제로 NIC multi queue에 저장된 network packet을 여러 CPU core가 고르게 처리하는지 확인한다.
#!/bin/bash
# ksoftirqd PID만 추출하여 top으로 모니터링
pids=$(pgrep ksoftirqd)
if [ -z "$pids" ]; then
echo "ksoftirqd 프로세스를 찾을 수 없습니다."
exit 1
fi
# 여러 CPU용 ksoftirqd가 있으면 쉼표로 이어서 top -p에 전달
pid_list=$(echo "$pids" | tr '\n' ',' | sed 's/,$//')
exec top -p "$pid_list"
방법 B: 이미 운영 중인 VM instance에 대한 NIC Queue 개수를 지정하는 방법
아래와 같이 `virsh edit` 명령으로 VM instance의 NIC queue 개수를 지정할 수 있다.
$ virsh edit myvm
<interface type='network'>
<source network='default'/> ## 실제로 사용하는 network 이름을 찾아야 함.
<model type='virtio'/> ## 이 라인을 추가.
<driver name='vhost' queues='8'/> ## 이 라인을 추가. queue 개수는 내가 원하는 만큼.
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</address>
</interface>
그리고 한번 VM instance를 재시작해야 위 설정값이 VM instance에 적용된다.
$ virsh shutdown myvm
$ virsh start myvm
VM(즉, Guest OS) 내부에서도 NIC Queue 설정 작업을 해야 한다.
# 현재 채널 확인
ethtool -l eth0
# combined 채널 8개로 설정
ethtool -L eth0 combined 8
KVM을 사용하다보면, Virt-Manager라는 GUI 툴이 조작하기 편해서 계속 Virt-Manager만 사용하게 된다.
그런데 가끔 SSH 터미널만 사용할 수 있는 환경이거나 CLI Command만 이용해서 Script를 작성할 때는 virsh를 꼭 사용해야 한다.
Virtual Machine 생성하기 (그리고 VM에 OS 설치하기)
##
## 참고: 아래 명령을 수행하고 대략 55초 정도 지나야 Console에 text message가 출력된다.
## 따라서 느긋하게 기다려야 제대로 설치가 가능하다.
##
## 참고: size 단위는 GB.
##
##
## Case: OS 설치하면서 VM instance 시작하기
## (주의: OS 설치하면서 VM start 할 때는 --osinfo 옵션을 빼야 한다.)
##
$ virt-install \
--name my-vm \
--ram 4096 \
--vcpus 2 \
--disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
--disk /mnt/hdd0/virtual_machine/harbor-2nd-storage.qcow2,size=500 \
--graphics none \
--network network=br-ex \
--console pty,target.type=virtio \
--autoconsole text \
--location /home/iso/ubuntu-24.04.1-live-server-amd64.iso
## Case: 기존 사용했던 VM 이미지를 이용하여 VM instance 기동하기.
$ virt-install \
--import \ ## 기존 VM image 파일을 이용하겠다는 옵션
--osinfo ubuntu24.04 \ ## 이 osinfo 옵션을 꼭 추가해야 한다.
--name my-vm \
--ram 4096 \
--vcpus 2 \
--disk /mnt/sda1/virtual_storage/waas.qcow2,size=100 \
--graphics none \
--network network=br-ex \
--console pty,target.type=virtio \
--autoconsole text
##
## CPU Pinning, Hugepages 설정이 필요해서 사용했던 명령.
##
$ virt-install --import \
--name my-machine \
--vcpus 4 \
## CPU Pinning
--cpuset=2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32 \
--memory=4096 \
## Hugepages
--memorybacking hugepages=on \
--numatune 0 \
--disk /mydir/my-machine.qcow2 \
--network bridge=my-br \
--network bridge=ems-br \
--os-variant rhel7.9 \
--noautoconsole
##
## 주의:
## VM instance 내부에서 OS 설치가 끝나고, 자동 reboot되어야 하는게 정상이지만
## 가끔 OS termination 단계에서 실패하고 멈춘 경우가 있다.
## reboot 시도 후 30초 후에도 console 화면의 변화가 없다면
## 과감하게 VM instance destroy를 시도한다. (아래 명령을 사용)
##
$ virsh list --all
Id Name State
----------------------------
1 my-vm running
$ virsh destroy 1
Domain '1' destroyed
위 `virt-install` 명령을 실행하면, 바로 아래 화면이 출력되고
이 화면에서 대략 55~60초 정도 기다려야 다음 설치 화면으로 넘어간다.
위 화면에서 대략 55~60초 정도 기다리면, 드디어 아래와 같이 OS 설치 시작 화면이 나온다.
비록 Text Terminal 이지만, 조금이라도 예쁜 설치 화면을 원하면 "rich mode"를 선택한다.
이후부터는 일반적인 Ubuntu OS 설치 절차와 같다.
Virtual Machine 목록 보기
$ virsh list --all
Id Name State
-------------------------
1 x-node running
- am0 shut off
- aw0 shut off
- aw1 shut off
$
Virtual Machine 기동하기
##
## am0 가상 머신을 기동하기
##
$ virsh start am0
Domain am0 started
##
## am0 가상 머신이 기동되었는지 확인하기
##
$ virsh list --all
Id Name State
-------------------------
1 x-node running
2 am0 running
- aw0 shut off
- aw1 shut off
$
Virtual Machine 종료하기
##
## Graceful Termination of VM instance
## (참고로, 아래 숫자 2는 VM의 ID이다)
##
$ virsh shutdown 2
Domain 2 is being shutdown
$
##
## VM instance 강제 종료
## (참고로, 아래 숫자 2는 VM의 ID이다)
##
$ virsh destroy 2
##
## VM instance 삭제하기
##
$ virsh undefine vm-name
Virtual Machine의 Console에 접속하기
$ virsh console x-node
Connected to domain x-node
Escape character is ^]
CentOS Linux 8
x-node login: root
Password: ......
[root@x-node ~]# _
qcow2 image file size 조정 (resize)
##
## 원하는 size로 vm image를 재조정할 수 있다.
## 최초에 작게 만들어진 volume image 용량을 더 크게 늘리기 위해서 사용한다.
##
$ qemu-img resize myvm.qcow2 100G
##
## 아래 명령과 같이 수행하여 기존 VM image에서 빈 공간을 제거하고 size를 줄일 수 있다.
## 보통 qcow2 파일을 다른 장비로 옮길 때, vm image size를 줄이기 위한 용도로 사용된다.
## 참고: 원본 qcow2 이미지 파일은 유지되므로 별도로 백업하지 않아도 된다.
$ qemu-img convert -O qcow2 source_image.qcow2 shrunk_image.qcow2
##
## volume image 정보를 열람한다.
##
$ qemu-img info myvm.qcow2
qcow2 image 파일 생성하기
##
## 만약 qcow2 type의 virtual volume을 만들고 싶다면 아래와 같이 명령을 수행.
## Volume size는 250GB로 지정했지만, 실제로는 qcow2 파일에 meta data만 생성하기 때문에
## 실제 사이즈는 1MB 밖에 안 되고, 시간도 3초 정도 밖에 안 걸린다.
##
$ qemu-img create -f qcow2 my-virtual-volume.qcow2 250G
물리 Disk를 가상 Disk로 Import하기 (또는 백업하기)
##
## 아래 명령은 물리 저장 장치(HDD)를 외장 USB에 연결한 것을 가정하고 실행한 예시이다.
##
$ qemu-img convert -f raw -O qcow2 /dev/sdb /opt/vm/my_hdd.qcow2
## CPU pinning 설정하는 명령어
virsh vcpupin <vm-name> <vcpu-number> <host-core-number>
## CPU pinning 설정하기
## - "VM CPU core id 0"은 "Host CPU core id 12"를 사용하도록 고정
## - "VM CPU core id 1"은 "Host CPU core id 13"를 사용하도록 고정
## 위 내용을 실제로 설정하려면, 아래와 같이 명령을 실행하면 된다.
$ virsh vcpupin myvm 0 12
$ virsh vcpupin myvm 1 13
## CPU pinning 상태 확인하기
$ virsh vcpupin myvm
VCPU CPU Affinity
----------------------
0 12
1 13
위에 내가 실제로 VM instance를 Scale-up한 이후의 비용 증가분을 계산한 것은 클라우드 테넌트 계약 조건과 현재 원/달러 환율 따라 30% 정도 차이가 날 것이다. 특히 클라우드 테넌트 계약시, 3년 이상 장기 계약한 경우 많은 할인율이 적용되서 Scale-up에 대한 증가분이 크지 않을 수 있다. 1년 단위로 단기 계약한 테넌트라면, CPU/Memory를 Scale-up할 때 비용 증가분이 위의 계산 결과보다 클 수 있다.
QEMU/KVM이 돌아가는 Baremetal machine(또는 Host machine)이 GNOME 같은 GUI Desktop 환경이 아닌 경우에는
1) QEMU/KVM 서버에 SSH 연결해서
2) 터미널에서 virsh 명령을 이용해서 VM instance를 기동, 종료, 조회 작업을 해야 한다.
virsh CLI 명령에 익숙해지면 어려운 점은 없는데, CPU Memory 통계를 보거나 각종 VM instance의 가상 HW 리소스를 볼 때는
GUI 환경의 Virtual Machine Manager가 편한다.
간단하게 아래 화면을 비교해보자 ! 어느 것이 더 사용하기 편하겠는가?
GUI 환경의 Virtual Machine Manager vs. 터미널 환경의 virsh 명령
Ubuntu 22.04에 Virtual Machine Manager(virt-manager)를 설치하는 절차
준비 작업: SSH 접속 가능 여부 확인 (필수)
아래와 같이 QEMU/KVM이 설치된 서버에 SSH 접속이 되는지 꼭 확인해야 한다.
아래 SSH 접속에서 중요한 점은 "list of known hosts"에 [my-host.com]을 추가하는 과정이다.
SSH 접속만 잘 된다면, "list of know hosts"에 my-host.com이 잘 추가되었다고 생각하면 된다.
[My-PC] $ ssh -p 22678 root@my-host.com
The authenticity of host '[my-host.com]:22678 ([233.52.11.184]:22678)' can't be established.
ED25519 key fingerprint is SHA256:YBk..........................Kg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[my-host.com]:22678' (ED25519) to the list of known hosts.
[my-host.com] $
- Hypervisor: QEMU/KVM 을 입력 (특별한 경우가 아니라면, 이 값을 선택하자)
- Username: root (특별한 경우가 아니라면, root 계정을 사용하자)
- Hostname: my-host.com:22678 (각자의 인터넷 주소를 사용하자. 왼쪽 22678은 SSH 포트 번호를 의미한다.)
위 화면에서 설정이 끝나면, [ Connect ] 버튼을 누른다.
아래와 같이 원격지 Host machine의 QEMU(KVM)에 연결된 것을 볼 수 있을 것이다.
초기 설정에서 주의할 점 (FAQ)
만약 [Virtual Machine Manager]가 QEMU/KVM 서버로 Connect 실패한다면,
위 "준비 작업"에서 설명한 서버 쪽에 SSH 접속을 한번 해주어야 한다.
SSH 터미널을 열 때, 경고 메시지가 한번 나오는데 여기서 Yes를 입력해주어야 위 GUI가 잘 연결된다.
.
.
.
.
.
macOS에 Virtual Machine Manager(virt-manager)를 설치하는 절차
대부분 설정하는 과정은 Ubuntu 22.04와 macOS가 비슷하고, 설치하는 명령(brew vs. apt)만 다르다. 따라서 Ubuntu 22.04에서 동일하게 설정했던 내용은 생략하고, 다른 점만 기술하겠다.
준비 작업: SSH 접속 가능 여부 확인 (필수)
아래와 같이 내 Macbook(또는 Mac Mini)에서QEMU/KVM이 설치된 서버에 SSH 접속이 되는지 꼭 확인해야 한다.
아래 SSH 접속에서 중요한 점은 "list of known hosts"에 [my-host.com]을 추가하는 과정이다.
SSH 접속만 잘 된다면, "list of know hosts"에 my-host.com이 잘 추가되었다고 생각하면 된다.
[My-Macbook] $ ssh -p 22678 root@my-host.com
The authenticity of host '[my-host.com]:22678 ([233.52.11.184]:22678)' can't be established.
ED25519 key fingerprint is SHA256:YBk..........................Kg.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[my-host.com]:22678' (ED25519) to the list of known hosts.
[my-host.com] $