2.6. IBM Z 主机上的 RHEL KVM 建议
优化 KVM 虚拟服务器环境很大程度上取决于虚拟服务器的工作负载和可用资源。增强一个环境中性能的相同操作可能会对另一种环境产生负面影响。为特定设置找到最佳平衡可能是一项挑战,通常需要进行各种试验。
下面的部分论述了在 IBM Z 和 LinuxONE 环境中将 OpenShift Container Platform 与 RHEL KVM 搭配使用时的一些最佳实践。
2.6.1. 将多个队列用于您的 VirtIO 网络接口
使用多个虚拟 CPU 时,如果您为传入和传出数据包提供多个队列,则可以并行传输软件包。使用 driver
元素的 queues
属性来配置多个队列。指定一个最小为 2 的整数,该整数不超过虚拟服务器的虚拟 CPU 数量。
以下示例规格为网络接口配置两个输入和输出队列:
<interface type="direct"> <source network="net01"/> <model type="virtio"/> <driver ... queues="2"/> </interface>
多个队列旨在为网络接口提供增强的性能,但也使用内存和 CPU 资源。首先为繁忙的接口定义两个队列。接下来,尝试为不太繁忙的接口定义两个队列,为繁忙的接口设置两个以上的队列。
2.6.2. 对虚拟块设备使用 I/O 线程
要使虚拟块设备使用 I/O 线程,您必须为虚拟服务器和每个虚拟块设备配置一个或多个 I/O 线程,以使用其中一个 I/O 线程。
以下示例指定了 <iothreads>3</iothreads>
来配置三个 I/O 线程,带有连续十进制线程 ID 1、2 和 3。iothread="2"
参数指定要使用 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. 为磁盘配置客户机缓存
将磁盘设备配置为由客户机而不是主机执行缓存。
确保磁盘设备的 driver 元素包含 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 文件中。
检查活跃配置集列表:
<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 控制器
此设置仅适用于使用 cgroups 版本 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