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.
La quantité de CPU virtuels attribués est importante. Le logiciel exécuté dans la machine virtuelle n'est pas conscient du fait qu'il se trouve dans une machine virtuelle et que l'hôte est capable de plus que ce que la machine virtuelle est présentée. Donc, si vous exécutez un logiciel qui peut tirer parti de plusieurs cœurs de processeur, dans une machine virtuelle à laquelle un seul cœur est affecté, le logiciel ne planifiera qu'un seul cœur pour ses tâches, et la machine virtuelle n'utilisera également qu'un seul cœur hôte à un temps. Une fois que vous avez donné plus de cœurs à la machine virtuelle, le logiciel peut planifier davantage de tâches parallèles, que le processeur des hôtes planifiera pour la machine virtuelle.
Faites attention à ne pas trop donner de VM, afin de ne pas provoquer de conflits, si une VM a plus de cœurs virtuels que l'hôte, la VM se disputera contre elle-même, et en cas d'hyperviseurs programmés par des gangs, comme vmware, la VM ne jamais pouvoir exécuter quoi que ce soit (l'option de surutilisation est bien sûr bloquée par la couche de gestion).
la source