Se eu entendi sua pergunta corretamente, o que você quer é restringir o hipervisor para que ele possa usar apenas uma única CPU / núcleo (ou um número limitado) para seus próprios processos, interrupção de tratamento e tudo mais. E que todos os outros núcleos podem ser atribuídos pelo libvirt aos sistemas convidados.
Relativamente simples é o parâmetro de inicialização isolcpus
, que permite isolar uma ou mais CPUs do agendador. Isso impede que o planejador agende qualquer encadeamento de espaço do usuário nessa CPU.
i.e. no seu hipervisor em /etc/default/grub
set:
GRUB_CMDLINE_LINUX="... quiet isolcpus=0,1"
que deve impedir que quaisquer programas de espaço do usuário no hipervisor usem núcleos > 1. O Libvirt pode, então, fixar servidores virtuais aos núcleos livres remanescentes.
Não tenho certeza se o parâmetro de inicialização isolcpus
também garante que todas as interrupções sejam restritas a esses núcleos. Caso contrário, as interrupções também terão sua própria propriedade de afinidade, smp_affinity
, que define os processadores que manipularão a solicitação de interrupção.
O valor de afinidade de interrupção para uma solicitação de interrupção específica é armazenado no arquivo /proc/irq/irq_number/smp_affinity
associado e o padrão é definido com /proc/irq/default_smp_affinity
. smp_affinity é armazenado como uma máscara de bits hexadecimal representando todos os processadores no sistema. O valor padrão é f, o que significa que uma solicitação de interrupção pode ser manipulada em qualquer processador no sistema. Configurar este valor para 1 significa que apenas o processador 0 pode manipular a interrupção.
A ferramenta para controlar o processador e a afinidade de agendamento para o RHEL e o CentOS 7 é chamada tuna