我正在从 Xen 迁移到 Kvm。
在 Xen 中,我能够轻松地将主机 CPU 固定到客户虚拟机,也可以将主机 CPU 到“dom0”。
在 Kvm 中,我还可以轻松地将主机 CPU 固定到客户虚拟机,但据我所知,没有什么可以阻止在主机操作系统上运行的应用程序使用这些 CPU。我想防止主机上运行的程序导致客户机耗尽/增加延迟的情况。
我可以手动制定一个详细的 cgroup 策略,但也许我只是缺少 libvirt / centos7 中的设置?
此外,还为客人提供“emulatorpin”设置。我应该将“模拟器”固定到专用主机 CPU,还是应该将其限制到客户机 CPU?目标是尽可能限制客户端的延迟。
答案1
如果我正确理解了您的问题,您想要实现的目标是限制虚拟机管理程序,使其只能使用单个 CPU/核心(或有限数量)来执行其自己的进程、中断处理和所有操作。并且 libvirt 可以将所有其他核心分配给客户系统。
相对简单的是isolcpus
启动参数,它允许您将一个或多个 CPU 与调度程序隔离。这可以防止调度程序在此 CPU 上调度任何用户空间线程。
即在您的虚拟机管理程序上/etc/default/grub
设置:
GRUB_CMDLINE_LINUX="... quiet isolcpus=0,1"
这应该可以防止虚拟机管理程序上的任何用户空间程序使用核心 > 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
答案2
在 Linux 中,如果你希望某个进程仅使用主机中的特定 CPU,taskset
命令可以帮助
在两个 CPU 上运行一个新程序:
taskset -c 0,2 /home/app/myprogramm
要更改已经运行的进程的 CPU 亲和性:
taskset -p -c 0,2 <pid_of_your_proccess>
kvm 中没有 dom0,您有 kvm 内核模块,因此所有内容都集成在内核中,不像在 xen 中您有 dom0 作为特权域,因此您可以固定内核运行的进程。