Qual é o significado de definir afinidade de CPU (por exemplo, SCHED_SETAFFINITY) em uma máquina virtual?

0

Existem maneiras de definir afinidades em processos / threads.
Por exemplo, diga ao SO para rodar somente em um núcleo específico.
Ou diga a um tópico para rodar em um núcleo específico.

O que tudo isso significa em uma máquina virtual, onde a CPU é realmente virtual (e mapeada de alguma forma para a CPU física)?

    
por hudac 12.06.2018 / 13:46

2 respostas

1

Apenas definiria a afinidade dentro da VM e dentro das CPUs virtuais. Isso pode não ter um relacionamento estático com as CPUs reais do host, mas supondo que o host da VM tente manter as CPUs virtuais em CPUs físicas separadas (o que provavelmente deve), definir a afinidade no convidado ainda pode ajudar a manter o processo em uma única CPU, dependendo dos tipos de carga no host e na convidado.

Se você tiver tantas CPUs físicas no host quanto virtuais nos convidados, o host da VM não precisará mover as CPUs virtuais. Mas como você provavelmente tem mais virtuais, eles precisam ser movidos, e não há muito o que fazer sobre isso no convidado. Você precisaria definir a afinidade no nível do host também, se necessário.

Ou seja, supondo que não haja nenhum driver especial para revelar as CPUs do sistema host para a VM.

    
por 12.06.2018 / 14:59
1

Posso ver um caso em que uma VM pode se beneficiar de SCHED_SETAFFINITY(2) . Vamos pegar uma VM "especial" com 2 "sockets virtuais" (mapeados e fixados em 2 CPUs físicas diferentes no mesmo host) e 2 "núcleos virtuais" cada. Você pode querer certificar-se de que o processo que deseja definir com afinidade dentro do convidado tenha menos custos de desempenho, como o descrito nas páginas de manual:

Restricting a thread to run on a single CPU also avoids the performance cost caused by the cache invalidation that occurs when a thread ceases to execute on one CPU and then recommences execution on a different CPU.

Por que você faria esse tipo de configuração? Eu não sei :), mas por ter 2 sockets virtuais você ainda terá a invalidação do cache.

Há também alguns benchmarking usando 24 núcleos com várias disposições no vmware (1 socket, 24 core - 24 socket, 1 core - 2 socket, 12 core). No passado, esse conjunto de afinidade podia ser usado para um software que exigisse um "licenciamento de soquete de CPU" (cof, cof, Oracle ...) assim que pudesse provar que o processo estava ligado a um soquete, mas hoje há muitos desses as soluções estão ficando mais claras no licenciamento de ambientes virtuais, exigindo que todas as CPUs físicas em que a VM esteja em execução sejam licenciadas. E como você pode ver a solução vmware cria distinções vNUMAS com base em quantos vSockets você tem.

Além disso, definir a afinidade dentro de convidados pode aumentar a complexidade de algo que poderia ser feito configurando a afinidade no hypervisor ao mover a VM em toda a volta.

    
por 12.06.2018 / 15:03