Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
가상화 튜닝 및 최적화 가이드
RHEL에서 호스트 시스템 및 가상화 게스트의 KVM 성능 기능 사용
초록
1장. 소개
1.1. 가상화에서 Performance Optimization Matters를 선택해야 하는 이유
1.2. KVM 성능 아키텍처 개요
- KVM을 사용하는 경우 게스트는 호스트에서 Linux 프로세스로 실행됩니다.
- 가상 CPU(vCPU)는 Linux 스케줄러에서 처리하는 일반 스레드로 구현됩니다.
- 게스트는 커널에서 NUMA 및 대규모 페이지와 같은 기능을 자동으로 상속하지 않습니다.
- 호스트의 디스크 및 네트워크 I/O 설정은 성능에 큰 영향을 미칩니다.
- 네트워크 트래픽은 일반적으로 소프트웨어 기반 브리지를 통해 이동합니다.
- 장치 및 해당 모델에 따라 특정 하드웨어의 에뮬레이션으로 인해 상당한 오버헤드가 발생할 수 있습니다.
1.3. 가상화 성능 기능 및 개선 사항
Red Hat Enterprise Linux 7의 가상화 성능 개선
- 자동 NUMA 분산
- 자동 NUMA 분산은 Red Hat Enterprise Linux 7 게스트에 필요한 수동 튜닝 없이도 NUMA 하드웨어 시스템에서 실행되는 애플리케이션의 성능을 향상시킵니다. 자동 NUMA 분산은 실행 중인 메모리에 더 가깝게 스레드 또는 프로세스일 수 있는 작업을 이동합니다. 이를 통해 제로 구성을 사용하여 우수한 성능을 얻을 수 있습니다. 그러나 경우에 따라 더 정확한 게스트 구성을 제공하거나 CPU 및 메모리에 대한 게스트를 호스트하도록 설정하면 더 나은 결과를 얻을 수 있습니다.자동 NUMA 분산에 대한 자세한 내용은 9.2절. “자동 NUMA 분산” 을 참조하십시오.
- VirtIO 모델
- virtio 모델이 있는 모든 가상 하드웨어에는 모든 특정 항목으로 하드웨어를 에뮬레이션하는 오버헤드가 없습니다. virtio 장치는 가상화 환경에서 사용하도록 특별히 설계되었기 때문에 오버헤드가 낮습니다. 그러나 모든 게스트 운영 체제가 이러한 모델을 지원하는 것은 아닙니다.
- 멀티 큐 virtio-net
- 게스트의 사용 가능한 vCPU 수를 사용하여 패킷 전송/취소 처리를 가능하게 하는 네트워킹 접근 방식입니다.멀티 큐 virtio-net에 대한 자세한 내용은 5.4.2절. “멀티 큐 virtio-net” 을 참조하십시오.
- Bridge Zero Copy Transmit
- 제로 복사 전송 모드는 처리량에 영향을 주지 않고 게스트 네트워크와 외부 네트워크 간에 큰 패킷을 전송하는 호스트 CPU 오버헤드를 최대 15 %까지 줄입니다. 브리지 제로 복사 전송은 Red Hat Enterprise Linux 7 가상 머신에서 완전히 지원되지만 기본적으로 비활성화되어 있습니다.제로 복사 전송에 대한 자세한 내용은 5.4.1절. “Bridge Zero Copy Transmit” 을 참조하십시오.
- APIC 가상화(APICv)
- 최신 Intel 프로세서는 Advanced Programmable Interrupt Controller (APICv)의 하드웨어 가상화를 제공합니다. APICv는 가상화 AMD64 및 Intel 64 게스트 성능을 개선하여 게스트가 APIC에 직접 액세스하여 인터럽트 대기 시간을 크게 줄이고 APIC로 인해 발생하는 가상 머신의 수를 단축할 수 있습니다. 이 기능은 최신 Intel 프로세서에서 기본적으로 사용되며 I/O 성능이 향상됩니다.
- EOISTDOUT
- 가상 APIC 기능 없이 이전 칩셋의 높은 대역폭 I/O에 대한 종단간 가속화.
- 멀티 큐 virtio-scsi
- virtio-scsi 드라이버에서 다중 대기열 지원이 제공하는 스토리지 성능 및 확장성 개선 이를 통해 각 가상 CPU는 다른 vCPU에 영향을 주지 않고 별도의 대기열과 인터럽트를 사용할 수 있습니다.다중 큐 virtio-scsi에 대한 자세한 내용은 7.4.2절. “다중 대기열 virtio-scsi” 을 참조하십시오.
- 반가상화 티켓 잠금
- 반가상화 티켓 잠금(pvticketlocks)은 CPU가 초과 구독된 Red Hat Enterprise Linux 7 호스트에서 실행되는 Red Hat Enterprise Linux 7 게스트 가상 시스템의 성능을 향상시킵니다.
- 반가상화 페이지 Faults
- 호스트에서 스왑 아웃한 페이지에 액세스하려고 할 때 반가상화 페이지 폴트가 게스트에 삽입됩니다. 이렇게 하면 호스트 메모리가 과다 할당되고 게스트 메모리가 스왑 아웃될 때 KVM 게스트 성능이 향상됩니다.
- 반가상화 시간
vsyscall
Optimization - gettimeofday 및 clock_gettime 시스템 호출은
vsyscall
메커니즘을 통해 사용자 공간에서 실행됩니다. 이전에는 이러한 시스템 호출을 실행하여 커널 모드로 전환한 다음 사용자 공간으로 다시 전환해야 했습니다. 따라서 일부 애플리케이션의 성능이 크게 향상됩니다.
Red Hat Enterprise Linux의 가상화 성능 기능
- CPU/커널
- NUMA - NUMA(Non-Uniform Memory Access) NUMA에 대한 자세한 내용은 9장. NUMA 를 참조하십시오.
- CFS - 완전 공정 스케줄러. 최신 클래스 중심 스케줄러입니다.
- RCU - 복사 업데이트 읽기. 공유 스레드 데이터 처리 개선.
- 최대 160개의 가상 CPU(vCPU).
- 메모리
- 대규모 페이지 및 메모리 집약적 환경에 대한 기타 최적화. 자세한 내용은 8장. 메모리 을 참조하십시오.
- 네트워킹
- vhost-net - 빠른 커널 기반 VirtIO 솔루션입니다.
- SR-IOV - 거의 네이티브 네트워킹 성능 수준입니다.
- 블록 I/O
- AIO - 다른 I/O 작업을 겹치는 스레드를 지원합니다.
- MSI - PCI 버스 장치 인터럽트 생성.
- 디스크 I/O 제한 - 호스트 리소스를 과도하게 사용하지 않도록 게스트 디스크 I/O 요청을 제어합니다. 자세한 내용은 7.4.1절. “디스크 I/O Throttling” 을 참조하십시오.
2장. 성능 모니터링 툴
2.1. perf kvm
# yum install perf
/proc/modules
및 /proc/kallsyms
파일에 액세스할 수 있어야 합니다. 절차 2.1. “게스트에서 호스트로 /proc 파일 복사” 를 참조하여 파일을 호스트로 전송하고 파일에서 보고서를 실행합니다.
절차 2.1. 게스트에서 호스트로 /proc 파일 복사
게스트에 로그인하고 파일을 저장합니다.
게스트에 로그인하고 /proc/modules 및
를 임시 위치인/proc
/kallsyms/tmp
에 저장합니다.# cat /proc/modules > /tmp/modules # cat /proc/kallsyms > /tmp/kallsyms
임시 파일을 호스트에 복사
게스트에서 로그아웃한 후 다음 예제 scp 명령을 실행하여 저장된 파일을 호스트에 복사합니다. 호스트 이름과 TCP 포트가 다른 경우 교체해야합니다.# scp root@GuestMachine:/tmp/kallsyms guest-kallsyms # scp root@GuestMachine:/tmp/modules guest-modules
이제 호스트의 게스트(guest-kallsyms
및guest-modules
)의 두 개의 파일이 있어 perf kvm 에서 사용할 수 있습니다.kvm을 사용하여 기록 및 보고 이벤트
이전 단계에서 얻은 파일을 사용하여 게스트, 호스트 또는 둘 다에서 이벤트를 기록하고 보고할 수 있습니다.다음 예제 명령을 실행합니다.# perf kvm --host --guest --guestkallsyms=guest-kallsyms \ --guestmodules=guest-modules record -a -o perf.data
참고명령에 --host 및 --guest 를 모두 사용하면 출력이perf.data.kvm
에 저장됩니다. --host 만 사용하면 파일 이름이perf.data.host
이 됩니다. 마찬가지로 --guest 만 사용하면 파일 이름이perf.data.guest
이 됩니다.Ctrl-C를 누르면 기록이 중지됩니다.보고 이벤트
다음 예제 명령은 기록 프로세스에서 얻은 파일을 사용하고 출력을 새 파일로 리디렉션하고 을분석합니다
.perf kvm --host --guest --guestmodules=guest-modules report -i perf.data.kvm \ --force > analyze
분석
파일의 내용을 보고 기록된 이벤트를 검사합니다.# cat analyze # Events: 7K cycles # # Overhead Command Shared Object Symbol # ........ ............ ................. ......................... # 95.06% vi vi [.] 0x48287 0.61% init [kernel.kallsyms] [k] intel_idle 0.36% vi libc-2.12.so [.] _wordcopy_fwd_aligned 0.32% vi libc-2.12.so [.] __strlen_sse42 0.14% swapper [kernel.kallsyms] [k] intel_idle 0.13% init [kernel.kallsyms] [k] uhci_irq 0.11% perf [kernel.kallsyms] [k] generic_exec_single 0.11% init [kernel.kallsyms] [k] tg_shares_up 0.10% qemu-kvm [kernel.kallsyms] [k] tg_shares_up [output truncated...]
2.2. 가상 성능 모니터링 장치(vPMU)
arch_perfmon
플래그를 확인합니다.
# cat /proc/cpuinfo|grep arch_perfmon
cpu mode
를 host-passthrough
로 지정합니다.
# virsh dumpxml guest_name |grep "cpu mode"
<cpu mode='host-passthrough'>
2.3. 가상 머신 관리자에서 성능 모니터링
2.3.1. 가상 머신 관리자에서 성능 개요 보기
- Virtual Machine Manager 메인 창에서 보려는 가상 머신을 강조 표시합니다.
그림 2.1. 표시할 가상 머신 선택
- 가상 머신 관리자 편집 메뉴에서 가상 머신 세부 정보를 선택합니다.가상 머신 세부 정보 창이 열리면 콘솔이 표시될 수 있습니다. 이러한 상황이 발생하면 보기를 클릭한 다음 세부 정보를 선택합니다. 기본적으로 개요 창이 먼저 열립니다.
- 왼쪽의 탐색 창에서 Performance 를 선택합니다.성능 보기에는 CPU 및 메모리 사용량, 디스크 및 디스크 및 네트워크 입력 및 출력을 포함하여 게스트 성능에 대한 요약이 표시됩니다.
그림 2.2. 게스트 성능 세부 정보 표시
2.3.2. 성능 모니터링
- 편집 메뉴에서 환경 설정을 선택합니다.Preference 창이 나타납니다.
- 폴링 탭의 시간(초) 또는 통계 폴링 옵션을 지정합니다.
그림 2.3. 성능 모니터링 구성
2.3.3. 게스트의 CPU 사용량 표시
- 보기 메뉴에서 그래프 를 선택하고 Guest CPU Usage (게스트 CPU 사용량) 확인란을 선택합니다.
- 가상 머신 관리자는 시스템의 모든 가상 머신에 대한 CPU 사용량 그래프를 보여줍니다.
그림 2.4. 게스트 CPU 사용량 그래프
2.3.4. 호스트의 CPU 사용량 표시
- View (보기) 메뉴에서 Graph, Host CPU Usage (호스트 CPU 사용량) 확인란을 선택합니다.
- 가상 머신 관리자는 시스템의 호스트 CPU 사용량 그래프를 보여줍니다.
그림 2.5. 호스트 CPU 사용량 그래프
2.3.5. 디스크 I/O 표시
- 디스크 I/O 통계 컬렉션이 활성화되어 있는지 확인합니다. 이렇게 하려면 편집 메뉴에서 환경 설정을 선택하고 폴링 탭을 클릭합니다.
- 디스크 I/O 확인란을 선택합니다.
그림 2.6. 디스크 I/O 활성화
- 디스크 I/O 디스플레이를 활성화하려면 View 메뉴에서 Graph, then Disk I/O 확인란을 선택합니다.
- 가상 머신 관리자는 시스템의 모든 가상 머신에 대한 디스크 I/O 그래프를 보여줍니다.
그림 2.7. 디스크 I/O 표시
2.3.6. 네트워크 I/O 표시
- 네트워크 I/O 통계 컬렉션이 활성화되어 있는지 확인합니다. 이렇게 하려면 편집 메뉴에서 환경 설정을 선택하고 폴링탭을 클릭합니다.
- Network I/O 확인란을 선택합니다.
그림 2.8. 네트워크 I/O 활성화
- 네트워크 I/O 통계를 표시하려면 보기 메뉴에서 그래프, 네트워크 I/O 확인란을 선택합니다.
- 가상 머신 관리자는 시스템의 모든 가상 머신에 대한 네트워크 I/O 그래프를 보여줍니다.
그림 2.9. 네트워크 I/O 표시
2.3.7. 메모리 사용량 표시
- 메모리 사용량 통계 컬렉션이 활성화되어 있는지 확인합니다. 이렇게 하려면 편집 메뉴에서 환경 설정을 선택하고 폴링탭을 클릭합니다.
- 메모리 통계 확인란을 선택합니다.
그림 2.10. 메모리 사용량 활성화
- 메모리 사용량을 표시하려면 View (보기) 메뉴에서 Graph, Memory Usage (메모리 사용량) 확인란을 선택합니다.
- 가상 머신 관리자는 시스템의 모든 가상 머신에 대해 사용 중인 메모리의 백분율(MB)을 나열합니다.
그림 2.11. 메모리 사용량 표시
3장. virt-manager로 가상화 성능 최적화
3.1. 운영 체제 세부 정보 및 장치
3.1.1. 게스트 가상 머신 세부 정보 지정
그림 3.1. OS 유형 및 버전 제공

