RHEL 10 for Real Time에서 가상화 구성
RHEL for Real Time 호스트에 가상 머신 설치 및 테스트
초록
Red Hat 문서에 관한 피드백 제공
문서 개선을 위한 의견에 감사드립니다. 어떻게 개선할 수 있는지 알려주십시오.
Jira를 통해 피드백 제출 (계정 필요)
- Jira 웹 사이트에 로그인합니다.
- 상단 탐색 바에서 생성을 클릭합니다.
- 요약 필드에 설명 제목을 입력합니다.
- 설명 필드에 개선을 위한 제안을 입력합니다. 문서의 관련 부분에 대한 링크를 포함합니다.
- 대화 상자 하단에서 생성 을 클릭합니다.
1장. RHEL for Real Time의 가상화 기능
Red Hat은 실시간 워크로드에서 VM(가상 머신)을 사용하기 위해 RHEL for Real Time의 가상화 기능을 제공합니다.
RHEL for Real Time에서는 VM에 대해 대기 시간이 짧고 결정적인 동작을 수행하도록 호스트 및 게스트 운영 체제를 구성할 수 있습니다. 이를 통해 산업 자동화, 통신 및 자전 시스템과 같은 실시간 성능이 필요한 애플리케이션에 실시간 VM이 더 적합하게 됩니다.
실시간 RHEL 시스템 사용의 이점에 대한 자세한 내용은 대기 시간을 최적화하는 RHEL for Real Time 을 참조하십시오.
2장. 실시간 가상화를 위한 호스트 시스템 요구 사항
실시간 VM을 호스팅하려면 RHEL 10 시스템이 다음 요구 사항을 충족해야 합니다.
실시간 커널
RHEL 10 호스트를 실시간 시스템으로 구성하려면 실시간 커널을 설치해야 합니다. 자세한 내용은 실시간 RHEL 설치를 참조하십시오.
또한 호스트에
tuned-profiles-nfv
를 설치해야 합니다.dnf install tuned-profiles-nfv
# dnf install tuned-profiles-nfv
Copy to Clipboard Copied! 가상화
RHEL 10 가상화 패키지가 호스트에 설치되어 있어야 합니다. 자세한 내용은 가상화 활성화를 참조하십시오.
BIOS
실시간 가상 머신을 성공적으로 배포하고 실행하려면 호스트의 시스템 BIOS를 최소 대기 시간을 구성해야 합니다. 이렇게 하려면 호스트 시스템의 하드웨어 모델에 특정한 지침을 따르십시오. 예를 들면 다음과 같습니다.
- Dell의 경우 대기 시간이 짧은 Dell PowerEdge 서버 구성을참조하십시오.
- HP의 경우 대기 시간이 짧은 애플리케이션에 대한 HPE Cryostat 서버 구성 및 튜닝을 참조하십시오.
대기 시간이 짧은 특정 설정은 벤더와 모델에 따라 다르지만 일반적으로 대기 시간을 최소화하기 위한 단계는 다음과 같습니다.
- 고급 하드웨어 전원 관리 옵션을 비활성화합니다. 이를 통해 다양한 특정 전원 관리 측면을 보다 효과적으로 제어할 수 있지만 대기 시간이 급증할 수도 있습니다.
C-states 또는 C1E와 같은 더 낮은 CPU 전원 상태를 비활성화합니다.
중요대기 시간이 짧은 BIOS 가이드에서는 가상화를 비활성화하는 것이 좋습니다. 그러나 실시간 VM이 호스트에서 제대로 작동하려면 이 단계를 건너뛰어야 합니다.
3장. 실시간 가상 머신의 호스트 환경 구성
RHEL 10이 실시간 가상 머신의 호스트로 작동할 수 있도록 하려면 호스트의 성능을 최적화하고 입력과 시스템 응답 사이의 대기 시간을 테스트해야 합니다.
3.1. 실시간 가상화 호스트에 대한 TuneD 구성
RHEL 10 시스템을 실시간 VM(가상 머신)의 호스트로 최적화하려면 TuneD에 대해 realtime-virtual-host
프로필을 구성하고 활성화합니다.
사전 요구 사항
- 호스트가 실시간 가상화에 대한 시스템 요구 사항을 충족합니다.
irqbalance
서비스가 비활성화되어 있습니다.irqbalance
가 활성화된 경우 IRQ(Interrupt 요청) 처리가 TuneD와 충돌할 수 있습니다.irqbalance
를 비활성화하려면 다음을 수행합니다.systemctl stop irqbalance && systemctl disable irqbalance
# systemctl stop irqbalance && systemctl disable irqbalance
Copy to Clipboard Copied!
프로세스
-
TuneD에 대한
realtime-virtual-host
프로필의 구성 편집을 시작합니다. 이렇게 하려면 텍스트 편집기에서/etc/tuned/realtime-virtual-host-variables.conf
파일을 엽니다. 요구 사항에 맞게
/etc/tuned/realtime-virtual-host-variables.conf
의 구성을 조정합니다. 특히 설정에서 다음 요소를 고려하십시오.- 시스템에 있는 코어 및 NUMA 노드 수
- 실행할 RT 게스트 수
- 각 RT 게스트가 보유할 vCPU 수
/etc/tuned/realtime-virtual-host-variables.conf
에 대한 가장 중요한 수정 사항은 다음과 같습니다.isolated_cores
매개변수를 업데이트하여 RT 가상화 작업에 전용되는 소켓당 호스트 코어와 호스트에서 시스템 유지 관리를 위해 남아 있는 코어를 조정합니다(또한 하우스키핑이라고도 함).예를 들어 다음 설정은 RT 작업에 코어 3, 코어 6 및 코어 8~15를 사용하고 다른 모든 코어는 하우스키핑으로 사용합니다.
isolated_cores=3,6,8-15
isolated_cores=3,6,8-15
Copy to Clipboard Copied! 기본적으로 소켓당 하나의 코어(코어 0)가 하우스키핑 및 RT 작업의 기타 모든 코어에 사용됩니다.
중요코어 0은 항상 하우스키핑 코어로 설정해야 합니다. RT 작업에 코어 0을 사용하면 RT 기능이 중단됩니다.
커널 관리 IRQ에 대해 IRQ 격리를 활성화합니다. 이렇게 하려면 구성에서 다음 행을 주석 처리하지 않았는지 확인합니다.
isolate_managed_irq=Y
isolate_managed_irq=Y
Copy to Clipboard Copied! IRQ 격리가 비활성화된 경우 호스트 커널 관리 IRQ는 분리된 코어를 중단할 수 있으므로 예기치 않은 대기 시간이 발생할 수 있습니다.
-
netdev_queue_count
매개변수의 주석을 제거하고 해당 값을 하우스키핑 코어 수로 설정합니다.
-
/etc/tuned/realtime-virtual-host-variables.conf
에 변경 사항을 저장합니다. 실시간 가상 호스트 프로필을 활성화합니다.
tuned-adm profile realtime-virtual-host
# tuned-adm profile realtime-virtual-host
Copy to Clipboard Copied! - 호스트를 다시 시작합니다.
3.2. 실시간 가상화 호스트를 위한 대규모 페이지 구성
RHEL 10의 VM(가상 머신)의 대기 시간을 추가로 줄이려면 대규모 메모리 페이지를 사용하도록 호스트를 설정합니다. 대규모 페이지는 대용량 메모리를 사용하는 애플리케이션의 성능을 크게 향상시킬 수 있으며 이는 일반적으로 RT 애플리케이션의 경우입니다.
대규모 페이지에 대한 자세한 내용은 대규모 페이지 구성을 참조하십시오.
사전 요구 사항
- 호스트가 실시간 가상화에 대한 시스템 요구 사항을 충족합니다.
- 실시간 VM 호스트에 대해 TuneD를 구성했습니다. 자세한 내용은 실시간 가상화 호스트에 대한 TuneD 구성을 참조하십시오.
프로세스
기본 대규모 페이지 크기를 1GB로 설정합니다.
grubby --args "default_hugepagesz=1G" --update-kernel ALL
$ grubby --args "default_hugepagesz=1G" --update-kernel ALL
Copy to Clipboard Copied! 호스트에서 대규모 페이지를 예약합니다.
echo <X> > /sys/devices/system/node/node_<Y>_/hugepages/<hugepages-size_dir>/nr-hugepages
$ echo <X> > /sys/devices/system/node/node_<Y>_/hugepages/<hugepages-size_dir>/nr-hugepages
Copy to Clipboard Copied! 이 명령에서 다음과 같이 변수를 교체합니다.
- 예약할 대규모 페이지 수와 함께 <x>. 이 값은 VM 수와 메모리 양에 따라 달라집니다. 단일 VM을 실행하는 경우 두 개의 1GB 페이지로 시작합니다.
- 실시간 vCPU 가 고정된 NUMA 노드 수가 <Y >입니다.
-
<hugepage-size_dir >은 kB에서 Huge Page 크기가 있습니다. 예를 들어, 2MB hugepages의 경우
hugepages-2048kB
입니다.
중요이 명령은 대규모 페이지를 일시적으로 설정합니다. 따라서 실시간 VM을 시작하기 전에 호스트를 재부팅할 때마다 명령을 사용해야 합니다. 이를 방지하려면 대규모 페이지를 영구적으로 만드는 다음 선택적 단계를 수행합니다.
선택 사항: huge-page 구성을 영구적으로 만들려면 다음을 수행합니다.
다음 콘텐츠를 사용하여
/usr/lib/systemd/system/hugetlb-gigantic-pages.service
라는 파일을 만듭니다.[Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=default_hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/systemd/hugetlb-reserve-pages [Install] WantedBy=sysinit.target
[Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=default_hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/systemd/hugetlb-reserve-pages [Install] WantedBy=sysinit.target
Copy to Clipboard Copied! 다음 콘텐츠를 사용하여
/usr/lib/systemd/hugetlb-reserve-pages
파일을 만듭니다.This example reserves 2 1G pages on node0 and 1 1G page on node1. You can modify it to your needs or add more lines to reserve memory in other nodes. Don't forget to uncomment the lines, otherwise then won't be executed. reserve_pages 2 node0 reserve_pages 1 node1
#!/bin/bash nodes_path=/sys/devices/system/node/ if [ ! -d $nodes_path ]; then echo "ERROR: $nodes_path does not exist" exit 1 fi reserve_pages() { echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages } # This example reserves 2 1G pages on node0 and 1 1G page on node1. You # can modify it to your needs or add more lines to reserve memory in # other nodes. Don't forget to uncomment the lines, otherwise then won't # be executed. # reserve_pages 2 node0 # reserve_pages 1 node1
Copy to Clipboard Copied! 다음 명령을 사용하여 초기 부팅 예약을 활성화합니다.
chmod +x /usr/lib/systemd/hugetlb-reserve-pages sudo systemctl enable hugetlb-gigantic-pages sudo systemctl status hugetlb-gigantic-pages
$ chmod +x /usr/lib/systemd/hugetlb-reserve-pages $ sudo systemctl enable hugetlb-gigantic-pages $ sudo systemctl status hugetlb-gigantic-pages
Copy to Clipboard Copied! -
/usr/lib/systemd/hugetlb-reserve-pages
의 하위 두 줄의 주석을 제거하고 대규모 페이지 예약 요구 사항에 따라 업데이트합니다.
- 재부팅하여 모든 구성 변경 사항을 적용합니다.
3.3. 실시간 가상화를 위한 호스트 BIOS 설정 확인
대기 시간이 짧은 워크로드에 대해 실시간 호스트의 BIOS가 성공적으로 설정되었는지 확인하려면 hwlatdetect
프로그램을 사용합니다.
사전 요구 사항
-
실시간 가상 머신 호스트에 맞게
tuned
를 구성했습니다. 자세한 내용은 실시간 가상화 호스트에 대한 TuneD 구성을 참조하십시오. - 실시간 가상화에 사용할 대규모 메모리 페이지를 설정했습니다. 자세한 내용은 실시간 가상화 호스트에 대한 대규모 페이지 구성 을 참조하십시오.
프로세스
HW
ladetect
유틸리티를 1시간 이상 실행하고 측정된 대기 시간이 1 마이크로초(second)를 초과하지 않는지 확인합니다.hwlatdetect --threshold=1μs –duration=60m
# hwlatdetect --threshold=1μs –duration=60m hwlatdetect: test duration 60 minutes parameters: Latency threshold: 1μs Sample window: 1000000μs Sample width: 500000μs Non-sampling period: 500000μs Output File: None Starting test test finished Max Latency: 0us Samples recorded: 0 Samples exceeding threshold: 0
Copy to Clipboard Copied! 선택 사항: 검증 향상을 위해 24시간 동안 동일한 테스트를 실행합니다.
hwlatdetect --threshold=1μs –duration=24h
# hwlatdetect --threshold=1μs –duration=24h
Copy to Clipboard Copied!
3.4. 실시간 가상화 호스트 환경 확인
실시간 VM(가상 머신)에 대한 호스트를 구성한 후 올바르게 설정되었는지 확인해야 합니다. 이렇게 하려면 커널, 대규모 페이지 및 격리된 CPU의 설정을 확인하고 TuneD 프로필이 활성화되어 있는지 확인합니다.
사전 요구 사항
-
실시간 VM에 맞게
tuned
를 구성했습니다. 자세한 내용은 실시간 가상화 호스트에 대한 TuneD 구성을 참조하십시오. - 실시간 가상화에 사용할 대규모 메모리 페이지를 설정했습니다. 자세한 내용은 실시간 가상화 호스트에 대한 대규모 페이지 구성 을 참조하십시오.
프로세스
/proc/cmdline
파일의 내용을 보고 다음 매개변수의 값이 구성 방법과 일치하는지 확인합니다.- 실시간 커널
- Huge Page
분리된 CPU
예를 들면 다음과 같습니다.
cat /proc/cmdline BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-70.13.1.rt21.83.el10_0.x86_64 root=/dev/mapper/rhel_virtlab505-root ro crashkernel=auto resume=/dev/mapper/rhel_virtlab505-swap rd.lvm.lv=rhel_virtlab505/root rd.lvm.lv=rhel_virtlab505/swap console=ttyS1,115200 default_hugepages=1G skew_tick=1 isolcpus=1,3,5,7,9,11,13,14,15 intel_pstate=disable nosoftlockup tsc=nowatchdog nohz=on nohz_full=1,3,5,7,9,11,13,14,15 rcu_nocbs=1,3,5,7,9,11,13,14,15
cat /proc/cmdline BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.14.0-70.13.1.rt21.83.el10_0.x86_64 root=/dev/mapper/rhel_virtlab505-root ro crashkernel=auto resume=/dev/mapper/rhel_virtlab505-swap rd.lvm.lv=rhel_virtlab505/root rd.lvm.lv=rhel_virtlab505/swap console=ttyS1,115200 default_hugepages=1G skew_tick=1 isolcpus=1,3,5,7,9,11,13,14,15 intel_pstate=disable nosoftlockup tsc=nowatchdog nohz=on nohz_full=1,3,5,7,9,11,13,14,15 rcu_nocbs=1,3,5,7,9,11,13,14,15
Copy to Clipboard Copied!
realtime-virtual-host
tuned 프로필이 활성 상태인지 확인합니다.tuned-adm active
$ tuned-adm active Current active profile: realtime-virtual-host
Copy to Clipboard Copied! 대규모 메모리 페이지 수를 확인합니다. 예를 들면 다음과 같습니다.
cat /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages 2
$ cat /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages 2
Copy to Clipboard Copied!
다음 단계
3.5. 실시간 가상화 시스템 테스트에 과부하
설정한 RHEL for Real Time 호스트 또는 게스트가 로드가 많은 경우 짧은 대기 시간을 유지 관리하도록 하려면 실시간 대기 시간 과부하 테스트를 수행합니다.
사전 요구 사항
- GitHub에 계정이 설정되어 있으며 리포지토리를 복제할 수 있습니다.
-
실시간 가상 머신 호스트에 맞게
tuned
를 구성했습니다. 자세한 내용은 실시간 가상화 호스트에 대한 TuneD 구성을 참조하십시오. - 실시간 가상화에 사용할 대규모 메모리 페이지를 설정했습니다. 자세한 내용은 실시간 가상화 호스트에 대한 대규모 페이지 구성 을 참조하십시오.
프로세스
하우스키핑 코어에 과부하를 추가하십시오. 이렇게 하려면 이전 섹션에서 설정한 하우스키핑 코어 수의 두 배에서 linux 커널을 컴파일하기 시작합니다.
Linux 커널 리포지토리를 복제하고 해당 디렉터리로 이동합니다.
git clone https://github.com/torvalds/linux.git ; cd linux
# git clone https://github.com/torvalds/linux.git ; cd linux
Copy to Clipboard Copied! 커널 컴파일에 대한 기본 구성을 생성합니다.
make defconfig
# make defconfig
Copy to Clipboard Copied! Linux 커널 컴파일을 시작합니다.
while true; do make -j <double-number-of-housekeeping-cpus> && make clean; done
# while true; do make -j <double-number-of-housekeeping-cpus> && make clean; done
Copy to Clipboard Copied!
호스트에서 12 시간 동안
cyclictest
절차를 수행하십시오. 다음 예에서 < list_isolated_cores >를 실시간 작업을 위해 분리된 코어 목록으로 바꿉니다(예:1,3,5,7,9,11,13,14,15
).cyclictest -m -q -p95 --policy=fifo -D 12h -h60 -t <number_of_isolated_cpus> -a <list_isolated_cores> -mainaffinity <list_housekeeping_cpus> -i 200
# cyclictest -m -q -p95 --policy=fifo -D 12h -h60 -t <number_of_isolated_cpus> -a <list_isolated_cores> -mainaffinity <list_housekeeping_cpus> -i 200
Copy to Clipboard Copied! 최신 고급 AMD64 또는 Intel 64 프로세서(
x86_64
라고도 함)를 사용하는 경우 출력에 있는Max Latencies
의 최적 값은 40 마이크로초 미만입니다. 측정된 대기 시간이 40 Cryostats를 초과하는 경우 테스트를 종료하려면 명령에-b 40
옵션을 추가합니다.12시간 동안 호스트에서 OS 수준 대기 시간 테스트(OSLAT)를 수행합니다.
./oslat --cpu-list <list_isolated_cores> --rtprio 1 --D 12h -w memmove -m 4K
# ./oslat --cpu-list <list_isolated_cores> --rtprio 1 --D 12h -w memmove -m 4K
Copy to Clipboard Copied! 최신 고급
x86_64
프로세서를 사용하는 경우 출력에 있는Maximum
의 최적 값은 20 Cryostat 미만입니다. 측정된 대기 시간이 20 Cryostats를 초과하는 경우 테스트를 종료하려면 명령에-T 20
옵션을 추가합니다.
4장. 실시간 가상 머신 설정
RHEL 10 for Real Time 게스트 운영 체제가 있는 VM(가상 머신)을 설정하려면 VM을 생성하고, 게스트를 구성하고, VM의 성능을 최적화하고 테스트해야 합니다.
4.1. 실시간 가상 머신에 vCPU 고정 최적화
RHEL 실시간(RT) 가상 머신(VM)을 올바르게 설정하려면 먼저 VM의 가상 CPU(vCPU)를 호스트의 물리적 CPU에 최적으로 고정할 계획이 있어야 합니다.
사전 요구 사항
- 실시간 가상화를 위한 호스트 시스템을 설정했습니다. 자세한 내용은 실시간 가상 머신의 호스트 환경 구성을 참조하십시오.
hwloc
패키지가 설치되어 있습니다.dnf install hwloc
# dnf install hwloc
Copy to Clipboard Copied! - 이후 확인을 위한 기준선을 얻기 위해 VM의 성능을 평가했습니다. 이를 수행하는 다양한 방법은 가상 머신 성능 모니터링 툴 을 참조하십시오.
프로세스
호스트 시스템의 CPU 토폴로지를 확인합니다.
lstopo-no-graphics
# lstopo-no-graphics
Copy to Clipboard Copied! 다음 예제 출력에서는 하이퍼 스레딩이 활성화된 32개의 물리적 코어가 있는 시스템을 보여줍니다. 2개 소켓("패키지")으로 나뉩니다. 또한 시스템에는 NUMA 노드 2개에서 250GB의 RAM이 분할되어 있습니다.
이 절차의 다음 예제는 이 토폴로지를 기반으로 합니다.
Machine (250GB total) Package L#0 NUMANode L#0 (P#0 124GB) Die L#0 + L3 L#0 (16MB) L2 L#0 (1024KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 PU L#0 (P#0) PU L#1 (P#32) L2 L#1 (1024KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 PU L#2 (P#1) PU L#3 (P#33) L2 L#2 (1024KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 PU L#4 (P#2) PU L#5 (P#34) L2 L#3 (1024KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 PU L#6 (P#3) PU L#7 (P#35) Die L#1 + L3 L#1 (16MB) L2 L#4 (1024KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 PU L#8 (P#4) PU L#9 (P#36) L2 L#5 (1024KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 PU L#10 (P#5) PU L#11 (P#37) L2 L#6 (1024KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6 PU L#12 (P#6) PU L#13 (P#38) L2 L#7 (1024KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7 PU L#14 (P#7) PU L#15 (P#39) Die L#2 + L3 L#2 (16MB) L2 L#8 (1024KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8 PU L#16 (P#8) PU L#17 (P#40) L2 L#9 (1024KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9 PU L#18 (P#9) PU L#19 (P#41) L2 L#10 (1024KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10 PU L#20 (P#10) PU L#21 (P#42) L2 L#11 (1024KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11 PU L#22 (P#11) PU L#23 (P#43) Die L#3 + L3 L#3 (16MB) L2 L#12 (1024KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12 PU L#24 (P#12) PU L#25 (P#44) L2 L#13 (1024KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13 PU L#26 (P#13) PU L#27 (P#45) L2 L#14 (1024KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14 PU L#28 (P#14) PU L#29 (P#46) L2 L#15 (1024KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15 PU L#30 (P#15) PU L#31 (P#47) Package L#1 NUMANode L#1 (P#1 126GB) Die L#4 + L3 L#4 (16MB) L2 L#16 (1024KB) + L1d L#16 (32KB) + L1i L#16 (32KB) + Core L#16 PU L#32 (P#16) PU L#33 (P#48) L2 L#17 (1024KB) + L1d L#17 (32KB) + L1i L#17 (32KB) + Core L#17 PU L#34 (P#17) PU L#35 (P#49) L2 L#18 (1024KB) + L1d L#18 (32KB) + L1i L#18 (32KB) + Core L#18 PU L#36 (P#18) PU L#37 (P#50) L2 L#19 (1024KB) + L1d L#19 (32KB) + L1i L#19 (32KB) + Core L#19 PU L#38 (P#19) PU L#39 (P#51) Die L#5 + L3 L#5 (16MB) L2 L#20 (1024KB) + L1d L#20 (32KB) + L1i L#20 (32KB) + Core L#20 PU L#40 (P#20) PU L#41 (P#52) L2 L#21 (1024KB) + L1d L#21 (32KB) + L1i L#21 (32KB) + Core L#21 PU L#42 (P#21) PU L#43 (P#53) L2 L#22 (1024KB) + L1d L#22 (32KB) + L1i L#22 (32KB) + Core L#22 PU L#44 (P#22) PU L#45 (P#54) L2 L#23 (1024KB) + L1d L#23 (32KB) + L1i L#23 (32KB) + Core L#23 PU L#46 (P#23) PU L#47 (P#55) Die L#6 + L3 L#6 (16MB) L2 L#24 (1024KB) + L1d L#24 (32KB) + L1i L#24 (32KB) + Core L#24 PU L#48 (P#24) PU L#49 (P#56) L2 L#25 (1024KB) + L1d L#25 (32KB) + L1i L#25 (32KB) + Core L#25 PU L#50 (P#25) PU L#51 (P#57) L2 L#26 (1024KB) + L1d L#26 (32KB) + L1i L#26 (32KB) + Core L#26 PU L#52 (P#26) PU L#53 (P#58) L2 L#27 (1024KB) + L1d L#27 (32KB) + L1i L#27 (32KB) + Core L#27 PU L#54 (P#27) PU L#55 (P#59) Die L#7 + L3 L#7 (16MB) L2 L#28 (1024KB) + L1d L#28 (32KB) + L1i L#28 (32KB) + Core L#28 PU L#56 (P#28) PU L#57 (P#60) L2 L#29 (1024KB) + L1d L#29 (32KB) + L1i L#29 (32KB) + Core L#29 PU L#58 (P#29) PU L#59 (P#61) L2 L#30 (1024KB) + L1d L#30 (32KB) + L1i L#30 (32KB) + Core L#30 PU L#60 (P#30) PU L#61 (P#62) L2 L#31 (1024KB) + L1d L#31 (32KB) + L1i L#31 (32KB) + Core L#31 PU L#62 (P#31) PU L#63 (P#63)
Machine (250GB total) Package L#0 NUMANode L#0 (P#0 124GB) Die L#0 + L3 L#0 (16MB) L2 L#0 (1024KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 PU L#0 (P#0) PU L#1 (P#32) L2 L#1 (1024KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 PU L#2 (P#1) PU L#3 (P#33) L2 L#2 (1024KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 PU L#4 (P#2) PU L#5 (P#34) L2 L#3 (1024KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 PU L#6 (P#3) PU L#7 (P#35) Die L#1 + L3 L#1 (16MB) L2 L#4 (1024KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 PU L#8 (P#4) PU L#9 (P#36) L2 L#5 (1024KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 PU L#10 (P#5) PU L#11 (P#37) L2 L#6 (1024KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6 PU L#12 (P#6) PU L#13 (P#38) L2 L#7 (1024KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7 PU L#14 (P#7) PU L#15 (P#39) Die L#2 + L3 L#2 (16MB) L2 L#8 (1024KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8 PU L#16 (P#8) PU L#17 (P#40) L2 L#9 (1024KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9 PU L#18 (P#9) PU L#19 (P#41) L2 L#10 (1024KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10 PU L#20 (P#10) PU L#21 (P#42) L2 L#11 (1024KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11 PU L#22 (P#11) PU L#23 (P#43) Die L#3 + L3 L#3 (16MB) L2 L#12 (1024KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12 PU L#24 (P#12) PU L#25 (P#44) L2 L#13 (1024KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13 PU L#26 (P#13) PU L#27 (P#45) L2 L#14 (1024KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14 PU L#28 (P#14) PU L#29 (P#46) L2 L#15 (1024KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15 PU L#30 (P#15) PU L#31 (P#47) Package L#1 NUMANode L#1 (P#1 126GB) Die L#4 + L3 L#4 (16MB) L2 L#16 (1024KB) + L1d L#16 (32KB) + L1i L#16 (32KB) + Core L#16 PU L#32 (P#16) PU L#33 (P#48) L2 L#17 (1024KB) + L1d L#17 (32KB) + L1i L#17 (32KB) + Core L#17 PU L#34 (P#17) PU L#35 (P#49) L2 L#18 (1024KB) + L1d L#18 (32KB) + L1i L#18 (32KB) + Core L#18 PU L#36 (P#18) PU L#37 (P#50) L2 L#19 (1024KB) + L1d L#19 (32KB) + L1i L#19 (32KB) + Core L#19 PU L#38 (P#19) PU L#39 (P#51) Die L#5 + L3 L#5 (16MB) L2 L#20 (1024KB) + L1d L#20 (32KB) + L1i L#20 (32KB) + Core L#20 PU L#40 (P#20) PU L#41 (P#52) L2 L#21 (1024KB) + L1d L#21 (32KB) + L1i L#21 (32KB) + Core L#21 PU L#42 (P#21) PU L#43 (P#53) L2 L#22 (1024KB) + L1d L#22 (32KB) + L1i L#22 (32KB) + Core L#22 PU L#44 (P#22) PU L#45 (P#54) L2 L#23 (1024KB) + L1d L#23 (32KB) + L1i L#23 (32KB) + Core L#23 PU L#46 (P#23) PU L#47 (P#55) Die L#6 + L3 L#6 (16MB) L2 L#24 (1024KB) + L1d L#24 (32KB) + L1i L#24 (32KB) + Core L#24 PU L#48 (P#24) PU L#49 (P#56) L2 L#25 (1024KB) + L1d L#25 (32KB) + L1i L#25 (32KB) + Core L#25 PU L#50 (P#25) PU L#51 (P#57) L2 L#26 (1024KB) + L1d L#26 (32KB) + L1i L#26 (32KB) + Core L#26 PU L#52 (P#26) PU L#53 (P#58) L2 L#27 (1024KB) + L1d L#27 (32KB) + L1i L#27 (32KB) + Core L#27 PU L#54 (P#27) PU L#55 (P#59) Die L#7 + L3 L#7 (16MB) L2 L#28 (1024KB) + L1d L#28 (32KB) + L1i L#28 (32KB) + Core L#28 PU L#56 (P#28) PU L#57 (P#60) L2 L#29 (1024KB) + L1d L#29 (32KB) + L1i L#29 (32KB) + Core L#29 PU L#58 (P#29) PU L#59 (P#61) L2 L#30 (1024KB) + L1d L#30 (32KB) + L1i L#30 (32KB) + Core L#30 PU L#60 (P#30) PU L#61 (P#62) L2 L#31 (1024KB) + L1d L#31 (32KB) + L1i L#31 (32KB) + Core L#31 PU L#62 (P#31) PU L#63 (P#63)
Copy to Clipboard Copied! lstopo-no-graphics
의 출력과 필요한 실시간 VM 설정 결과에 따라 vCPU를 물리적 CPU에 고정하는 방법을 결정합니다. 다음 항목은 위의 호스트 출력에 효과적인 XML 구성과 4개의 vCPU가 있는 실시간 VM을 보여줍니다.다음 고정 배치에서는 각 vCPU에 대해 전용 코어를 사용합니다. 이러한 고정 구성을 적용하려면 할당된 물리적 CPU를 호스트에서 분리해야 하며 해당 호스트에서 실행 중인 프로세스가 없어야 합니다.
<cputune> <vcpupin vcpu='0' cpuset='4'/> <vcpupin vcpu='1' cpuset='5'/> <vcpupin vcpu='2' cpuset='6'/> <vcpupin vcpu='3' cpuset='7'/> [...]
<cputune> <vcpupin vcpu='0' cpuset='4'/> <vcpupin vcpu='1' cpuset='5'/> <vcpupin vcpu='2' cpuset='6'/> <vcpupin vcpu='3' cpuset='7'/> [...]
Copy to Clipboard Copied! 다음 고정 배치에서는 각 vCPU에 대해 전용 L3 코어를 사용합니다.
<cputune> <vcpupin vcpu='0' cpuset='16'/> <vcpupin vcpu='1' cpuset='20'/> <vcpupin vcpu='2' cpuset='24'/> <vcpupin vcpu='3' cpuset='28'/> [...]
<cputune> <vcpupin vcpu='0' cpuset='16'/> <vcpupin vcpu='1' cpuset='20'/> <vcpupin vcpu='2' cpuset='24'/> <vcpupin vcpu='3' cpuset='28'/> [...]
Copy to Clipboard Copied!
검증
- VM의 성능을 다시 모니터링하고 이전에 가져온 기준과 값을 비교합니다. 이를 수행하는 다양한 방법은 가상 머신 성능 모니터링 툴 을 참조하십시오.
4.2. RHEL 실시간 게스트 운영 체제 설치
실시간 워크로드를 위한 VM(가상 머신) 환경을 준비하려면 새 VM을 생성하고 대기 시간이 짧은 성능을 위해 구성을 조정합니다.
사전 요구 사항
- 실시간 VM을 호스팅하도록 시스템을 설정했습니다. 자세한 내용은 실시간 가상 머신의 호스트 환경 구성을 참조하십시오.
- 실시간 VM에 대한 최적의 vCPU 고정 구성을 고려했습니다. 자세한 내용은 실시간 가상 머신의 vCPU 고정 최적화를 참조하십시오.
프로세스
virt-install
유틸리티를 사용하여 다음 속성으로 RHEL 10 VM을 생성합니다.- VM에 2개 이상의 vCPU가 할당됨
- VM은 메모리 지원에 대규모 페이지를 사용합니다.
다음 예제 명령은 언급된 요구 사항에 맞는
RHEL10-RT
라는 VM을 생성합니다.virt-install -n RHEL10-RT \ --os-variant=rhel10.0 --memory=3072,hugepages=yes \ --memorybacking hugepages=yes,size=1,unit=G,locked=yes \ --vcpus=4 --numatune=1 --disk path=./RHEL10-RT.img,bus=virtio,cache=none,format=raw,io=threads,size=30 \ --graphics none --console pty,target_type=serial \ -l downloads/rhel10.iso \ --extra-args 'console=ttyS0,115200n8 serial'
# virt-install -n RHEL10-RT \ --os-variant=rhel10.0 --memory=3072,hugepages=yes \ --memorybacking hugepages=yes,size=1,unit=G,locked=yes \ --vcpus=4 --numatune=1 --disk path=./RHEL10-RT.img,bus=virtio,cache=none,format=raw,io=threads,size=30 \ --graphics none --console pty,target_type=serial \ -l downloads/rhel10.iso \ --extra-args 'console=ttyS0,115200n8 serial'
Copy to Clipboard Copied! 설치가 완료되면 VM을 종료합니다.
virsh shutdown <RHEL10-RT>
# virsh shutdown <RHEL10-RT>
Copy to Clipboard Copied! VM의 XML 구성을 엽니다.
virsh edit <RHEL10-RT>
# virsh edit <RHEL10-RT>
Copy to Clipboard Copied! 다음과 같이 CPU 구성을 조정합니다.
<cpu mode='host-model' check='partial'> <feature policy='require' name='tsc-deadline'/> </cpu>
<cpu mode='host-model' check='partial'> <feature policy='require' name='tsc-deadline'/> </cpu>
Copy to Clipboard Copied! VM에서 필수가 아닌 가상 하드웨어를 제거하여 성능을 개선합니다.
virtio
RNG 장치의 섹션을 삭제합니다.<rng model='virtio'> <backend model='random'>/dev/urandom</backend> <address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/> </rng>
<rng model='virtio'> <backend model='random'>/dev/urandom</backend> <address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/> </rng>
Copy to Clipboard Copied! 다음과 같은 USB 장치를 제거합니다.
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x1234'/> <product id='0xabcd'/> </source> </hostdev>
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x1234'/> <product id='0xabcd'/> </source> </hostdev>
Copy to Clipboard Copied! 다음과 같은 직렬 장치를 제거합니다.
<serial type='dev'> <source path='/dev/ttyS0'/> <target port='0'/> </serial>
<serial type='dev'> <source path='/dev/ttyS0'/> <target port='0'/> </serial>
Copy to Clipboard Copied! QXL 장치를 제거합니다.
<video> <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'/> </video>
<video> <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'/> </video>
Copy to Clipboard Copied! 그래픽 표시를 비활성화합니다.
<graphics type='vnc' ports='-1' autoport='yes' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'> </graphics>
<graphics type='vnc' ports='-1' autoport='yes' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'> </graphics>
Copy to Clipboard Copied! USB 컨트롤러 설정에서 모델을
none
으로 변경하여 비활성화합니다.<controller type='usb' index='0' model='none'/>
<controller type='usb' index='0' model='none'/>
Copy to Clipboard Copied! 신뢰할 수 있는 플랫폼 모듈(TPM) 구성을 제거하여 RT 작업을 방해하지 않습니다.
<tpm model='tpm-crb'> <backend type='emulator' version='2.0'/> </tpm>
<tpm model='tpm-crb'> <backend type='emulator' version='2.0'/> </tpm>
Copy to Clipboard Copied! memballoon
기능을 비활성화합니다.<memballoon model='none'>
<memballoon model='none'>
Copy to Clipboard Copied! 구성의
<features
> 섹션에서PMU
및vmport
기능이 비활성화되었는지 확인하여 발생할 수 있는 대기 시간을 방지합니다.<features> [...] <pmu state='off'/> <vmport state='off'/> </features>
<features> [...] <pmu state='off'/> <vmport state='off'/> </features>
Copy to Clipboard Copied!
<
;numatune&
gt; 섹션을 편집하여 NUMA 노드를 설정합니다.<numatune> <memory mode='strict' nodeset='1'/> </numatune>
<numatune> <memory mode='strict' nodeset='1'/> </numatune>
Copy to Clipboard Copied! 구성의
<cputune
> 섹션을 편집하여 실시간 가상 머신에 대해 계획된 vCPU 고정을 계획한 대로 vCPU NUMA 고정을 설정합니다.다음 예제에서는 4개의 vCPU 및 이러한 매개변수를 사용하여 VM을 구성합니다.
- NUMA 노드 0의 격리된 코어 15는 비실시간 vCPU입니다.
- NUMA 노드 1~3의 코어 16, 47 및 48은 실시간 vCPU입니다.
- 구성은 모든 QEMU I/O 스레드를 호스트 하우스키핑 코어(0 및 32)에 고정합니다.
<cputune> <vcpupin vcpu='0' cpuset='15'/> <vcpupin vcpu='1' cpuset='47'/> <vcpupin vcpu='2' cpuset='16'/> <vcpupin vcpu='3' cpuset='48'/> <emulatorpin cpuset='0,32'/> <emulatorsched scheduler='fifo' priority='1'/> <vcpusched vcpus='0' scheduler='fifo' priority='1'/> <vcpusched vcpus='1' scheduler='fifo' priority='1'/> <vcpusched vcpus='2' scheduler='fifo' priority='1'/> <vcpusched vcpus='3' scheduler='fifo' priority='1'/> </cputune>
<cputune> <vcpupin vcpu='0' cpuset='15'/> <vcpupin vcpu='1' cpuset='47'/> <vcpupin vcpu='2' cpuset='16'/> <vcpupin vcpu='3' cpuset='48'/> <emulatorpin cpuset='0,32'/> <emulatorsched scheduler='fifo' priority='1'/> <vcpusched vcpus='0' scheduler='fifo' priority='1'/> <vcpusched vcpus='1' scheduler='fifo' priority='1'/> <vcpusched vcpus='2' scheduler='fifo' priority='1'/> <vcpusched vcpus='3' scheduler='fifo' priority='1'/> </cputune>
Copy to Clipboard Copied! 참고호스트에서 활성화된 하이퍼 스레딩 과 함께 하드웨어를 사용하는 경우 <
cputune
> 구성도 다음 요구 사항을 충족하는지 확인합니다.- 물리적 코어의 형제를 할당하여 실시간 또는 하우스키핑 작업을 수행합니다.
- 동일한 VM에서 물리적 코어의 형제를 모두 사용합니다.
- 동일한 물리적 코어의 형제에 고정된 vCPU의 경우, 형제와 동일한 작업(실시간 프로세스 또는 하우스키핑)에 vCPU를 할당합니다.
위의 구성 예제에서는 이러한 요구 사항을 충족합니다.
- XML 구성을 저장하고 종료합니다.
문제 해결
- RHEL 실시간 게스트 설치 문제 해결을 참조하십시오.
검증
호스트에서 VM의 구성을 보고 필요한 매개변수가 있는지 확인합니다.
virsh dumpxml <RHEL10-RT>
# virsh dumpxml <RHEL10-RT>
Copy to Clipboard Copied!
4.3. 실시간으로 RHEL 게스트 운영 체제 구성
실시간 워크로드를 위해 RHEL 10 VM(가상 머신) 환경을 최적화하려면 대기 시간이 짧은 성능을 위해 게스트 운영 체제를 구성합니다.
사전 요구 사항
- RHEL 10 가상 머신을 설치하고 실시간 워크로드에 맞게 구성을 조정했습니다. 자세한 내용은 RHEL 실시간 게스트 운영 체제 설치를 참조하십시오.
프로세스
- VM을 시작합니다.
게스트 운영 체제에 실시간 패키지를 설치합니다.
dnf install -y kernel-rt tuned tuned-profiles-realtime tuned-profiles-nfv realtime-tests
# dnf install -y kernel-rt tuned tuned-profiles-realtime tuned-profiles-nfv realtime-tests
Copy to Clipboard Copied! tuned
의 가상 게스트 프로필을 조정합니다. 이렇게 하려면/etc/tuned/realtime-virtual-guest-variables.conf
파일을 편집하고 다음 행을 추가합니다.isolated_cores=<isolated-core-nrs> isolate_managed_irq=Y
isolated_cores=<isolated-core-nrs> isolate_managed_irq=Y
Copy to Clipboard Copied! &
lt;isolated-core-nrs
>를 실시간 워크로드를 위해 분리하려는 호스트 코어 수로 바꿉니다.게스트 운영 체제에서 irqbalance가 비활성화되어 있는지 확인합니다.
rpm -q irqbalance && systemctl stop irqbalance && systemctl disable irqbalance
# rpm -q irqbalance && systemctl stop irqbalance && systemctl disable irqbalance
Copy to Clipboard Copied! tuned의 realtime-virtual-guest 프로필을 활성화합니다.
tuned-adm profile realtime-virtual-guest
# tuned-adm profile realtime-virtual-guest
Copy to Clipboard Copied! 기본적으로 게스트 운영 체제에서 실시간 커널을 사용하는지 확인합니다.
grubby --set-default vmlinuz-5.14.0-XXX.el10.x86_64+rt
# grubby --set-default vmlinuz-5.14.0-XXX.el10.x86_64+rt
Copy to Clipboard Copied! - 호스트에서와 동일한 방식으로 게스트 운영 체제에 대한 대규모 페이지를 구성합니다. 자세한 내용은 실시간 가상화 호스트에 대한 대규모 페이지 구성 을 참조하십시오.
검증
- 게스트 운영 체제에서 호스트와 동일한 과부하 테스트를 수행합니다. 자세한 내용은 실시간 가상화 시스템 테스트를 참조하십시오.
문제 해결
stress 테스트의 결과가 필요한 대기 시간을 초과하는 경우 다음을 수행합니다.
- 호스트에서 과부하 테스트를 다시 수행합니다. 대기 시간 결과가 최적인 경우 TuneD 및 Huge 페이지의 호스트 구성을 조정한 후 다시 테스트합니다. 자세한 내용은 실시간 가상화 호스트에 대한 TuneD 구성 및 실시간 가상화 호스트에 대한 대규모 페이지 구성을 참조하십시오.
-
호스트의 과부하 테스트 결과가 충분히 짧은 대기 시간을 표시하지만 게스트에서 그렇지 않은 경우
trace-cmd
유틸리티를 사용하여 자세한 테스트 보고서를 생성합니다. 자세한 내용은 RHEL 실시간 게스트의 대기 시간 문제 해결을 참조하십시오.
4.4. 실시간 가상 머신의 캐시 보호 설정
캐시 라인을 제거하면 실시간 VM(가상 머신)에서 성능 문제가 발생할 수 있습니다. 선택적으로 이 문제를 방지하려면 사용자 인터페이스 리소스 제어(resctrlfs'
) 기능을 사용하여 캐시 및 캐시 파티션을 관리합니다.
- 호스트 시스템의 주 메모리 캐시를 파티션으로 분할
- 각 파티션에 별도의 작업 할당
- 실시간 애플리케이션을 실행하는 vCPU를 하나의 캐시 파티션에 할당
- 하우스키핑 워크로드를 실행하는 vCPU 및 호스트 CPU를 다른 캐시 파티션에 할당
사전 요구 사항
- 호스트에 실시간 가상 머신을 생성했습니다. 자세한 내용은 RHEL 실시간 게스트 운영 체제 설치를 참조하십시오.
호스트에서 L2 또는 L3 캐시 파티셔닝을 지원하는 Intel 프로세서를 사용하고 있습니다. 이러한 경우를 확인하려면 다음을 수행하십시오.
intel-cmt-cat
유틸리티를 설치합니다.dnf install intel-cmt-cat
# dnf install intel-cmt-cat
Copy to Clipboard Copied! pqos
유틸리티를 사용하여 코어 캐시 세부 정보를 표시합니다.pqos -d
# pqos -d [...] Allocation Cache Allocation Technology (CAT) L3 CAT
Copy to Clipboard Copied! 이 출력은 CPU가 L3 캐시 파티셔닝을 지원하는 것을 나타냅니다.
프로세스
다음 단계에서는 다음과 같은 NUMA vCPU 고정 할당이 CPU에 있다고 가정합니다.
<cputune> <vcpupin vcpu='0' cpuset='16'/> <vcpupin vcpu='1' cpuset='17'/> <vcpupin vcpu='2' cpuset='18'/> <vcpupin vcpu='3' cpuset='19'/>
<cputune>
<vcpupin vcpu='0' cpuset='16'/>
<vcpupin vcpu='1' cpuset='17'/>
<vcpupin vcpu='2' cpuset='18'/>
<vcpupin vcpu='3' cpuset='19'/>
resctrl
파일 시스템을 마운트합니다. 이렇게 하면 프로세서의 리소스 제어 기능을 사용할 수 있습니다.mount -t resctrl resctrl /sys/fs/resctrl
# mount -t resctrl resctrl /sys/fs/resctrl
Copy to Clipboard Copied! 시스템이
L2
또는 L3 캐시 파티션을 지원하는지 여부에 따라 L2 또는L3
이라는 하위 디렉터리는/sys/fs/resctrl/info
디렉터리에 마운트됩니다. 다음 단계에서는 시스템이 L3 캐시 파티셔닝을 지원하는 것으로 가정합니다.캐시 디렉터리로 이동하고 해당 콘텐츠를 나열합니다.
cd /sys/fs/resctrl/info/L3/; ls
# cd /sys/fs/resctrl/info/L3/; ls bit_usage cbm_mask min_cbm_bits num_closids shareable_bits sparse_masks
Copy to Clipboard Copied! cbm_mask
파일의 값을 확인합니다.cat cbm_mask ffff
# cat cbm_mask ffff
Copy to Clipboard Copied! 이 값은 16진수 코드의 캐시 비트마스크를 나타냅니다.
ffff
는 모든 16비트의 캐시를 워크로드에서 사용할 수 있음을 의미합니다."shareable_bits" 파일의 값을 확인합니다.
cat shareable_bits 0
# cat shareable_bits 0
Copy to Clipboard Copied! 이 값은 I/O와 같은 다른 실행 중인 프로세스에서 공유하는 L3 캐시 파티션을 나타내며 전용 캐시 파티션에서는 사용해서는 안 됩니다.
0
은 모든 L3 캐시 파티션을 사용할 수 있음을 의미합니다.스키마타
파일을 보고 글로벌 캐시 할당을 확인합니다.cat /sys/fs/resctrl/schemata L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ffff;10=ffff;12=ffff;14=ffff
# cat /sys/fs/resctrl/schemata L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ffff;10=ffff;12=ffff;14=ffff
Copy to Clipboard Copied! 이 출력은 L3 캐시 파티션, CPU 소켓 0, 2, 4, 6, 8, 10, 12 및 14의 경우 기본 제어 그룹에 완전히 할당되었음을 나타냅니다. 이 예에서 CPU 소켓 16 - 19는 vCPU 0-3에 고정되어 있습니다.
실시간 애플리케이션에 대해 설정할 캐시 배포를 결정합니다. 예를 들어 실시간 애플리케이션 및 하우스키핑 애플리케이션 모두에 대해 8MB를 균등하게 배포하는 경우 다음을 수행합니다.
-
실시간 애플리케이션의 캐시 비트마스크는
ff00
입니다. -
하우스키핑 애플리케이션의 캐시 비트마스크는
00ff
입니다.
-
실시간 애플리케이션의 캐시 비트마스크는
하우스키핑 프로세스에 필요한 캐시 할당으로 기본
schemata
파일을 조정합니다. 예를 들어 CPU 소켓 8에 8MB를 할당하려면 다음을 수행합니다.echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=00ff;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/schemata
# echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=00ff;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/schemata
Copy to Clipboard Copied! 실시간 프로세스에 대한 특정 제어 그룹(예:
part1
)을 생성합니다.mkdir /sys/fs/resctrl/part1
# mkdir /sys/fs/resctrl/part1
Copy to Clipboard Copied! part1
제어 그룹에 대한schemata
파일을 만들고 하우스키핑 캐시 할당과 충돌하지 않는 캐시 할당을 사용하도록 설정합니다.echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ff00;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/part1/schemata
# echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ff00;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/part1/schemata
Copy to Clipboard Copied! 이 설정을 통해 L3 캐시 8은 실시간 프로세스에 캐시 할당의 절반을 사용하고 나머지 절반은 하우스키핑 프로세스에 사용합니다. 다른 모든 L3 캐시는 실시간 프로세스와 하우스키핑에서 자유롭게 사용할 수 있습니다.
실시간 vCPU(이 경우 17, 18 및 19)에 고정된 CPU를 이 제어 그룹에 할당합니다.
echo 17,18,19 > part1/cpus_list
# echo 17,18,19 > part1/cpus_list
Copy to Clipboard Copied!
검증
이전에 VM의 대기 시간을 테스트한 경우
cyclictest
유틸리티를 다시 실행합니다. 자세한 내용은 실시간 가상화 시스템 테스트를 참조하십시오.최대 대기 시간이 이전보다 작으면 캐시 보호를 올바르게 설정했습니다.
4.5. RHEL 실시간 게스트 설치 문제 해결
실시간 호스트에 RHEL 10 가상 머신(VM)을 설치하는 동안 다음 오류 중 하나가 발생할 수 있습니다. 이러한 문제를 해결하거나 해결하려면 다음 권장 사항을 사용하십시오.
오류: 호스트가 가상화 옵션을 지원하지 않음
- 호스트 BIOS에서 가상화가 활성화되었는지 확인합니다.
호스트의 cpu 플래그에 Intel의
vmx
또는 AMD의 경우svm
이 포함되어 있는지 확인합니다.cat /proc/cpuinfo | grep vmx
$ cat /proc/cpuinfo | grep vmx
Copy to Clipboard Copied! lsmod
명령이kvm
및kvm_intel
또는kvm_amd
모듈을 감지하는지 확인합니다.lsmod | grep kvm
$ lsmod | grep kvm
Copy to Clipboard Copied! kernel-rt-kvm
패키지가 설치되어 있는지 확인합니다.dnf info kernel-rt-kvm
$ dnf info kernel-rt-kvm
Copy to Clipboard Copied! -
/dev/kvm
장치가 있는지 확인합니다. -
virt-host-validate
유틸리티를 실행하여 추가 문제를 감지합니다. - kvm-unit-tests 를 실행합니다.
디스크 이미지에 액세스하는 동안 권한 관련 문제
-
/etc/libvirt/qemu.conf
파일에서group =
및user =
행의 주석을 제거합니다. virtqemud
서비스를 다시 시작합니다.service virtqemud restart
$ service virtqemud restart
Copy to Clipboard Copied!
-
4.6. RHEL 실시간 게스트의 대기 시간 문제 해결
RHEL 실시간 게스트 운영 체제의 대기 시간을 해결하려면 trace-cmd
테스트를 실행하여 게스트에 대한 커널 추적 파일을 생성합니다. 이후 이 테스트의 출력을 사용하여 Red Hat의 지원을 요청할 수 있습니다.
사전 요구 사항
- RHEL 10 가상 머신을 설치하고 실시간 워크로드에 맞게 구성을 조정했습니다. 자세한 내용은 RHEL 실시간 게스트 운영 체제 설치를 참조하십시오.
- SSH를 사용하여 게스트에 연결할 수 있습니다. 자세한 내용은 SSH를 사용하여 가상 머신에 연결을 참조하십시오.
trace-cmd
유틸리티는 호스트와 게스트 모두에 설치됩니다.dnf install trace-cmd
# dnf install trace-cmd
Copy to Clipboard Copied!
프로세스
VSOCK 인터페이스를 사용하도록 테스트할 VM을 구성합니다.
-
호스트에서
virsh edit
명령을 사용하여 VM의 XML 구성을 엽니다. 구성의 <
devices>
섹션에 다음 행을 추가합니다.<vsock model="virtio"> <cid auto="no" address="3"/>
<vsock model="virtio"> <cid auto="no" address="3"/>
Copy to Clipboard Copied! 여러 VM에서 테스트를 수행하는 경우 각각에 대해 다른
주소
값을 설정합니다.- 구성을 저장하고 종료합니다.
-
호스트에서
추적이 제대로 작동하는지 확인하려면 호스트에서 다음 짧은 테스트를 실행합니다. 이렇게 하면 Cryostat_FIFO 우선 순위에서 실행되는 vCPU로 인해 게스트가 응답하지 않습니다.
호스트에서 다음 명령을 사용합니다.
trace-cmd record -m 1000 -e kvm_exit
# trace-cmd record -m 1000 -e kvm_exit
Copy to Clipboard Copied! - 약 10초 후에 Ctrl-C 를 눌러 테스트를 중단합니다.
-
테스트에서 동일한 디렉터리에
trace.dat
파일을 생성하고 파일이 비어 있지 않은지 확인합니다.
- VM을 시작합니다.
호스트에서 VM에 대한 암호 없는 SSH 액세스를 구성합니다.
VM의 IP 주소를 가져옵니다.
virsh domifaddr <vm-name>
# virsh domifaddr <vm-name> Name MAC address Protocol Address ------------------------------------------------------------------- vnet0 52:54:00:6b:29:9f ipv4 192.168.122.145/24
Copy to Clipboard Copied! SSH 공개 키를 VM에 복사합니다.
ssh-copy-id root@<vm-ip>
# ssh-copy-id root@<vm-ip>
Copy to Clipboard Copied! 선택 사항: VM에 대한 암호 없는 로그인을 테스트합니다.
ssh root@<vm-ip>
# ssh root@<vm-ip>
Copy to Clipboard Copied! 게스트의 루트 액세스에 연결하는 경우 암호 없는 SSH를 성공적으로 구성했습니다.
게스트 운영 체제에서 백그라운드에서
trace-cmd
에이전트를 시작합니다.trace-cmd agent &
# trace-cmd agent &
Copy to Clipboard Copied! 에이전트는 게스트에서 지속적으로 실행되며 호스트의 명령을 기다립니다.
호스트에서
trace-cmd
명령을 사용하고 VM에서 vCPU 고정 구성의 매개변수를 조정합니다.trace-cmd record --poll -m 1000 \ -e <host-trace-points> \ -f "cpu==<host_cpu_num> || cpu==<host_cpu_num> || cpu==<host_cpu_num>" \ -A <guest-vsock-port> \ -e <guest-trace-points> \ -f "cpu==<guest_cpu_num> || cpu==<guest_cpu_num> || cpu==<guest_cpu_num>" \ ssh root@<vm-ip> "<latency-test-command>"
# trace-cmd record --poll -m 1000 \ -e <host-trace-points> \ -f "cpu==<host_cpu_num> || cpu==<host_cpu_num> || cpu==<host_cpu_num>" \ -A <guest-vsock-port> \ -e <guest-trace-points> \ -f "cpu==<guest_cpu_num> || cpu==<guest_cpu_num> || cpu==<guest_cpu_num>" \ ssh root@<vm-ip> "<latency-test-command>"
Copy to Clipboard Copied! 다음과 같이 명령의 값을 바꿉니다.
-
<host-trace-points
>와 같이 호스트에서 추적하려는 추적 이벤트(예:sched_switch
또는reschedule_entry
)입니다. -
vCPU 핀이 구성된 각
호스트 CPU가 있는 <host_cpu_num
>입니다. -
이전 단계에서 구성한 VSOCK 포트
사용
-
게스트
에서 추적하려는 추적 이벤트를 사용합니다. 최적으로는 < host-trace-points>와 동일합니다.
-
VM의 IP 주소가 있는 <VM-ip
>입니다. -
실시간 가상화 시스템
테스트에 자세히 설명된 대로 수행하려는 특정 stress test 명령이 있는 <latency-
test- command>.cyclictest
절차를 사용하는 경우--tracemark
매개변수도 추가합니다.
여러 VM을 동시에 테스트하려면 다음과 같이 명령을 조정합니다.
trace-cmd record -m 1000 \ -e <host-trace-points> \ -A <guest1-vsock-port> -e <guest-trace-points> \ -A <guest2-vsock-port> -e <guest-trace-points> \ bash -c "ssh root@<vm1-ip> \ \"<latency-test-command>\" \ & ssh root@<vm2-ip> \ \"<latency-test-command>\""
# trace-cmd record -m 1000 \ -e <host-trace-points> \ -A <guest1-vsock-port> -e <guest-trace-points> \ -A <guest2-vsock-port> -e <guest-trace-points> \ bash -c "ssh root@<vm1-ip> \ \"<latency-test-command>\" \ & ssh root@<vm2-ip> \ \"<latency-test-command>\""
Copy to Clipboard Copied! 예를 들면 다음과 같습니다.
trace-cmd record --poll -m 1000 \ -e sched_switch -e hrtimer_start -e hrtimer_expire_entry -e hrtimer_expire_exit -e irq_handler_entry -e local_timer_entry -e local_timer_exit -e reschedule_entry -e reschedule_exit -e call_function_entry -e call_function_exit -e call_function_single_entry -e call_function_single_exit -e irq_work_entry -e irq_work_exit -e tick_stop -e ipi_send_cpumask -e kvm_exit -e kvm_entry -e ipi_send_cpu -e csd_queue_cpu -e csd_function_entry -e csd_function_exit \ -f "cpu==3 || cpu==5 || cpu==7 || cpu==9 || cpu==11 || cpu==13 || cpu==15 || cpu==17" \ -A 3 \ -e sched_switch -e hrtimer_start -e hrtimer_expire_entry -e hrtimer_expire_exit -e irq_handler_entry -e local_timer_entry -e local_timer_exit -e reschedule_entry -e reschedule_exit -e call_function_entry -e call_function_exit -e call_function_single_entry -e call_function_single_exit -e irq_work_entry -e irq_work_exit -e tick_stop -e ipi_send_cpumask -e kvm_exit -e kvm_entry -e ipi_send_cpu -e csd_queue_cpu -e csd_function_entry -e csd_function_exit \ -f "cpu==2 || cpu==3 || cpu==4 || cpu==5 || cpu==6 || cpu==7 || cpu==8 || cpu==9" \ ssh root@192.168.122.10 "cyclictest -m -q -p95 --policy=fifo -D 10min -h60 -t 8 -a 2,3,4,5,6,7,8,9 -i 200 -b 50 --mainaffinity 0,1 --tracemark"
# trace-cmd record --poll -m 1000 \ -e sched_switch -e hrtimer_start -e hrtimer_expire_entry -e hrtimer_expire_exit -e irq_handler_entry -e local_timer_entry -e local_timer_exit -e reschedule_entry -e reschedule_exit -e call_function_entry -e call_function_exit -e call_function_single_entry -e call_function_single_exit -e irq_work_entry -e irq_work_exit -e tick_stop -e ipi_send_cpumask -e kvm_exit -e kvm_entry -e ipi_send_cpu -e csd_queue_cpu -e csd_function_entry -e csd_function_exit \ -f "cpu==3 || cpu==5 || cpu==7 || cpu==9 || cpu==11 || cpu==13 || cpu==15 || cpu==17" \ -A 3 \ -e sched_switch -e hrtimer_start -e hrtimer_expire_entry -e hrtimer_expire_exit -e irq_handler_entry -e local_timer_entry -e local_timer_exit -e reschedule_entry -e reschedule_exit -e call_function_entry -e call_function_exit -e call_function_single_entry -e call_function_single_exit -e irq_work_entry -e irq_work_exit -e tick_stop -e ipi_send_cpumask -e kvm_exit -e kvm_entry -e ipi_send_cpu -e csd_queue_cpu -e csd_function_entry -e csd_function_exit \ -f "cpu==2 || cpu==3 || cpu==4 || cpu==5 || cpu==6 || cpu==7 || cpu==8 || cpu==9" \ ssh root@192.168.122.10 "cyclictest -m -q -p95 --policy=fifo -D 10min -h60 -t 8 -a 2,3,4,5,6,7,8,9 -i 200 -b 50 --mainaffinity 0,1 --tracemark"
Copy to Clipboard Copied! 이 명령은 다음을 수행합니다.
-
IP
192.168.122.10
및 VSOCK 포트 3으로 단일 VM 테스트 - 실시간 배포와 관련된 일반적인 추적 지점을 사용합니다.
- vCPU 2-9가 NUMA 고정되는 호스트 CPU 3,5,7,9,11,13,15 및 17을 추적합니다.
-
10 분 동안
cyclictest
를 트리거합니다.
테스트가 완료되면 추적 데이터가 호스트에 trace.dat 파일과
trace-.dat
파일로 저장됩니다.-
trace-cmd
데이터에서 사람이 읽을 수 있는 보고서를 생성합니다. 예를 들어 VM의 VSOCK 포트가 3인 경우trace-cmd report -i trace.dat -i trace-3.dat > kvm_rt_latency.log
# trace-cmd report -i trace.dat -i trace-3.dat > kvm_rt_latency.log
Copy to Clipboard Copied! 여러 VM에서 테스트를 수행한 경우 각각에 대한 보고서를 생성합니다.
trace-cmd report -i trace.dat -i trace-3.dat > kvm_rt_latency_1.log trace-cmd report -i trace.dat -i trace-4.dat > kvm_rt_latency_2.log
# trace-cmd report -i trace.dat -i trace-3.dat > kvm_rt_latency_1.log # trace-cmd report -i trace.dat -i trace-4.dat > kvm_rt_latency_2.log
Copy to Clipboard Copied! 테스트를 완료한 후 게스트 운영 체제에서
trace-cmd
에이전트를 중지합니다.pkill trace-cmd
# pkill trace-cmd
Copy to Clipboard Copied! - Red Hat에서 지원 케이스를 열고 이전 단계에서 얻은 추적 로그를 첨부합니다.
문제 해결
추적에 실패하는 경우 다음을 수행하고 다시 시도합니다.
-
vsock
이 게스트에 올바르게 구성되었는지 확인합니다. -
trace-cmd
에이전트가 게스트에서 실행 중인지 확인합니다. - 호스트에 추적 파일을 위한 충분한 디스크 공간이 있는지 확인합니다. 최적으로 추적을 실행하는 분마다 최소 2GB의 여유 디스크 공간이 있어야 합니다.
-
VM의 vCPU 고정 구성이
trace-cmd
에 사용한 매개변수와 일치하는지 확인합니다. VM 구성의 관련 부분을 보려면virsh vcpupin < vm-name> 을 사용합니다
.