我正在从 Xen 迁移到 Kvm。
在 Xen 中,我能够轻松地将主机 cpus 固定到来宾 vms,并将主机 cpus 固定到 "dom0"。
在 Kvm 中,我还可以轻松地将主机 cpu 固定到来宾 vm,但是,据我所知,没有什么可以阻止在主机操作系统上运行的应用程序使用这些 cpu。我想防止在主机上运行的程序饿死/增加客人延迟的情况。
我可以手动执行详细的 cgroup 策略,但也许我只是缺少 libvirt / centos7 中的设置?
此外,还有一个供客人使用的“emulatorpin”设置。我应该将“模拟器”固定到专用主机 CPU,还是应该将其限制在来宾 CPU 上?目标是尽可能地限制 guest 的延迟。
如果我正确理解您的问题,您想要实现的是限制管理程序,使其只能使用单个 CPU/内核(或有限数量)来处理自己的进程、中断处理和所有内容。libvirt 可以将所有其他内核分配给来宾系统。
相对简单的是
isolcpus
引导参数,它允许您将一个或多个 CPU 与调度程序隔离开来。这可以防止调度程序在此 CPU 上调度任何用户空间线程。即在您的虚拟机管理程序上
/etc/default/grub
:这应该可以防止虚拟机管理程序上的任何用户空间程序使用大于 1 的核心。然后 Libvirt 可以将虚拟服务器固定到剩余的空闲核心。
我不确定
isolcpus
引导参数是否也确保所有中断都将限制在这些内核上。否则,中断也有自己的关联属性 ,smp_affinity
它定义了将处理中断请求的处理器。特定中断请求的中断关联值存储在相关/proc/irq/irq_number/smp_affinity
文件中,默认设置为/proc/irq/default_smp_affinity
. smp_affinity 存储为代表系统中所有处理器的十六进制位掩码。默认值为 f,表示可以在系统中的任何处理器上处理中断请求。将此值设置为 1 意味着只有处理器 0 可以处理中断。用于控制 RHEL 和 CentOS 7 的处理器和调度亲和性的工具称为
tuna
在 Linux 中,如果您希望进程仅使用主机中的特定 cpu,
taskset
命令可以提供帮助在两个 cpu 上运行一个新程序:
要更改已运行进程的 cpu 亲和性:
kvm中没有dom0,你有kvm内核模块,所以一切都集成在内核中,不像在xen中你有dom0作为特权域,所以你可以pin内核运行的进程。
isolcpus
现在已弃用:cpuset
与_libvirt