3.1.2. 사용되지 않는 장치 제거
그림 3.2. 사용되지 않는 장치 제거

3.2. CPU 성능 옵션
그림 3.3. CPU 성능 옵션

3.2.1. 옵션: 사용 가능한 CPU
그림 3.4. CPU 과다 할당

3.2.2. 옵션: CPU 구성
그림 3.5. CPU 구성 옵션

3.2.3. 옵션: CPU 토폴로지
그림 3.6. CPU 토폴로지 옵션

3.3. 가상 디스크 성능 옵션
그림 3.7. 가상 디스크 성능 옵션

4장. tuned 및 tuned-adm
virtual-guest
throughput-performance
프로필에 따라virtual-guest
는 가상 메모리의 스왑성도 줄입니다.Red Hat Enterprise Linux 7 게스트 가상 머신을 생성할 때virtual-guest
프로필이 자동으로 선택됩니다. 가상 머신에 권장되는 프로필입니다.이 프로필은 Red Hat Enterprise Linux 6.3 이상에서 사용할 수 있지만 가상 머신을 설치할 때 수동으로 선택해야 합니다.virtual-host
throughput-performance
프로필에 따라virtual-host
를 사용하면 더 공격적으로 더티 페이지 쓰기가 가능합니다. 이 프로필은 KVM 및 RHV(Red Hat Virtualization) 호스트를 모두 포함하여 가상화 호스트에 권장되는 프로필입니다.
tuned
서비스가 활성화됩니다.
# tuned-adm list
Available profiles:
- balanced
- desktop
- latency-performance
- network-latency
- network-throughput
- powersave
- sap
- throughput-performance
- virtual-guest
- virtual-host
Current active profile: throughput-performance
tuned-adm active
tuned-adm profile profile_name
virtual-host
프로필로 전환하려면 다음을 실행합니다.
tuned-adm profile virtual-host
# systemctl enable tuned
# tuned-adm off
# tuned-adm off; systemctl disable tuned
5장. 네트워킹
5.1. 네트워킹 튜닝 팁
- 여러 네트워크를 사용하여 단일 네트워크에서 혼잡을 방지합니다. 예를 들어 관리, 백업 또는 실시간 마이그레이션을 위한 전용 네트워크가 있습니다.
- Red Hat은 동일한 네트워크 세그먼트에서 여러 인터페이스를 사용하지 않는 것이 좋습니다. 그러나 피할 수 없는 경우
arp_filter
를 사용하여 호스트와 게스트 모두에서 발생할 수 있으며, ARP 요청에 응답하는 것이 바람직하지 않은 조건입니다. echo 1 > /proc/sys/net/ipv4/conf/all/arp_filter 또는/
etc/sysctl.conf 를 편집하여 이 설정을 영구적으로 설정합니다.
5.2. virtio 및 vhost_net
그림 5.1. virtio 및 vhost_net 아키텍처

