Les machines virtuelles de chaque hyperviseur que je connais sont capables d'utiliser des processeurs virtuels supplémentaires sur lesquels planifier des threads d'exécution simultanés supplémentaires.
C'est exactement cette couche d'abstraction entre la machine physique et la machine virtuelle qui fait que cela ne fonctionne pas comme vous le décrivez. La machine virtuelle ne sait pas combien de cœurs la machine physique possède. La machine virtuelle ne "voit" pas les CPU (ou les cœurs) physiques sur la machine physique. L'hyperviseur donne à la machine virtuelle autant de processeurs virtuels, et le système d'exploitation invité utilise ces processeurs virtuels pour planifier des threads simultanés supplémentaires ... Le nombre total de processeurs virtuels que l'hyperviseur distribue aux machines virtuelles peut même dépasser le nombre de processeurs physiques / noyaux dans la machine.
Autrement dit, une machine virtuelle, lorsqu'elle est affectée à un seul processeur virtuel, planifie ses threads comme si elle n'avait qu'un seul processeur. Peu importe le nombre de cœurs dans la machine physique sous-jacente. (Bien qu'il soit intéressant de noter que la machine physique peut planifier un thread VM sur un core physique pour un quantum de thread ou une tranche de temps, puis l'exécuter sur un core physique différent la prochaine fois qu'il est prévu de s'exécuter. La machine virtuelle a cependant, tout ce qu'il sait, c'est qu'il ne peut planifier qu'un seul thread à la fois, l'un après l'autre, car il n'a qu'un seul processeur virtuel.)
Et soyons très clairs sur nos conditions ici. Vous affectez des vCPU, ou CPU virtuels, aux machines virtuelles, et non aux "cœurs". Les cœurs (par lesquels je suppose que vous entendez des unités de traitement physiques qui partagent un seul socket physique) n'équivalent pas à des processeurs virtuels. Il y a une couche d'abstraction entre eux. Si une machine virtuelle n'a qu'un seul processeur virtuel affecté, elle ne peut planifier qu'un seul thread à exécuter à la fois. C'est pourquoi votre machine virtuelle s'exécute plus rapidement avec 2 à 4 processeurs virtuels qui lui sont attribués - car elle est désormais en mesure de planifier plusieurs threads pour qu'ils s'exécutent simultanément.
Cependant, il y a certainement une loi de rendements décroissants ici, car un nombre excessif de CPU virtuels entraîne des frais généraux de plus en plus élevés dans des choses comme la synchronisation, etc.
Il existe de légères différences entre la façon dont les hyperviseurs Hyper-V et VMware planifient l'exécution des threads de machine virtuelle, et ils diffèrent dans leur approche de la «surabonnement» des ressources physiques, mais c'est un bon concept général pour commencer.