在 RHEL 10 for Real Time 中配置虚拟化
在 RHEL for Real Time 主机上安装和测试虚拟机
摘要
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们感谢您对我们文档的反馈。让我们了解如何改进它。
通过 Jira 提交反馈(需要帐户)
- 登录到 Jira 网站。
- 在顶部导航栏中点 Create
- 在 Summary 字段中输入描述性标题。
- 在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 点对话框底部的 Create。
第 1 章 RHEL for Real Time 上的虚拟化是什么 复制链接链接已复制到粘贴板!
要在实时工作负载中使用虚拟机,红帽在 RHEL for Real Time 中提供虚拟化功能。
在 RHEL for Real Time 中,您可以配置主机和客户机操作系统,以实现虚拟机的低延迟和确定性行为。这使得实时虚拟机更适用于需要实时性能的应用程序,如工业自动化、电信和自主系统。
有关使用实时 RHEL 系统的好处的详情,请参阅 RHEL for Real Time 以优化延迟。
第 2 章 实时虚拟化的主机系统要求 复制链接链接已复制到粘贴板!
要托管实时虚拟机,RHEL 10 系统必须满足以下要求:
实时内核
要将 RHEL 10 主机配置为实时内核,您必须安装实时内核。具体步骤请参阅 安装 RHEL for Real Time。
另外,您必须在主机上执行以下操作:
启用 NFV 存储库:
# sudo subscription-manager repos --enable=rhel-10-server-nfv-rpms安装
tuned-profiles-nfv软件包:# dnf install tuned-profiles-nfv如果您的主机使用 RHEL 10.0 或更早版本,还要安装
kernel-rt-kvm软件包:# dnf install kernel-rt-kvm
虚拟化
RHEL 10 虚拟化软件包必须安装在您的主机上。具体步骤请参阅 准备 RHEL 来托管虚拟机。
BIOS
要成功部署并运行实时虚拟机,必须配置主机系统 BIOS 以实现最低延迟。要做到这一点,请按照特定于主机硬件模型的说明进行操作。例如:
- 对于 Dell,请参阅 为低延迟配置 Dell PowerEdge 服务器
- 对于 HP,请参阅为低延迟应用程序配置和调优 HPE &&服务器
特定的低延迟设置因不同的供应商和型号而异,但通常情况下,最小化延迟的步骤包括:
- 禁用高级硬件电源管理选项。它们提供对各种特定电源管理方面的更多控制,但也可能会导致延迟激增。
禁用较低 CPU 电源状态,如 C-states 或 C1E。
重要有些低延迟 BIOS 指南可能会建议禁用虚拟化。但是,必须跳过这一步,才能在主机上正常工作实时虚拟机。
第 3 章 为实时虚拟机配置主机环境 复制链接链接已复制到粘贴板!
为确保 RHEL 10 可以作为主机用于实时虚拟机,您必须优化主机的性能,并在输入和系统响应之间测试其延迟。
3.1. 为实时虚拟化主机配置 TuneD 复制链接链接已复制到粘贴板!
要将 RHEL 10 系统优化为实时虚拟机(VM)的主机,请为 TuneD 配置并启用 realtime-virtual-host 配置集。
先决条件
- 您的主机满足 实时虚拟化的系统要求。
irqbalance服务被禁用。如果启用了irqbalance,则处理中断请求(IRQ)可能与 TuneD 冲突。禁用irqbalance:# systemctl stop irqbalance && systemctl disable irqbalance
流程
-
开始编辑 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 虚拟化任务,哪些内核将保留主机上的系统维护(也称为 内务处理)。例如,以下设置使用核心 3、核心 6 和内核 8 到 RT 任务,所有其他内核作为内务操作:
isolated_cores=3,6,8-15请注意,默认情况下,每个插槽有一个核心(内核 0)用于内务处理,所有其他内核用于 RT 任务。
重要核心 0 必须始终设置为内务内核。将核心 0 用于 RT 任务会破坏 RT 功能。
为内核管理的 IRQ 启用 IRQ 隔离。要做到这一点,请确保在配置中没有注释掉以下行:
isolate_managed_irq=Y如果禁用了 IRQ 隔离,主机内核管理的 IRQ 可能会中断隔离的内核,这可能会导致意外的延迟。
-
取消注释
netdev_queue_count参数,并将其值设为内务内核数。
-
将更改保存到
/etc/tuned/realtime-virtual-host-variables.conf。 激活实时虚拟主机配置文件。
# tuned-adm profile realtime-virtual-host- 重启主机。
后续步骤
3.2. 为实时虚拟化主机配置巨页 复制链接链接已复制到粘贴板!
要进一步降低 RHEL 10 的虚拟机(VM)的延迟,请将主机设置为使用巨页。巨页可能会显著提高使用大量内存的应用程序的性能,通常是 RT 应用程序的情况。
有关巨页的更多信息,请参阅配置巨页。
先决条件
- 您的主机满足 实时虚拟化的系统要求。
- 您已为实时虚拟机主机配置了 TuneD。具体步骤请参阅 为实时虚拟化主机配置 TuneD。
流程
将默认巨页大小设置为 1 gibibyte。
$ grubby --args "default_hugepagesz=1G" --update-kernel ALL在主机上保留巨页。
$ echo <X> > /sys/devices/system/node/node_<Y>_/hugepages/<hugepages-size_dir>/nr-hugepages在这个命令中,按如下所示替换变量:
- < x>,带有要保留的巨页数。这个值取决于虚拟机数量及其具有的内存量。如果您正在运行单个虚拟机,请从两个 1GB 页面开始。
- <y> 带有固定实时 vCPU 的 NUMA 节点数量。
-
<hugepage-size_dir >,其巨页大小为 kB。例如,对于 2MB 巨页,这将是
hugepages-2048kB。
重要此命令临时设置巨页。因此,在启动任何实时虚拟机前,您必须在每个主机重启后使用该命令。要避免这种情况,请执行以下可选步骤,使巨页持久。
可选:如果要使巨页配置持久,还要执行以下操作:
创建名为
/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创建名为
/usr/lib/systemd/hugetlb-reserve-pages的文件,其内容如下:#!/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使用以下命令启用早期引导保留:
$ chmod +x /usr/lib/systemd/hugetlb-reserve-pages $ sudo systemctl enable hugetlb-gigantic-pages $ sudo systemctl status hugetlb-gigantic-pages-
取消注释
/usr/lib/systemd/hugetlb-reserve-pages底部两行,并根据您的巨页保留要求更新它们。
- 重启以应用所有配置更改。
3.3. 验证实时虚拟化的主机 BIOS 设置 复制链接链接已复制到粘贴板!
要验证实时内核的 BIOS 是否已成功为低延迟工作负载设置,请使用 hwlatdetect 程序。
先决条件
-
您已为实时虚拟机主机配置了
tuned。具体步骤请参阅 为实时虚拟化主机配置 TuneD。 - 您已设置了用于实时虚拟化的巨页。具体步骤请参阅 为实时虚拟化主机配置巨页。
流程
至少为一个小时运行
hwladetect工具,并确保测量的延迟不超过 1 微秒(wagons)。# 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可选:为了改进验证,请在 24 小时内运行相同的测试。
# hwlatdetect --threshold=1μs -duration=24h
后续步骤
3.4. 验证实时虚拟化主机环境 复制链接链接已复制到粘贴板!
为实时虚拟机(VM)配置了主机后,您必须验证它是否设置是否正确。要做到这一点,检查内核、巨页和隔离的 CPU 的设置,并确保 TuneD 配置集处于活跃状态。
先决条件
-
您已为实时虚拟机配置了
tuned。具体步骤请参阅 为实时虚拟化主机配置 TuneD。 - 您已设置了用于实时虚拟化的巨页。具体步骤请参阅 为实时虚拟化主机配置巨页。
流程
查看
/proc/cmdline文件的内容,并检查以下参数的值是否与您配置的方式对应:- 实时内核
- 巨页
隔离的 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
确保
realtime-virtual-host调优配置集处于活动状态。$ tuned-adm active Current active profile: realtime-virtual-host检查巨页数量。例如:
$ cat /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages 2
后续步骤
3.5. 压力测试实时虚拟化系统 复制链接链接已复制到粘贴板!
要确保 RHEL for Real Time 主机或客户机在负载过重时设置了低延迟,请执行实时延迟测试。
先决条件
-
您已为实时虚拟机主机配置了
tuned。具体步骤请参阅 为实时虚拟化主机配置 TuneD。 - 您已设置了用于实时虚拟化的巨页。具体步骤请参阅 为实时虚拟化主机配置巨页。
流程
为内务核心增加压力。为此,请在上几节中设置的内务内核数上开始编译 linux 内核。
克隆 Linux 内核存储库并移动到其目录中。
# git clone https://github.com/torvalds/linux.git ; cd linux为内核编译创建默认配置。
# make defconfig开始编译 Linux 内核。
# while true; do make -j <double-number-of-housekeeping-cpus> && make clean; done
在主机上执行
cyclictest步骤 12 小时。在以下示例中,将 < ;list_isolated_cores& gt; 替换为为实时任务隔离的内核列表,如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当使用现代高端 AMD64 或 Intel 64 处理器(也称为
x86_64)时,输出中的Max Latencies的最佳值是 40 微秒(5-6s)。要终止测试,如果测量的延迟超过 405-4,请在命令中添加-b 40选项。在主机上执行 OS 级别延迟测试(OSLAT),时间为 12 小时。
# ./oslat --cpu-list <list_isolated_cores> --rtprio 1 --D 12h -w memmove -m 4K使用现代高端
x86_64处理器时,输出中的最佳值是 20 HEKETIs。要终止测试,测量的延迟是否超过 20 个,请在命令中添加-T 20选项。
第 4 章 设置实时虚拟机 复制链接链接已复制到粘贴板!
要使用 RHEL 10 for Real Time 客户机操作系统设置虚拟机(VM),您必须创建一个虚拟机、配置其客户机并优化并测试虚拟机的性能。
4.1. 为实时虚拟机优化 vCPU 固定 复制链接链接已复制到粘贴板!
要正确设置 RHEL 实时(RT)虚拟机(VM),您必须首先有一个计划来优化将虚拟机的虚拟 CPU (vCPU)固定到主机的物理 CPU。
先决条件
- 您已为实时虚拟化设置主机系统。具体步骤请参阅 为实时虚拟机配置主机环境。
已安装
hwloc软件包。# dnf install hwloc- 您已评估了虚拟机的性能,以获取基础进行验证。有关执行此操作的各种方法,请参阅 虚拟机性能监控工具。
流程
查看主机系统的 CPU 拓扑:
# lstopo-no-graphics以下示例输出显示了启用了超线程的 32 个物理内核的系统,分为 2 个插槽("软件包"),每个内核有 4 个 CPU 划分。系统还有 250 GB RAM 分布到 2 个 NUMA 节点。
请注意,这个过程中的以下示例基于这个拓扑。
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)根据
lstopo-no-graphics的输出以及所需的实时虚拟机设置,确定如何将 vCPU 固定到物理 CPU。以下项目显示了对上述示例主机输出和具有 4 个 vCPU 的实时虚拟机有效 XML 配置:以下固定放置为每个 vCPU 使用专用内核。要使这样的固定配置生效,分配的物理 CPU 必须被隔离在主机上,且不得在它们上运行的任何进程。
<cputune> <vcpupin vcpu='0' cpuset='4'/> <vcpupin vcpu='1' cpuset='5'/> <vcpupin vcpu='2' cpuset='6'/> <vcpupin vcpu='3' cpuset='7'/> [...]以下固定放置为每个 vCPU 使用专用 L3 内核:
<cputune> <vcpupin vcpu='0' cpuset='16'/> <vcpupin vcpu='1' cpuset='20'/> <vcpupin vcpu='2' cpuset='24'/> <vcpupin vcpu='3' cpuset='28'/> [...]
验证
- 再次监控虚拟机的性能,并将值与之前获取的基准进行比较。有关执行此操作的各种方法,请参阅 虚拟机性能监控工具。
4.2. 安装 RHEL 实时客户机操作系统 复制链接链接已复制到粘贴板!
要为实时工作负载准备虚拟机(VM)环境,请创建新虚拟机并调整其配置以实现低延迟性能。
先决条件
- 您已将您的系统设置为托管实时虚拟机。具体步骤请参阅 为实时虚拟机配置主机环境。
- 您考虑了实时虚拟机的最佳 vCPU 固定配置是什么。如需更多信息,请参阅为实时虚拟机优化 vCPU 固定。
流程
使用
virt-install工具创建带有以下属性的 RHEL 10 虚拟机:- 虚拟机有 2 个或更多分配的 vCPU
- 虚拟机使用巨页来支持内存。
以下示例命令创建一个名为
RHEL10-RT的虚拟机,它符合上述要求:# 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'安装完成后,关闭虚拟机。
# virsh shutdown <RHEL10-RT>打开虚拟机的 XML 配置。
# virsh edit <RHEL10-RT>调整 CPU 配置,如下所示:
在 AMD64 和 Intel 64 主机上:
<cpu mode='host-model' check='partial'> <feature policy='require' name='tsc-deadline'/> </cpu>在 64 位 ARM 主机上:
<cpu mode="host-passthrough" check="none"/>
从虚拟机中删除非必要的虚拟硬件,以提高性能。
删除
virtioRNG 设备的 部分。<rng model='virtio'> <backend model='random'>/dev/urandom</backend> <address type='pci' domain='0x0000' bus='0x07' slot='0x00' function='0x0'/> </rng>删除 USB 设备,如下所示:
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x1234'/> <product id='0xabcd'/> </source> </hostdev>删除串行设备,如下所示:
<serial type='dev'> <source path='/dev/ttyS0'/> <target port='0'/> </serial>删除 QXL 设备。
<video> <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'/> </video>禁用图形显示。
<graphics type='vnc' ports='-1' autoport='yes' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'> </graphics>在 USB 控制器设置中,将模型改为
none以禁用它。<controller type='usb' index='0' model='none'/>删除 Trusted Platform 模块(TPM)配置,使其不会影响 RT 操作。
<tpm model='tpm-crb'> <backend type='emulator' version='2.0'/> </tpm>禁用
memballoon功能。<memballoon model='none'/>在配置的
<features> 部分中,确保禁用PMU和vmport功能,以避免它们可能导致的延迟。<features> [...] <pmu state='off'/> <vmport state='off'/> </features>在 64 位 ARM 主机上,只需要禁用
PMU。<features> [...] <pmu state='off'/> </features>
编辑 &
lt;numatune> 部分以设置 NUMA 节点。<numatune> <memory mode='strict' nodeset='1'/> </numatune>编辑 配置的
<cputune> 部分,以按照为实时虚拟机优化 vCPU 固定 中的计划设置 vCPU NUMA 固定。以下示例使用 4 个 vCPU 和这些参数配置虚拟机:
- 从 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> 配置满足以下要求:- 分配物理内核的同级功能,以执行实时或内务任务。
- 在同一虚拟机上同时使用物理内核同级设备。
- 对于固定到同一物理内核的同级的 vCPU,请将 vCPU 分配给同一任务(实时进程或日常处理)。
请注意,上面的示例配置满足这些要求。
- 保存并退出 XML 配置。
故障排除
- 请参阅 RHEL 实时 guest 安装故障排除。
验证
在主机上,查看虚拟机的配置,并验证它具有必要的参数:
# virsh dumpxml <RHEL10-RT>
后续步骤
4.3. 实时配置 RHEL 客户机操作系统 复制链接链接已复制到粘贴板!
要为实时工作负载优化 RHEL 10 虚拟机(VM)环境,请配置客户机操作系统以实现低延迟性能。
先决条件
- 已安装 RHEL 10 虚拟机,并根据实时工作负载调整其配置。具体步骤请参阅 安装 RHEL 实时客户机操作系统。
流程
- 启动虚拟机。
在客户端操作系统中安装实时软件包。
# dnf install -y kernel-rt tuned tuned-profiles-realtime tuned-profiles-nfv realtime-tests调整
tuned的虚拟客户机配置文件。要做到这一点,请编辑/etc/tuned/realtime-virtual-guest-variables.conf文件并添加以下行:isolated_cores=<isolated-core-nrs> isolate_managed_irq=Y将 <
isolated-core-nrs> 替换为您要为实时工作负载隔离的主机内核数。确定在客户端操作系统中禁用 irqbalance。
# rpm -q irqbalance && systemctl stop irqbalance && systemctl disable irqbalance激活 tuned 的 realtime-virtual-guest 配置集。
# tuned-adm profile realtime-virtual-guest确保客户机操作系统默认使用实时内核。
# grubby --set-default vmlinuz-5.14.0-XXX.el10.x86_64+rt- 与主机中的相同,为客户端操作系统配置巨页。具体步骤请参阅 为实时虚拟化主机配置巨页。
验证
- 对客户端操作系统执行与主机上的相同压力测试。具体步骤请查看 Stress 测试实时虚拟化系统。
故障排除
如果压力测试的结果超过所需的延迟,请执行以下操作:
- 再次在主机上执行压力测试。如果延迟结果是子优化,请调整 TuneD 和巨页的主机配置,并重新测试。具体步骤请参阅 为实时虚拟化主机配置 TuneD,并为实时虚拟化主机配置巨页。
-
如果主机上的压力测试结果显示足够低的延迟,但在它们没有的客户机上,请使用
trace-cmd工具来生成详细的测试报告。具体步骤请参阅 收集数据来排除 RHEL 实时客户机(红帽知识库)的延迟问题。
4.4. 为实时虚拟机设置缓存保护 复制链接链接已复制到粘贴板!
驱除缓存行可能会导致实时虚拟机(VM)中的性能问题。要避免这个问题,请使用 User Interface for Resource Control (resctrlfs)功能管理您的缓存和缓存分区:
- 将主机系统的主内存缓存划分为分区
- 为每个分区分配单独的任务
- 将运行实时应用程序的 vCPU 分配给一个缓存分区
- 将运行日常工作负载的 vCPU 和主机 CPU 分配给不同的缓存分区
先决条件
您已在主机上创建了一个实时虚拟机。具体步骤请参阅 安装 RHEL 实时客户机操作系统。
以下流程假设您有以下 NUMA 固定将 vCPU 分配给 CPU。
<cputune> <vcpupin vcpu='0' cpuset='16'/> <vcpupin vcpu='1' cpuset='17'/> <vcpupin vcpu='2' cpuset='18'/> <vcpupin vcpu='3' cpuset='19'/>您的主机使用支持 L2 或 L3 缓存分区的 Intel 处理器。要确定是这种情况:
安装
intel-cmt-cat工具。# dnf install intel-cmt-cat使用
pqos实用程序显示您的核心缓存详细信息。# pqos -d [...] Allocation Cache Allocation Technology (CAT) L3 CAT此输出表示您的 CPU 支持 L3 缓存分区。
流程
挂载
resctrl文件系统。这样便可使用处理器的资源控制功能。# mount -t resctrl resctrl /sys/fs/resctrl根据您的系统是否支持 L2 还是 L3 缓存分区,名为
L2或L3的子目录挂载到/sys/fs/resctrl/info目录中。以下步骤假设您的系统支持 L3 缓存分区。移到缓存目录并列出其内容。
# cd /sys/fs/resctrl/info/L3/; ls bit_usage cbm_mask min_cbm_bits num_closids shareable_bits sparse_masks查看
cbm_mask文件的值。# cat cbm_mask ffff这个值代表十六进制代码中的缓存位掩码。
ffff表示工作负载可以使用所有 16 位的缓存。查看 "shareable_bits" 文件的值。
# cat shareable_bits 0这个值代表了由其他执行进程(如 I/O)共享的 L3 缓存的分区,因此不应在独占缓存分区中使用。
0表示您可以使用所有 L3 缓存分区。查看
schemata文件,以查看全局缓存分配。# cat /sys/fs/resctrl/schemata L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ffff;10=ffff;12=ffff;14=ffff此输出显示,对于 L3 缓存分区,CPU 插槽 0、2、4、6、8、10、12 和 14 已完全分配给默认控制组。在本例中,CPU 插槽 16 到 19 被固定到 vCPU 0-3。
确定您要为实时应用程序设置的缓存分发。例如,对于实时应用程序和内务应用程序,平均分配 8 MB:
-
实时应用程序的缓存位掩码为
ff00 -
housekeeping 应用程序的缓存位掩码为
00ff
-
实时应用程序的缓存位掩码为
使用日常进程所需的缓存分配来调整默认的
schemata文件。例如,要将 8MB 分配给 CPU 套接字 8,请执行以下操作:# echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=00ff;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/schemata为实时进程创建特定的控制组,如
part1。# mkdir /sys/fs/resctrl/part1为
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有了这个设置,L3 缓存 8 会将一半的缓存分配用于实时进程,其他一半用于内务进程。所有其他 L3 缓存都可以由实时进程和内务操作自由使用。
将固定到实时 vCPU 的 CPU (本例中为 17、18 和 19))分配给此控制组。
# echo 17,18,19 > part1/cpus_list
验证
如果您之前测试了虚拟机延迟,请再次运行
cyclictest工具。具体步骤请查看 Stress 测试实时虚拟化系统。如果最大延迟低于之前,则代表您已正确设置了缓存保护。
4.5. RHEL 实时客户机安装故障排除 复制链接链接已复制到粘贴板!
在 实时主机上安装 RHEL 10 虚拟机(VM) 时,您可能会遇到以下错误之一。使用以下建议修复或临时解决这些问题。
错误:主机不支持任何虚拟化选项
- 确定在主机 BIOS 中启用了虚拟化
检查主机上的 cpu 标志是否包含 Intel 的
vmx或 AMD 的svm。$ cat /proc/cpuinfo | grep vmx检查
lsmod命令是否检测到kvm和kvm_intel或kvm_amd模块。$ lsmod | grep kvm确保已安装了
kernel-rt-kvm软件包。$ dnf info kernel-rt-kvm-
检查
/dev/kvm设备是否存在。 -
运行
virt-host-validate程序来检测任何其他问题。 - 运行 kvm-unit-tests。
访问磁盘镜像时的权限相关问题
-
在
/etc/libvirt/qemu.conf文件中,取消注释group =和user =行。 重启
virtqemud服务。$ service virtqemud restart
-
在