5.3. 장치 할당 및 SR-IOV
그림 5.2. 장치 할당 및 SR-IOV

5.4. Network Tuning Techniques
5.4.1. Bridge Zero Copy Transmit
experimental_zcopytx
커널 모듈 매개변수를 1로 설정합니다. 자세한 내용은 가상화 배포 및 관리 가이드 를 참조하십시오.
experimental_zcopytx
을 0으로 설정하여 복사 전송 모드를 비활성화할 수 있습니다.
5.4.2. 멀티 큐 virtio-net
- 트래픽 패킷은 상대적으로 큽니다.
- 게스트는 게스트 간에 트래픽이 실행되고, 게스트를 외부 시스템으로 또는 게스트 간에 실행되는 동시에 여러 연결에서 활성화됩니다.
- 대기열 수는 vCPU 수와 동일합니다. 이는 멀티 큐가 특정 vCPU에 특정 큐를 개인으로 만들기 위해 RX 인터럽트 선호도 및 TX 대기열 선택을 최적화하기 때문입니다.
5.4.2.1. 다중 대기열 virtio-net 구성
<interface type='network'> <source network='default'/> <model type='virtio'/> <driver name='vhost' queues='N'/> </interface>
# ethtool -L eth0 combined M
5.5. 네트워크 패킷 배치
# ethtool -C $tap rx-frames N
tun
/tap
rx 배치를 지원하려면 다음과 유사한 스니펫을 도메인 XML 파일에 추가합니다.
... <devices> <interface type='network'> <source network='default'/> <target dev='vnet0'/> <coalesce> <rx> <frames max='7'/> </rx> </coalesce> </interface> </devices>
6장. I/O 스케줄링
6.1. 가상화 호스트로 Red Hat Enterprise Linux를 사용한 I/O 스케줄링
데드라인
스케줄러가 이상적입니다. 이 스케줄러는 거의 모든 워크로드에서 제대로 작동합니다.
cfq
스케줄러를 사용하는 것이 유용할 수 있습니다.
6.2. 가상화 게스트로 Red Hat Enterprise Linux를 사용한 I/O 스케줄링
- Red Hat Enterprise Linux 게스트는
noop
스케줄러를 사용하여 많은 이점을 얻을 수 있습니다. 스케줄러는 I/O를 하이퍼바이저로 보내기 전에 게스트 운영 체제의 소규모 요청을 더 큰 요청으로 병합합니다. 이를 통해 하이퍼바이저는 I/O 요청을 보다 효율적으로 처리할 수 있으므로 게스트의 I/O 성능을 크게 향상시킬 수 있습니다. - 워크로드 I/O 및 스토리지 장치를 연결하는 방법에 따라
데드라인
과 같은 스케줄러는noop
보다 더 유용할 수 있습니다. Red Hat은 어떤 스케줄러가 최상의 성능 영향을 미치는지 확인하기 위해 성능 테스트를 권장합니다. - iSCSI, SR-IOV 또는 물리적 장치 패스스루에서 액세스하는 스토리지를 사용하는 게스트는
noop
스케줄러를 사용해서는 안 됩니다. 이러한 방법에서는 호스트가 기본 물리적 장치에 I/O 요청을 최적화할 수 없습니다.
6.2.1. Red Hat Enterprise Linux 7용 I/O 스케줄러 구성
데드라인
입니다. 그러나 Red Hat Enterprise Linux 7 게스트 머신에서는 다음을 수행하여 스케줄러를 noop
로 변경하는 것이 유용할 수 있습니다.
/etc/default/grub
파일에서GRUB_CMDLINE_LINUX
줄의 lift=deadline
문자열을 lift=noop
로 변경합니다.엘레베이터 =
문자열이 없는 경우 줄 끝에lift =noop
를 추가합니다.다음은 성공적인 변경 후/etc/default/grub
파일을 보여줍니다.# cat /etc/default/grub [...] GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=vg00/lvroot rhgb quiet elevator=noop" [...]
/boot/grub2/grub.cfg
파일을 다시 빌드합니다.- BIOS 기반 시스템에서 다음을 수행합니다.
# grub2-mkconfig -o /boot/grub2/grub.cfg
- UEFI 기반 시스템에서 다음을 수행합니다.
# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
7장. 블록 I/O
7.1. 블록 I/O 튜닝
<blkio>
요소에서 게스트 가상 머신의 블록 I/O 매개 변수를 수동으로 설정하거나 표시할 수 있습니다.
<blkio>
매개변수를 표시하려면 다음을 수행합니다.
# virsh blkiotune virtual_machine
<blkio>
매개변수를 설정하려면 virsh blkiotune 명령을 사용하고 환경에 따라 옵션 값을 바꿉니다.
# virsh blkiotune virtual_machine [--weight number] [--device-weights string] [--config] [--live] [--current]
weight
- I/O 가중치는 100~1000 범위입니다.장치의 I/O 가중치를 늘리면 I/O 대역폭에 대한 우선 순위가 증가하므로 더 많은 호스트 리소스를 제공합니다. 마찬가지로 장치의 가중치를 줄이면 호스트 리소스를 덜 소비하게 됩니다.
device-weights
- 하나 이상의 장치/가중 쌍을
/path/to/device
,weight,/path/to/device
,weight 의 형식으로 나열하는 단일 문자열입니다. 각 가중치는 100-1000 범위 내에 있거나 값 0을 사용하여 장치별 목록에서 해당 장치를 제거해야 합니다. 문자열에 나열된 장치만 수정됩니다. 다른 장치에 대한 기존 장치별 가중치는 변경되지 않은 상태로 유지됩니다. config
- 다음 부팅 시 변경 사항을 적용하려면
--config
옵션을 추가합니다. live
--live
옵션을 추가하여 실행 중인 가상 머신 에 변경 사항을 적용합니다.참고--live
옵션을 사용하려면 하이퍼바이저가 이 작업을 지원해야 합니다. 모든 하이퍼바이저가 최대 메모리 제한을 실시간으로 변경할 수 있는 것은 아닙니다.current
--current
옵션을 추가하여 현재 가상 머신 에 변경 사항을 적용합니다.
/dev/sda
장치의 가중치를 500으로 변경합니다.
# virsh blkiotune liftbrul --device-weights /dev/sda, 500
7.2. 캐싱
표 7.1. 캐싱 옵션
캐싱 옵션 | 설명 |
---|---|
cache=none | 게스트의 I/O는 호스트에 캐시되지 않지만 쓰기 디스크 캐시에 보관될 수 있습니다. 대규모 I/O 요구 사항이 있는 게스트에 이 옵션을 사용합니다. 이 옵션은 일반적으로 최상의 선택이며 마이그레이션을 지원하는 유일한 옵션입니다. |
cache=writethrough | 게스트의 I/O는 호스트에 캐시되지만 물리적 미디어를 통해 기록됩니다. 이 모드는 느리고 문제가 발생하기 쉽습니다. I/O 요구 사항이 낮은 수의 게스트에서 가장 적합합니다. 마이그레이션이 필요하지 않은 나중 쓰기 캐시(예: Red Hat Enterprise Linux 5.5 및 이전 버전)를 지원하지 않는 게스트를 위한 것이 좋습니다. |
Cache=writeback | 게스트의 I/O가 호스트에 캐시됩니다. |
cache=directsync | writethrough 과 유사하지만 게스트의 I/O는 호스트 페이지 캐시를 무시합니다. |
Cache=unsafe | 호스트는 모든 디스크 I/O를 캐시할 수 있으며 게스트의 동기화 요청은 무시됩니다. |
Cache=default | 캐시 모드가 지정되지 않은 경우 시스템의 기본 설정이 선택됩니다. |
driver
태그 내부의 cache
설정을 편집하여 캐싱 옵션을 지정합니다. 예를 들어 캐시를 writeback
로 설정하려면 다음을 수행합니다.
<disk type='file' device='disk'> <driver name='qemu' type='raw' cache='writeback'/>
7.3. I/O 모드
표 7.2. IO 모드 옵션
IO 모드 옵션 | 설명 |
---|---|
IO=native | RHV(Red Hat Virtualization) 환경의 기본값입니다. 이 모드는 직접 I/O 옵션을 사용하는 커널 비동기 I/O를 나타냅니다. |
IO=threads | 기본값은 호스트 사용자 모드 기반 스레드입니다. |
IO=default | Red Hat Enterprise Linux 7의 기본값은 스레드 모드입니다. |
io
태그 내의 driver
설정을 편집하여 native
, threads
또는 default
를 지정합니다. 예를 들어 I/O 모드를 threads
로 설정하려면 다음을 수행합니다.
<disk type='file' device='disk'> <driver name='qemu' type='raw' io='threads'/>
7.4. 블록 I/O 튜닝 기술
7.4.1. 디스크 I/O Throttling
# virsh blkdeviotune virtual_machine device --parameter limit
<target dev='name'/>
) 또는 소스 파일(<source file='name'/>
)을 지정합니다. 디스크 장치 이름 목록에 virsh domblk list 명령을 사용합니다.
total-bytes-sec
- 초당 총 처리량 제한(바이트)입니다.
read-bytes-sec
- 읽기 처리량 제한(초당 바이트).
write-bytes-sec
- 쓰기 처리량 제한(초당 바이트).
total-iops-sec
- 초당 총 I/O 작업 제한입니다.
read-iops-sec
- 읽기 I/O 작업 제한 초당 제한입니다.
write-iops-sec
- 초당 쓰기 I/O 작업 제한입니다.
virtual_machine
의 vda
를 초당 1000개의 I/O 작업으로 제한하고 초당 50MB의 I/O 작업을 실행하려면 다음 명령을 실행합니다.
# virsh blkdeviotune virtual_machine vda --total-iops-sec 1000 --total-bytes-sec 52428800
7.4.2. 다중 대기열 virtio-scsi
7.4.2.1. 다중 대기열 virtio-scsi 구성
<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>
8장. 메모리
8.1. 메모리 튜닝 팁
- 사용할 것보다 더 많은 리소스를 게스트에 할당하지 마십시오.
- 가능한 경우 단일 NUMA 노드에 게스트를 할당하여 해당 NUMA 노드에 해당 리소스를 충분히 제공합니다. NUMA 사용에 대한 자세한 내용은 9장. NUMA 을 참조하십시오.
8.2. 가상 머신의 메모리 튜닝
8.2.1. 메모리 모니터링 툴
- top
- vmstat
- numastat
- /proc/
8.2.2. virsh를 사용한 메모리 튜닝
<memtune>
요소를 사용하면 관리자가 게스트 가상 머신 메모리 설정을 수동으로 구성할 수 있습니다. <memtune>
를 생략하면 VM은 VM 생성 중에 할당 및 할당된 방식에 따라 메모리를 사용합니다.
<memtune>
요소에서 virsh memtune 명령을 사용하여 메모리 매개변수를 표시하거나 설정하고 환경에 따라 값을 교체합니다.
# virsh memtune virtual_machine --parameter size
hard_limit
- 가상 시스템에서 사용할 수 있는 최대 메모리(KB 1024바이트)입니다.주의이 제한을 너무 낮게 설정하면 커널에서 가상 시스템이 종료될 수 있습니다.
soft_limit
- 메모리 경합 중에 kibibytes로 강제 실행하기 위한 메모리 제한(24바이트 블록).
swap_hard_limit
- 가상 시스템이 사용할 수 있는 최대 메모리 및 스왑을 kibibytes(24바이트 블록)로 사용할 수 있습니다.
swap_hard_limit
값은hard_limit
값보다 커야 합니다. min_guarantee
- 가상 시스템에 대해 보장된 최소 메모리 할당( kibibytes)입니다(24바이트의 블록).
<memoryBacking>
요소는 호스트 페이지에서 가상 메모리 페이지를 지원하는 방법에 영향을 미치는 여러 요소를 포함할 수 있습니다.
locked
를 설정하면 호스트가 게스트에 속하는 메모리 페이지를 스왑 아웃하지 않습니다. 게스트 XML에 다음을 추가하여 호스트 메모리의 가상 메모리 페이지를 잠급니다.
<memoryBacking> <locked/> </memoryBacking>
locked
를 설정하면 hard_limit
요소에서 게스트에 구성된 최대 메모리와 <memtune>
프로세스 자체에서 사용하는 메모리를 설정해야 합니다.
nosharepages
를 설정하면 호스트가 게스트 간에 사용된 동일한 메모리를 병합하지 않습니다. 하이퍼바이저가 게스트의 공유 페이지를 비활성화하도록 지시하려면 게스트의 XML에 다음을 추가합니다.
<memoryBacking> <nosharepages/> </memoryBacking>
8.2.3. 대규모 페이지 및 투명한 대규모 페이지
8.2.3.1. Transparent Huge Pages 설정
# cat /sys/kernel/mm/transparent_hugepage/enabled
# echo always > /sys/kernel/mm/transparent_hugepage/enabled
이렇게 하면 /sys/kernel/mm/transparent_hugepage/enabled
가 always
로 설정됩니다.
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
8.2.3.2. 정적 대규모 페이지 구성
<memoryBacking> <hugepages/> </memoryBacking>
cat /proc/sys/vm/nr_hugepages
절차 8.1. 대규모 페이지 설정
- 현재 대규모 페이지 값을 확인합니다.
# cat /proc/meminfo | grep Huge AnonHugePages: 2048 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
- 대규모 페이지는 2MB 단위로 설정됩니다. 대규모 페이지 수를 25000으로 설정하려면 다음 명령을 사용합니다.
echo 25000 > /proc/sys/vm/nr_hugepages
참고설정을 영구적으로 설정하려면 게스트 시스템의/etc/sysctl.conf
파일에 다음 행을 추가합니다. X는 의도한 대규모 페이지 수입니다.# echo 'vm.nr_hugepages = X' >> /etc/sysctl.conf # sysctl -p
그런 다음 게스트의/etc/grub2.cfg
파일의/kernel
행 끝에 추가하여transparent_hugepage=never
를 커널 부팅 매개변수에 추가합니다. - 대규모 페이지를 마운트합니다.
# mount -t hugetlbfs hugetlbfs /dev/hugepages
- 가상 머신의 XML 구성의 memoryBacking 섹션에 다음 행을 추가합니다.
<hugepages> <page size='1' unit='GiB'/> </hugepages>
- libvirtd 를 다시 시작합니다.
#
systemctl restart libvirtd - VM을 시작합니다.
#
virsh start virtual_machine - VM이 이미 실행 중인 경우 다시 시작합니다.
#
virsh reset virtual_machine
/proc/meminfo
의 변경 사항을 확인합니다.# cat /proc/meminfo | grep Huge AnonHugePages: 0 kB HugePages_Total: 25000 HugePages_Free: 23425 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
8.2.3.3. 부팅 또는 런타임 시 게스트용 1GB 대규모 페이지 활성화
절차 8.2. 부팅 시 1GB 대규모 페이지 할당
- 부팅 시 다양한 대규모 페이지를 할당하려면 다음 명령을 사용하여 대규모 페이지 수를 지정합니다. 이 예에서는 4개의 1GB 대규모 페이지와 10242MB 대규모 페이지를 할당합니다.
'default_hugepagesz=1G hugepagesz=1G hugepages=4 hugepagesz=2M hugepages=1024'
부팅 시 할당할 다른 수의 대규모 페이지를 지정하려면 이 명령줄을 변경합니다.참고부팅 시 1GB 대규모 페이지를 처음 할당할 때 다음 두 단계를 완료해야 합니다. - 호스트에 2MB 및 1GB 대규모 페이지를 마운트합니다.
# mkdir /dev/hugepages1G # mount -t hugetlbfs -o pagesize=1G none /dev/hugepages1G # mkdir /dev/hugepages2M # mount -t hugetlbfs -o pagesize=2M none /dev/hugepages2M
- 가상 머신의 XML 구성의 memoryBacking 섹션에 다음 행을 추가합니다.
<hugepages> <page size='1' unit='GiB'/> </hugepages>
- libvirtd를 다시 시작하여 게스트에서 1GB 대규모 페이지를 사용할 수 있도록 합니다.
# systemctl restart libvirtd
절차 8.3. 런타임 시 1GB 대규모 페이지 할당
- 런타임 시 다양한 대규모 페이지를 할당하려면 다음 명령을 사용하여 대규모 페이지 수에 대한 값을 교체하고, NUMA 노드는 해당 페이지를 할당하지 않고 대규모 페이지 크기를 지정합니다.
# echo 4 > /sys/devices/system/node/node1/hugepages/hugepages-1048576kB/nr_hugepages # echo 1024 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages
이 예제 명령은node1
에서 4개의 1GB 대규모 페이지와node3
에서 10242MB 대규모 페이지를 할당합니다.이러한 대규모 페이지 설정은 호스트 시스템의 사용 가능한 메모리 크기에 따라 위 명령을 사용하여 언제든지 변경할 수 있습니다.참고다음 두 단계는 런타임에 1GB 대규모 페이지를 처음 할당할 때 완료해야 합니다. - 호스트에 2MB 및 1GB 대규모 페이지를 마운트합니다.
# mkdir /dev/hugepages1G # mount -t hugetlbfs -o pagesize=1G none /dev/hugepages1G # mkdir /dev/hugepages2M # mount -t hugetlbfs -o pagesize=2M none /dev/hugepages2M
- 가상 머신의 XML 구성의 memoryBacking 섹션에 다음 행을 추가합니다.
<hugepages> <page size='1' unit='GiB'/> </hugepages>
- libvirtd를 다시 시작하여 게스트에서 1GB 대규모 페이지를 사용할 수 있도록 합니다.
# systemctl restart libvirtd
8.3. 커널 동일 페이지 병합(KSM)
qemu-kvm
프로세스의 메모리만 상속합니다. 게스트가 실행 중이면 게스트 운영 체제 이미지의 콘텐츠를 게스트가 동일한 운영 체제 또는 애플리케이션을 실행할 때 공유할 수 있습니다. KSM을 사용하면 KVM에서 동일한 게스트 메모리 영역을 공유할 것을 요청할 수 있습니다.
/sys/kernel/mm/ksm/merge_across_nodes
튜닝 가능 항목을 0
로 변경합니다. 이 작업은 virsh node-memory-tune --shm-merge-across-nodes 0 명령을 사용하여 수행할 수 있습니다. 커널 메모리 회계 통계는 대량의 교차 노드 병합 후 결국 서로 모순될 수 있습니다. 따라서 KSM 데몬에서 대량의 메모리를 병합한 후 numad가 혼동될 수 있습니다. 시스템에 사용 가능한 메모리가 많은 경우 KSM 데몬을 끄고 비활성화하여 더 높은 성능을 얻을 수 있습니다. NUMA에 대한 자세한 내용은 9장. NUMA"를 참조하십시오.
ksm
서비스는 KSM 커널 스레드를 시작하고 중지합니다.ksmtuned
서비스는 동일한 페이지 병합을 동적으로 관리하면서ksm
서비스를 제어하고 조정합니다.ksmtuned
는ksm
서비스를 시작하고 메모리 공유가 필요하지 않은 경우ksm
서비스를 중지합니다. 새 게스트가 생성 또는 삭제되면 실행할retune
매개 변수를 사용하여ksmtuned
에 지시합니다.
8.3.1. KSM 서비스
ksm
서비스는 qemu-kvm 패키지에 포함되어 있습니다.ksm
서비스가 시작되지 않으면 KSM(커널 동일한 페이지 병합)은 2000 페이지만 공유합니다. 이 기본값은 제한된 메모리 절감 이점을 제공합니다.ksm
서비스가 시작되면 KSM은 호스트 시스템의 기본 메모리의 절반까지 공유합니다. KSM이 더 많은 메모리를 공유할 수 있도록ksm
서비스를 시작합니다.
# systemctl start ksm
Starting ksm: [ OK ]
ksm
서비스는 기본 시작 시퀀스에 추가할 수 있습니다. systemctl 명령을 사용하여 ksm
서비스를 영구적으로 만듭니다.
# systemctl enable ksm
8.3.2. KSM Tuning Service
ksmtuned
서비스는 ksm
을 반복하고 조정하여 커널 KSM(동적 페이지 병합) 구성을 미세 조정합니다. 또한 게스트 가상 머신이 생성 또는 삭제될 때 libvirt에서 ksmtuned
서비스에 의해 알림을 받습니다. ksmtuned
서비스에는 옵션이 없습니다.
# systemctl start ksmtuned
Starting ksmtuned: [ OK ]
ksmtuned
서비스는 조정 기능을 수동으로 실행하도록 ksmtuned
에 지시하는 retune
매개 변수를 사용하여 조정할 수 있습니다.
/etc/ksmtuned.conf
파일은 ksmtuned
서비스의 구성 파일입니다. 아래의 파일 출력은 기본 ksmtuned.conf
파일입니다.
# Configuration file for ksmtuned. # How long ksmtuned should sleep between tuning adjustments # KSM_MONITOR_INTERVAL=60 # Millisecond sleep between ksm scans for 16Gb server. # Smaller servers sleep more, bigger sleep less. # KSM_SLEEP_MSEC=10 # KSM_NPAGES_BOOST - is added to the `npages` value, when `free memory` is less than `thres`. # KSM_NPAGES_BOOST=300 # KSM_NPAGES_DECAY - is the value given is subtracted to the `npages` value, when `free memory` is greater than `thres`. # KSM_NPAGES_DECAY=-50 # KSM_NPAGES_MIN - is the lower limit for the `npages` value. # KSM_NPAGES_MIN=64 # KSM_NPAGES_MAX - is the upper limit for the `npages` value. # KSM_NPAGES_MAX=1250 # KSM_THRES_COEF - is the RAM percentage to be calculated in parameter `thres`. # KSM_THRES_COEF=20 # KSM_THRES_CONST - If this is a low memory system, and the `thres` value is less than `KSM_THRES_CONST`, then reset `thres` value to `KSM_THRES_CONST` value. # KSM_THRES_CONST=2048 # uncomment the following to enable ksmtuned debug information # LOGFILE=/var/log/ksmtuned # DEBUG=1
/etc/ksmtuned.conf
파일 내에서 npages
는 ksm
d
데몬이 비활성 상태가 되기 전에 ksm이 검사할 페이지 수를 설정합니다. 이 값은 /sys/kernel/mm/ksm/pages_to_scan
파일에도 설정됩니다.
KSM_THRES_CONST
값은 ksm
을 활성화하는 임계값으로 사용되는 사용 가능한 메모리의 양을 나타냅니다. ksmd
는 다음 중 하나가 발생하면 활성화됩니다.
- 사용 가능한 메모리의 양은
KSM_THRES_CONST
에 설정된 임계값 미만으로 감소합니다. - 커밋된 메모리 및 임계값
KSM_THRES_CONST
의 양은 총 메모리 양을 초과합니다.
8.3.3. KSM 변수 및 모니터링
/sys/kernel/mm/ksm/
디렉토리에 저장합니다. 이 디렉터리의 파일은 커널에 의해 업데이트되며 KSM 사용량 및 통계에 대한 정확한 기록입니다.
/etc/ksmtuned.conf
파일의 구성 가능한 변수이기도 합니다.
/sys/kernel/mm/ksm/
에 있는 파일:
- full_scans
- 전체 검사 실행.
- merge_across_nodes
- 여러 NUMA 노드의 페이지를 병합할 수 있는지 여부입니다.
- pages_shared
- 총 페이지 공유.
- pages_sharing
- 현재 공유된 페이지입니다.
- pages_to_scan
- 페이지를 스캔하지 않습니다.
- pages_unshared
- 페이지가 더 이상 공유되지 않습니다.
- pages_volatile
- 휘발성 페이지 수입니다.
- run
- KSM 프로세스가 실행 중인지 여부
- sleep_millisecs
- 수면 밀리초입니다.
# virsh node-memory-tune --shm-pages-to-scan number
DEBUG=1
행이 /etc/ksmtuned.conf
파일에 추가되는 경우 KSM 튜닝 활동이 /var/log/ksmtuned
로그 파일에 저장됩니다. 로그 파일 위치는 LOGFILE
매개변수를 사용하여 변경할 수 있습니다. 로그 파일 위치 변경은 권장되지 않으며 SELinux 설정을 특별한 설정이 필요할 수 있습니다.
8.3.4. KSM 비활성화
ksmtuned
및 ksm
서비스를 중지하여 비활성화할 수 있습니다. 그러나 이 작업은 재시작 후 유지되지 않습니다. KSM을 비활성화하려면 터미널에서 root로 다음을 실행합니다.
# systemctl stop ksmtuned Stopping ksmtuned: [ OK ] # systemctl stop ksm Stopping ksm: [ OK ]
ksmtuned
를 중지하고 ksm
은 KSM이 비활성화되지만, 다시 시작한 후에는 이 작업이 유지되지 않습니다. systemctl 명령을 사용하여 KSM을 영구적으로 비활성화합니다.
# systemctl disable ksm
# systemctl disable ksmtuned
# echo 2 >/sys/kernel/mm/ksm/run
khugepaged
데몬은 KVM 게스트 물리적 메모리에 투명한 hugepages를 다시 빌드할 수 있습니다. # echo 0 >/sys/kernel/mm/ksm/run 을 사용하면 KSM이 중지되지만 이전에 생성된 모든 KSM 페이지를 공유 해제하지는 않습니다 (이는 # systemctl stop ksmtuned 명령과 동일).
9장. NUMA
9.1. NUMA 메모리 할당 정책
Strict
- 엄격한 정책이란 대상 노드에 메모리를 할당할 수 없는 경우 할당이 실패했음을 의미합니다.메모리 모드 속성을 정의하지 않고 NUMA 노드 세트 목록을 지정하는 기본값은
strict
모드입니다. Interleave
- 메모리 페이지는 노드 세트에서 지정한 노드 간에 할당되지만 라운드 로빈 방식으로 할당됩니다.
Preferred
- 메모리는 하나의 기본 메모리 노드에서 할당됩니다. 충분한 메모리를 사용할 수 없는 경우 다른 노드에서 메모리를 할당할 수 있습니다.
memory mode>
; 요소의 값으로 설정합니다.
<numatune> <memory mode='preferred' nodeset='0'> </numatune>
strict
모드에서 메모리를 과다 할당하고 게스트에 충분한 스왑 공간이 없는 경우 커널은 일부 게스트 프로세스를 종료하여 추가 메모리를 검색합니다. 이 상황을 방지하기 위해 preferred
할당 사용 및 단일 노드 세트(예: nodeset='0')를 사용하는 것이 좋습니다.
9.2. 자동 NUMA 분산
- 프로세스 메모리의 주기적인 NUMA 매핑
- NUMA 힌트 오류
- migrate-on-Fault (MoF) - 메모리를 실행하는 위치로 이동합니다.
- task_numa_placement - 실행중인 프로그램을 메모리에 더 가깝게 이동합니다.
9.2.1. 자동 NUMA 분산 구성
- # numactl --hardware 는 여러 노드를 표시
- # cat /proc/sys/kernel/numa_balancing s
1
# echo 0 > /proc/sys/kernel/numa_balancing
# echo 1 > /proc/sys/kernel/numa_balancing
9.3. libvirt NUMA 튜닝
# numastat -c qemu-kvm
Per-node process memory usage (in MBs)
PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
51722 (qemu-kvm) 68 16 357 6936 2 3 147 598 8128
51747 (qemu-kvm) 245 11 5 18 5172 2532 1 92 8076
53736 (qemu-kvm) 62 432 1661 506 4851 136 22 445 8116
53773 (qemu-kvm) 1393 3 1 2 12 0 0 6702 8114
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
Total 1769 463 2024 7462 10037 2672 169 7837 32434
# numastat -c qemu-kvm
Per-node process memory usage (in MBs)
PID Node 0 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Node 7 Total
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
51747 (qemu-kvm) 0 0 7 0 8072 0 1 0 8080
53736 (qemu-kvm) 0 0 7 0 0 0 8113 0 8120
53773 (qemu-kvm) 0 0 7 0 0 0 1 8110 8118
59065 (qemu-kvm) 0 0 8050 0 0 0 0 0 8051
--------------- ------ ------ ------ ------ ------ ------ ------ ------ -----
Total 0 0 8072 0 8072 0 8114 8110 32368
-c
를 사용하여 numastat 를 실행하면 컴팩트 출력을 제공합니다. -m
옵션을 추가하면 노드별로 시스템 전체 메모리 정보가 출력에 추가됩니다. 자세한 내용은 numastat man 페이지를 참조하십시오.
9.3.1. 호스트 NUMA 노드당 메모리 모니터링
nodestats.py
스크립트를 사용하여 호스트의 각 NUMA 노드에 대한 총 메모리 및 사용 가능한 메모리를 보고할 수 있습니다. 이 스크립트는 또한 실행 중인 각 도메인의 특정 호스트 노드에 엄격하게 바인딩된 메모리 양을 보고합니다. 예를 들어 다음과 같습니다.
# /usr/share/doc/libvirt-python-2.0.0/examples/nodestats.py
NUMA stats
NUMA nodes: 0 1 2 3
MemTotal: 3950 3967 3937 3943
MemFree: 66 56 42 41
Domain 'rhel7-0':
Overall memory: 1536 MiB
Domain 'rhel7-1':
Overall memory: 2048 MiB
Domain 'rhel6':
Overall memory: 1024 MiB nodes 0-1
Node 0: 1024 MiB nodes 0-1
Domain 'rhel7-2':
Overall memory: 4096 MiB nodes 0-3
Node 0: 1024 MiB nodes 0
Node 1: 1024 MiB nodes 1
Node 2: 1024 MiB nodes 2
Node 3: 1024 MiB nodes 3
MemTotal
)에 포함합니다. 각 도메인(MemFree
)에서 거의 모든 메모리가 사용됩니다. 실행 중인 네 개의 도메인(가상 시스템)이 있습니다. 'rhel7-0' 에는 특정 호스트 NUMA 노드에 고정되어 있지 않은 1.5GB 메모리가 있습니다. 그러나 도메인 'rhel7-2' 에는 호스트 노드에 1:1 고정되는 4GB 메모리와 4개의 NUMA 노드가 있습니다.
nodestats.py
스크립트를 만듭니다. 예제 스크립트는 /usr/share/doc/libvirt-python-version/examples/nodestats.py
에서 libvirt-python 패키지 파일을 찾을 수 있습니다. rpm -ql libvirt-python 명령을 사용하여 스크립트의 특정 경로를 표시할 수 있습니다.
9.3.2. NUMA vCPU 고정
<vcpu cpuset='0-7'>8</vcpu> <cputune> <vcpupin vcpu='0' cpuset='0'/> <vcpupin vcpu='1' cpuset='1'/> <vcpupin vcpu='2' cpuset='2'/> <vcpupin vcpu='3' cpuset='3'/> <vcpupin vcpu='4' cpuset='4'/> <vcpupin vcpu='5' cpuset='5'/> <vcpupin vcpu='6' cpuset='6'/> <vcpupin vcpu='7' cpuset='7'/> </cputune>
<vcpupin>
을 보여줍니다. 따라서 상위 태그 <vcpu>
에 지정된 대로 vCPU5 가 물리적 CPU 0-7에 고정됩니다.
<vcpu cpuset='0-7'>8</vcpu> <cputune> <vcpupin vcpu='0' cpuset='0'/> <vcpupin vcpu='1' cpuset='1'/> <vcpupin vcpu='2' cpuset='2'/> <vcpupin vcpu='3' cpuset='3'/> <vcpupin vcpu='4' cpuset='4'/> <vcpupin vcpu='6' cpuset='6'/> <vcpupin vcpu='7' cpuset='7'/> </cputune>
<vcpupin>
, <numatune>
, <emulatorpin>
은 최적의 결정적 성능을 발휘하려면 함께 구성해야 합니다. <numatune>
태그에 대한 자세한 내용은 9.3.3절. “도메인 프로세스” 를 참조하십시오. <emulatorpin>
태그에 대한 자세한 내용은 9.3.6절. “emulatorpin 사용” 를 참조하십시오.
9.3.3. 도메인 프로세스
<numatune>
태그 내부에서 이를 구성하는 방법에 대한 예는 다음 XML 구성을 참조하십시오.
<numatune> <memory mode='strict' placement='auto'/> </numatune>
<numatune> <memory mode='strict' nodeset='0,2-3'/> </numatune>
<vcpu>
태그 내부에서 이를 구성하는 방법에 대한 예는 다음 XML 구성을 참조하십시오.
<vcpu placement='auto'>8</vcpu>
<vcpu placement='static' cpuset='0-10,ˆ5'>8</vcpu>
<vcpu>
과 <numatune>
에 사용하는 배치 모드 사이에는 암시적 상속 규칙이 있습니다.
<numatune>
의 배치 모드는 기본적으로 동일한 배치 모드인<vcpu>
또는<nodeset>
가 지정된 경우 static 으로 설정됩니다.- 마찬가지로
<vcpu>
의 배치 모드는 기본적으로<numatune>
의 동일한 배치 모드 또는<cpuset>
가 지정된 경우 static 으로 설정됩니다.
<vcpu placement='auto' current='8'>32</vcpu>
9.3.4. 도메인 vCPU 스레드
<cputune>
태그 내의 각 vcpu 스레드에 대한 고정 정책을 설정합니다.
<cputune> <vcpupin vcpu="0" cpuset="1-4,ˆ2"/> <vcpupin vcpu="1" cpuset="0,1"/> <vcpupin vcpu="2" cpuset="2,3"/> <vcpupin vcpu="3" cpuset="0,4"/> </cputune>
<cputune>
에 대한 자세한 내용은 다음 URL을 참조하십시오. http://libvirt.org/formatdomain.html#elementsCPUTuning
4 available nodes (0-3) Node 0: CPUs 0 4, size 4000 MiB Node 1: CPUs 1 5, size 3999 MiB Node 2: CPUs 2 6, size 4001 MiB Node 3: CPUs 0 4, size 4005 MiB
<cputune> <vcpupin vcpu="0" cpuset="1"/> <vcpupin vcpu="1" cpuset="5"/> <vcpupin vcpu="2" cpuset="2"/> <vcpupin vcpu="3" cpuset="6"/> </cputune> <numatune> <memory mode="strict" nodeset="1-2"/> </numatune> <cpu> <numa> <cell id="0" cpus="0-1" memory="3" unit="GiB"/> <cell id="1" cpus="2-3" memory="3" unit="GiB"/> </numa> </cpu>
9.3.5. 캐시 할당 기술을 사용하여 성능 개선
cachetune
태그 내에 vCPU 캐시 할당을 구성하는 방법에 대한 예는 다음 XML 구성을 참조하십시오.
<domain> <cputune> <cachetune vcpus='0-1'> <cache id='0' level='3' type='code' size='3' unit='MiB'/> <cache id='0' level='3' type='data' size='3' unit='MiB'/> </cachetune> </cputune> </domain>
<cachetune>
요소가 있을 수 있습니다.
libvirt
문서의 cachetune
를 참조하십시오.
9.3.6. emulatorpin 사용
<cputune>
내부에서 <emulatorpin>
태그를 사용하는 것입니다.
<emulatorpin>
태그는 에뮬레이터 가 고정되는 물리적 CPU(vCPU를 포함하지 않는 도메인의 하위 집합)를 지정합니다. <emulatorpin>
태그는 에뮬레이터 스레드 프로세스에 정확한 선호도를 설정하는 방법을 제공합니다. 결과적으로 vhost 스레드는 물리적 CPU 및 메모리의 동일한 서브 세트에서 실행되므로 캐시 locality를 활용할 수 있습니다. 예를 들면 다음과 같습니다.
<cputune> <emulatorpin cpuset="1-3"/> </cputune>
<emulatorpin>
를 수동으로 튜닝할 필요가 줄어듭니다. 자동 NUMA 분산에 대한 자세한 내용은 9.2절. “자동 NUMA 분산” 을 참조하십시오.
9.3.7. virsh를 사용하여 vCPU 고정 조정
% virsh vcpupin rhel7 1 2
% virsh vcpupin rhel7
9.3.8. virsh를 사용하여 도메인 프로세스 CPU 고정 조정
emulatorpin
옵션은 CPU 선호도 설정을 각 도메인 프로세스와 연결된 스레드에 적용합니다. 완전한 고정을 위해 이전에 표시된 것처럼 virsh vcpupin 과 각 게스트에 대해 virsh emulatorpin 을 모두 사용해야합니다. 예를 들어 다음과 같습니다.
% virsh emulatorpin rhel7 3-4
9.3.9. virsh를 사용하여 도메인 프로세스 메모리 정책 조정
% virsh numatune rhel7 --nodeset 0-10
9.3.10. 게스트 NUMA 토폴로지
<cpu>
태그 내에서 <numa>
태그를 사용하여 게스트 NUMA 토폴로지를 지정할 수 있습니다. 다음 예제를 확인하고 그에 따라 값을 바꿉니다.
<cpu> ... <numa> <cell cpus='0-3' memory='512000'/> <cell cpus='4-7' memory='512000'/> </numa> ... </cpu>
<cell>
요소는 NUMA 셀 또는 NUMA 노드를 지정합니다. cpus
노드의 일부인 CPU의 CPU 또는 범위를 지정하고 memory
는 노드 메모리를 kibibytes (24바이트 블록)로 지정합니다. 각 셀 또는 노드에는 0부터 시작하는 순서에 따라 cellid
또는 nodeid
가 할당됩니다.
9.3.11. PCI 장치용 NUMA 노드 위치
/sys/devices/pci*/*/numa_node
의 sysfs
파일에 표시됩니다. 이러한 설정을 확인하는 한 가지 방법은 lstopo 도구를 사용하여 sysfs
데이터를 보고하는 것입니다.
# lstopo-no-graphics
Machine (126GB)
NUMANode L#0 (P#0 63GB)
Socket L#0 + L3 L#0 (20MB)
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 + PU L#0 (P#0)
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 + PU L#1 (P#2)
L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 + PU L#2 (P#4)
L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 + PU L#3 (P#6)
L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 + PU L#4 (P#8)
L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 + PU L#5 (P#10)
L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6 + PU L#6 (P#12)
L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7 + PU L#7 (P#14)
HostBridge L#0
PCIBridge
PCI 8086:1521
Net L#0 "em1"
PCI 8086:1521
Net L#1 "em2"
PCI 8086:1521
Net L#2 "em3"
PCI 8086:1521
Net L#3 "em4"
PCIBridge
PCI 1000:005b
Block L#4 "sda"
Block L#5 "sdb"
Block L#6 "sdc"
Block L#7 "sdd"
PCIBridge
PCI 8086:154d
Net L#8 "p3p1"
PCI 8086:154d
Net L#9 "p3p2"
PCIBridge
PCIBridge
PCIBridge
PCIBridge
PCI 102b:0534
GPU L#10 "card0"
GPU L#11 "controlD64"
PCI 8086:1d02
NUMANode L#1 (P#1 63GB)
Socket L#1 + L3 L#1 (20MB)
L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8 + PU L#8 (P#1)
L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9 + PU L#9 (P#3)
L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10 + PU L#10 (P#5)
L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11 + PU L#11 (P#7)
L2 L#12 (256KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12 + PU L#12 (P#9)
L2 L#13 (256KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13 + PU L#13 (P#11)
L2 L#14 (256KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14 + PU L#14 (P#13)
L2 L#15 (256KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15 + PU L#15 (P#15)
HostBridge L#8
PCIBridge
PCI 1924:0903
Net L#12 "p1p1"
PCI 1924:0903
Net L#13 "p1p2"
PCIBridge
PCI 15b3:1003
Net L#14 "ib0"
Net L#15 "ib1"
OpenFabrics L#16 "mlx4_0"
- NIC
em*
및 디스크sd*
는 NUMA 노드 0에 연결되고, 코어 0,2,4,6,8,10,12,14입니다. - NIC
p1*
및ib*
는 NUMA 노드 1 및 코어 1,3,5,7,9,11,13,15에 연결되어 있습니다.
9.4. NUMA-Aware Kernel SamePage Merging (KSM)
sysfs /sys/kernel/mm/ksm/merge_across_nodes
매개변수를 사용하여 다른 NUMA 노드에서 페이지 병합을 제어합니다. 기본적으로 모든 노드의 페이지를 함께 병합할 수 있습니다. 이 매개변수를 0으로 설정하면 동일한 노드의 페이지만 병합됩니다.
<memoryBacking> <nosharepages/> </memoryBacking>
<memoryBacking>
요소를 사용하여 메모리 설정을 조정하는 방법에 대한 자세한 내용은 8.2.2절. “virsh를 사용한 메모리 튜닝” 를 참조하십시오.
부록 A. 개정 내역
고친 과정 | |||
---|---|---|---|
고침 1.0-35 | Thus May 23 2019 | Jiri Herrmann | |
| |||
고침 1.0-34 | Tue Oct 25 2018 | Jiri Herrmann | |
| |||
고침 1.0-32 | Tue Aug 14 2018 | Jiri Herrmann | |
| |||
고침 1.0-31 | Wed Apr 4 2018 | Jiri Herrmann | |
| |||
고침 1.0-27 | Mon Jul 27 2017 | Jiri Herrmann | |
| |||
고침 1.0-24 | Mon Oct 17 2016 | Jiri Herrmann | |
| |||
고침 1.0-22 | Mon Dec 21 2015 | Laura Novich | |
| |||
고침 1.0-19 | Thu Oct 08 2015 | Jiri Herrmann | |
|