2.6. IBM Z 호스트의 RHEL KVM 권장 사항
KVM 가상 서버 환경 최적화는 가상 서버의 워크로드와 사용 가능한 리소스에 따라 크게 달라집니다. 한 환경에서 성능을 개선하는 것과 동일한 조치는 다른 환경에서 부정적인 영향을 미칠 수 있습니다. 특정 설정의 최적의 균형을 찾는 것은 어려운 일이며, 종종 실험이 필요합니다.
다음 섹션에서는 IBM Z 및 LinuxONE 환경에서 RHEL KVM과 함께 OpenShift Container Platform을 사용할 때 몇 가지 모범 사례를 소개합니다.
2.6.1. VirtIO 네트워크 인터페이스에 여러 큐 사용
여러 가상 CPU를 사용하면 들어오고 나가는 패킷에 여러 큐를 제공하는 경우 동시에 패키지를 전송할 수 있습니다. 드라이버
요소의 queues 특성을
사용하여 여러 큐를 구성합니다. 가상 서버의 가상 CPU 수를 초과하지 않는 정수 2를 지정합니다.
다음 예제 사양은 네트워크 인터페이스에 대해 두 개의 입력 및 출력 대기열을 구성합니다.
<interface type="direct"> <source network="net01"/> <model type="virtio"/> <driver ... queues="2"/> </interface>
다중 대기열은 네트워크 인터페이스에 향상된 성능을 제공하도록 설계되었지만 메모리 및 CPU 리소스도 사용합니다. 사용 중인 인터페이스에 사용할 두 개의 큐 정의로 시작합니다. 그런 다음 사용 중인 인터페이스에 대해 트래픽이 적거나 대기열이 2개 이상인 인터페이스에 대해 두 개의 대기열을 시도합니다.
2.6.2. 가상 블록 장치에 I/O 스레드 사용
가상 블록 장치가 I/O 스레드를 사용하도록 하려면 이러한 I/O 스레드 중 하나를 사용하도록 가상 서버 및 각 가상 블록 장치에 대해 하나 이상의 I/O 스레드를 구성해야 합니다.
다음 예제에서는 연속 10진수 스레드 ID 1, 2 및 3을 사용하여 3개의 I /O 스레드를 구성하도록 <iothreads>3<
;/iothreads>를 지정합니다. The iothread"
매개 변수는 ID 2와 함께 I/O 스레드를 사용하도록 디스크 장치의 드라이버 요소를 지정합니다.
I/O 스레드 사양 샘플
... <domain> <iothreads>3</iothreads>1 ... <devices> ... <disk type="block" device="disk">2 <driver ... iothread="2"/> </disk> ... </devices> ... </domain>
스레드는 디스크 장치의 I/O 작업의 성능을 향상시킬 수 있지만 메모리 및 CPU 리소스도 사용합니다. 동일한 스레드를 사용하도록 여러 장치를 구성할 수 있습니다. 스레드를 장치에 가장 잘 매핑하는 방법은 사용 가능한 리소스 및 워크로드에 따라 다릅니다.
소수의 I/O 스레드로 시작합니다. 종종 모든 디스크 장치에 대한 단일 I/O 스레드만으로 충분합니다. 가상 CPU 수보다 많은 스레드를 구성하지 말고 유휴 스레드를 구성하지 마십시오.
virsh iothreadadd
명령을 사용하여 실행 중인 가상 서버에 특정 스레드 ID가 있는 I/O 스레드를 추가할 수 있습니다.
2.6.3. 가상 SCSI 장치 방지
SCSI별 인터페이스를 통해 장치를 해결해야 하는 경우에만 가상 SCSI 장치를 구성합니다. 호스트의 백업과 관계없이 디스크 공간을 가상 SCSI 장치가 아닌 가상 블록 장치로 구성합니다.
그러나 다음을 위해 SCSI 관련 인터페이스가 필요할 수 있습니다.
- 호스트에서 SCSI 연결 테이프 드라이브의 LUN입니다.
- 가상 DVD 드라이브에 마운트된 호스트 파일 시스템의 DVD ISO 파일입니다.
2.6.4. 디스크에 게스트 캐싱 설정
호스트가 아닌 게스트가 캐싱을 수행하도록 디스크 장치를 구성합니다.
디스크 장치의 드라이버 요소에 cache="none" 및
매개변수가 포함되어 있는지 확인합니다.
io="native"
<disk type="block" device="disk"> <driver name="qemu" type="raw" cache="none" io="native" iothread="1"/> ... </disk>
2.6.5. 메모리 증대 장치 제외
동적 메모리 크기가 필요하지 않은 경우 메모리 balloon 장치를 정의하지 말고 libvirt가 사용자를 위해 파일을 생성하지 않도록 합니다. memballoon
매개 변수를 도메인 구성 XML 파일의 devices 요소의 하위 항목으로 포함합니다.
활성 프로파일 목록을 확인합니다.
<memballoon model="none"/>
2.6.6. 호스트 스케줄러의 CPU 마이그레이션 알고리즘 조정
결과를 이해하는 전문가인 경우가 아니면 스케줄러 설정을 변경하지 마십시오. 테스트하지 않고 프로덕션 시스템에 변경 사항을 적용하지 않고 변경 사항을 적용하고 의도한 영향을 미치는지 확인하지 마십시오.
kernel.sched_migration_cost_ns
매개변수는 나노초 단위로 시간 간격을 지정합니다. 작업을 마지막으로 실행한 후에는 이 간격이 만료될 때까지 CPU 캐시에 유용한 콘텐츠가 있는 것으로 간주됩니다. 이 간격을 늘리면 작업 마이그레이션이 줄어듭니다. 기본값은 500000 ns입니다.
실행 가능한 프로세스가 있을 때 CPU 유휴 시간이 예상보다 크면 이 간격을 줄이십시오. CPU 또는 노드 간에 너무 자주 바운싱되는 경우 작업을 늘리십시오.
간격을 60000 ns로 동적으로 설정하려면 다음 명령을 입력합니다.
# sysctl kernel.sched_migration_cost_ns=60000
값을 60000 ns로 영구적으로 변경하려면 /etc/sysctl.conf에 다음 항목을 추가합니다.
kernel.sched_migration_cost_ns=60000
2.6.7. cpuset cgroup 컨트롤러 비활성화
이 설정은 cgroup 버전 1이 있는 KVM 호스트에만 적용됩니다. 호스트에서 CPU 핫플러그를 활성화하려면 cgroup 컨트롤러를 비활성화합니다.
절차
-
선택한 편집기를 사용하여
/etc/libvirt/qemu.conf
를 엽니다. -
cgroup_controllers
행으로 이동합니다. - 전체 행을 복제하고 복사에서 선행 기호(#)를 제거합니다.
다음과 같이
cpuset
항목을 제거합니다.cgroup_controllers = [ "cpu", "devices", "memory", "blkio", "cpuacct" ]
새 설정을 적용하려면 libvirtd 데몬을 다시 시작해야 합니다.
- 모든 가상 시스템을 중지합니다.
다음 명령을 실행합니다.
# systemctl restart libvirtd
- 가상 시스템을 다시 시작합니다.
이 설정은 호스트 재부팅 시 유지됩니다.
2.6.8. 유휴 가상 CPU의 폴링 기간 조정
가상 CPU가 유휴 상태가 되면 KVM은 호스트 리소스를 할당하기 전에 가상 CPU의 시작 조건을 폴링합니다. /sys/module/kvm/parameters/halt_poll_ns
의 sysfs에서 폴링이 발생하는 시간 간격을 지정할 수 있습니다. 지정된 시간 동안 폴링을 수행하면 리소스 사용량을 희생할 때 가상 CPU의 대기 시간이 줄어듭니다. 워크로드에 따라 폴링 시간이 길거나 짧을 수 있습니다. 시간 간격은 나노초 단위로 지정됩니다. 기본값은 50000 ns입니다.
낮은 CPU 소비를 최적화하려면 작은 값을 입력하거나 0을 작성하여 폴링을 비활성화합니다.
# echo 0 > /sys/module/kvm/parameters/halt_poll_ns
트랜잭션 워크로드의 경우 대기 시간이 짧도록 최적화하려면 큰 값을 입력합니다.
# echo 80000 > /sys/module/kvm/parameters/halt_poll_ns