17.5. 가상 머신 I/O 성능 최적화
VM(가상 머신)의 입력 및 출력(I/O) 기능은 VM의 전체 효율성을 크게 제한할 수 있습니다. 이를 해결하기 위해 블록 I/O 매개변수를 구성하여 VM의 I/O를 최적화할 수 있습니다.
17.5.1. 가상 머신에서 블록 I/O 튜닝 링크 복사링크가 클립보드에 복사되었습니다!
하나 이상의 VM에서 여러 블록 장치를 사용하는 경우 I/O weights 를 수정하여 특정 가상 장치의 I/O 우선 순위를 조정하는 것이 중요할 수 있습니다.
장치의 I/O 가중치를 늘리면 I/O 대역폭의 우선 순위가 증가하므로 더 많은 호스트 리소스를 제공합니다. 마찬가지로, 장치의 가중치를 줄이면 호스트 리소스가 적게 소비됩니다.
각 장치의 가중치 값은 100 ~1000 범위 내에 있어야 합니다. 또는 값은 장치별 목록에서 해당 장치를 제거하는 0 일 수 있습니다.
프로세스
VM의 블록 I/O 매개변수를 표시하고 설정하려면 다음을 수행합니다.
VM의 현재 &
lt;blkio> 매개변수를 표시합니다.# virsh dumpxml VM-name<domain> [...] <blkiotune> <weight>800</weight> <device> <path>/dev/sda</path> <weight>1000</weight> </device> <device> <path>/dev/sdb</path> <weight>500</weight> </device> </blkiotune> [...] </domain>지정된 장치의 I/O 가중치를 편집합니다.
# virsh blkiotune VM-name --device-weights device, I/O-weight예를 들어, 다음에서는 testguest1 VM의 /dev/sda 장치의 가중치를 500으로 변경합니다.
# virsh blkiotune testguest1 --device-weights /dev/sda, 500
검증
VM의 블록 I/O 매개변수가 올바르게 구성되었는지 확인합니다.
# virsh blkiotune testguest1 Block I/O tuning parameters for domain testguest1: weight : 800 device_weight : [ {"sda": 500}, ] ...중요특정 커널은 특정 장치의 I/O 가중치 설정을 지원하지 않습니다. 이전 단계에서 가중치가 예상대로 표시되지 않으면 이 기능이 호스트 커널과 호환되지 않을 수 있습니다.
17.5.2. 가상 머신의 디스크 I/O 제한 링크 복사링크가 클립보드에 복사되었습니다!
여러 VM이 동시에 실행되면 과도한 디스크 I/O를 사용하여 시스템 성능을 방해할 수 있습니다. KVM 가상화의 디스크 I/O 제한은 VM에서 호스트 머신으로 전송된 디스크 I/O 요청에 제한을 설정할 수 있는 기능을 제공합니다. 이렇게 하면 VM에서 공유 리소스를 과도하게 활용하고 다른 VM의 성능에 영향을 미치는 것을 방지할 수 있습니다.
디스크 I/O 제한을 활성화하려면 VM에 연결된 각 블록 장치에서 호스트 시스템에 연결된 디스크 I/O 요청에 대한 제한을 설정합니다.
프로세스
virsh domblklist명령을 사용하여 지정된 VM에 있는 모든 디스크 장치의 이름을 나열합니다.# virsh domblklist rollin-coal Target Source ------------------------------------------------ vda /var/lib/libvirt/images/rollin-coal.qcow2 sda - sdb /home/horridly-demanding-processes.isothrottle이 마운트되는 가상 디스크가 마운트된 호스트 블록 장치를 찾습니다.
예를 들어 이전 단계의
sdb가상 디스크를 제한하려면 다음 출력에서 디스크가/dev/nvme0n1p3파티션에 마운트되었음을 보여줍니다.$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT zram0 252:0 0 4G 0 disk [SWAP] nvme0n1 259:0 0 238.5G 0 disk ├─nvme0n1p1 259:1 0 600M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot └─nvme0n1p3 259:3 0 236.9G 0 part └─luks-a1123911-6f37-463c-b4eb-fxzy1ac12fea 253:0 0 236.9G 0 crypt /homevirsh blkiotune명령을 사용하여 블록 장치의 I/O 제한을 설정합니다.# virsh blkiotune VM-name --parameter device,limit다음 예제에서는
rollin-coalVM의sdb디스크를 초당 I/O 작업과 초당 50MB의 읽기 및 쓰기 처리량으로 1000으로 제한합니다.# virsh blkiotune rollin-coal --device-read-iops-sec /dev/nvme0n1p3,1000 --device-write-iops-sec /dev/nvme0n1p3,1000 --device-write-bytes-sec /dev/nvme0n1p3,52428800 --device-read-bytes-sec /dev/nvme0n1p3,52428800
추가 리소스
- 디스크 I/O 제한은 다양한 상황에서 유용할 수 있습니다(예: 서로 다른 고객에 속하는 VM이 동일한 호스트에서 실행 중이거나 다른 VM에 대한 서비스 품질 보장이 제공되는 경우). 디스크 I/O 제한은 느린 디스크를 시뮬레이션하는 데에도 사용할 수 있습니다.
- I/O 제한은 VM에 연결된 각 블록 장치에 독립적으로 적용할 수 있으며 처리량 및 I/O 작업에 대한 제한을 지원합니다.
-
Red Hat은
virsh blkdeviotune명령을 사용하여 VM에서 I/O 제한을 구성하는 것을 지원하지 않습니다. RHEL 8을 VM 호스트로 사용할 때 지원되지 않는 기능에 대한 자세한 내용은 RHEL 8 가상화에서 지원되지 않는 기능을 참조하십시오.
17.5.3. 스토리지 장치에서 다중 대기열 활성화 링크 복사링크가 클립보드에 복사되었습니다!
VM(가상 시스템)에서 virtio-blk 또는 virtio-scsi 스토리지 장치를 사용하는 경우 멀티 큐 기능을 통해 스토리지 성능과 확장성을 개선할 수 있습니다. 이를 통해 각 가상 CPU(vCPU)에 다른 vCPU에 영향을 주지 않고 사용할 별도의 대기열과 인터럽트가 있을 수 있습니다.
멀티 큐 기능은 Q35 시스템 유형에 대해 기본적으로 활성화되어 있지만 i440FX 시스템 유형에서 수동으로 활성화해야 합니다. 워크로드에 최적의 대기열 수를 조정할 수 있지만 최적의 수는 각 워크로드 유형에 따라 다르며 경우에 가장 적합한 대기열 수를 테스트해야 합니다.
절차
스토리지 장치에서
다중 큐를 활성화하려면 VM의 XML 구성을 편집합니다.# virsh edit <example_vm>XML 구성에서 의도한 스토리지 장치를 찾고 여러 I/O 대기열을 사용하도록
queues매개변수를 변경합니다. N 을 VM의 vCPU 수(최대 16개)로 바꿉니다.virtio-blk예제:<disk type='block' device='disk'> <driver name='qemu' type='raw' queues='N'/> <source dev='/dev/sda'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk>virtio-scsi예:<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>
- 변경 사항을 적용하려면 VM을 다시 시작합니다.
17.5.4. 전용 IOThreads 구성 링크 복사링크가 클립보드에 복사되었습니다!
VM(가상 머신)에서 디스크의 입력/출력(IO) 성능을 개선하기 위해 VM 디스크의 IO 작업을 관리하는 데 사용되는 전용 IOThread 를 구성할 수 있습니다.
일반적으로 디스크의 IO 작업은 기본 QEMU 스레드의 일부이므로 집중 IO 워크로드 중 VM의 응답성을 줄일 수 있습니다. IO 작업을 전용 IOThread 로 분리하면 VM의 응답성 및 성능을 크게 높일 수 있습니다.
절차
- 실행 중인 경우 선택한 VM을 종료합니다.
호스트에서 VM의 XML 구성에서 <
;iothreads> 태그를 추가하거나 편집합니다. 예를 들어testguest1VM에 대한 단일IOThread를 생성하려면 다음을 수행합니다.# virsh edit <testguest1> <domain type='kvm'> <name>testguest1</name> ... <vcpu placement='static'>8</vcpu> <iothreads>1</iothreads> ... </domain>참고최적의 결과를 얻으려면 호스트에서 CPU당 1-2개의
IOThreads만 사용합니다.VM 디스크에 전용
IOThread'를 할당합니다. 예를 들어 ID가 1인IOThread를testguestVM의 디스크에 할당하려면 다음을 수행합니다.1# virsh edit <testguest1> <domain type='kvm'> <name>testguest1</name> ... <devices> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' io='native' iothread='1'/> <source file='/var/lib/libvirt/images/test-disk.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> </disk> ... </devices> ... </domain>참고IOThreadID는 1에서 시작하며 단일IOThread만 디스크에만 사용해야 합니다.일반적으로 최적의 성능을 위해 VM당 하나의 전용
IOThread로 충분합니다.virtio-scsi스토리지 장치를 사용하는 경우 전용IOThread를virtio-scsi컨트롤러에 할당합니다. 예를 들어 ID가 1인IOThread를testguestVM의 컨트롤러에 할당하려면 다음을 수행합니다.1# virsh edit <testguest1> <domain type='kvm'> <name>testguest1</name> ... <devices> <controller type='scsi' index='0' model='virtio-scsi'> <driver iothread='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/> </controller> ... </devices> ... </domain>
검증
- VM 성능에 대한 변경 사항의 영향을 평가합니다. 자세한 내용은 다음을 참조하십시오. 가상 머신 성능 모니터링 툴
17.5.5. 가상 디스크 캐싱 구성 링크 복사링크가 클립보드에 복사되었습니다!
KVM은 여러 가상 디스크 캐싱 모드를 제공합니다. IIO(Intent Input/Output) 워크로드의 경우 최적의 캐싱 모드를 선택하면 VM(가상 머신) 성능이 크게 증가할 수 있습니다.
+
가상 디스크 캐시 모드 개요
writethrough- 호스트 페이지 캐시는 읽기에만 사용됩니다. 쓰기는 데이터가 스토리지 장치에 커밋된 경우에만 완료된 것으로 보고됩니다. 유지 관리되는 IO 성능은 줄어들지만 이 모드에서는 쓰기가 좋습니다.
writeback-
호스트 페이지 캐시는 읽기 및 쓰기 모두에 사용됩니다. 데이터가 물리적 스토리지가 아닌 호스트의 메모리 캐시에 도달하면 쓰기가 완료된 것으로 보고됩니다. 이 모드는
writethrough보다 IO 성능이 빠르지만 호스트 실패 시 데이터가 손실될 수 있습니다. none- 호스트 페이지 캐시는 완전히 무시됩니다. 이 모드는 물리적 디스크의 쓰기 대기열에 직접 의존하므로 예측 가능한 IO 성능을 갖추고 안정적인 게스트에서 쓰기 보장을 제공합니다. VM 실시간 마이그레이션의 안전한 캐시 모드이기도 합니다.
절차
- 실행 중인 경우 선택한 VM을 종료합니다.
선택한 VM의 XML 구성을 편집합니다.
# virsh edit <vm_name>디스크 장치를 찾아
드라이버태그에서캐시옵션을 편집합니다.<domain type='kvm'> <name>testguest1</name> ... <devices> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' io='native' iothread='1'/> <source file='/var/lib/libvirt/images/test-disk.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> </disk> ... </devices> ... </domain>