Estou tentando configurar um sistema pelo qual tenho algum processo em um conjunto de hosts que estão em um cpuset (blindado), enquanto todo o resto (ou seja, todas as VMs) estão em outro. O objetivo aqui é ter um sistema hiperconvergente onde as VMs rodam em algum conjunto arbitrário de núcleos de CPU, enquanto o processo de armazenamento roda nos outros núcleos, com isolamento. Selecionei cpuset para realizar essa tarefa, pois parece a maneira "mais fácil" de fazê-lo.
No entanto, isso não parece funcionar corretamente. As VMs podem ser movidas ao configurar o escudo cset pela primeira vez, mas iniciar as VMs posteriormente resulta em um erro como:
libvirt: Cgroup error : Invalid value '0-31' for 'cpuset.cpus': Invalid argument
Claramente, está tentando colocar a VM no cset raiz, o que não é permitido. Isso é com uma configuração muito padrão, apenas especificando um número de núcleos na VM sem qualquer preocupação com IDs de CPU individuais ou qualquer ajuste (que é um requisito para que essa configuração funcione; os nós podem ser assimétricos, ter diferentes contagens de núcleos, topologias , etc. enquanto as VMs podem migrar ao vivo em torno delas).
Mas, em geral, eu gostaria de saber: o Libvirt/KVM pode ser configurado para usar um cpuset específico por padrão, sem reconfigurar as VMs de forma alguma (sem travessuras de fixação manual da CPU) e sem qualquer ajuste manual em um per- base do processo?
Em hosts baseados em systemd, todas as VMs são colocadas em um cgroup abaixo
/machine.slice
, portanto, se você definir a máscara de CPU/machine.slice
, ela será aplicada a todas as VMs. Da mesma forma, se você definirCPUAffinity
,/etc/systemd/system.conf
isso pode fazer com que todos os processos não VM evitem as CPUs usadas para VMs.