Pourquoi l'augmentation du «nombre de processeurs logiques» pour une machine virtuelle hébergée Hyper-V augmente-t-elle les performances de cette machine virtuelle?

9

À ma connaissance, les machines virtuelles (en supposant qu'elles Relative Weightsont égales) obtiennent une part égale du processeur.

Lorsque la machine virtuelle dispose d'un certain temps de traitement, peu importe si la machine virtuelle voit un seul cœur à utiliser ou plusieurs cœurs, car le traitement provient d'un tableau de processeurs sur l'hôte Hyper-V. Cependant, lorsque je définis le Number of logical processorsparamètre de 1 à 4 dans Hyper-V pour une machine virtuelle particulière, je constate une énorme augmentation des performances.

Les spécifications de ma configuration actuelle sont approximativement:

  • L'hôte Hyper-V a 32 Go de RAM, 24 processeurs logiques (mauvais mot?), Quelques To d'espace.

  • Les machines virtuelles disposent de 6 Go de RAM, 1 ou 4 cœurs, quelques centaines de Go d'espace et exécutent 2008 R2.

J'ai connu une chose similaire sur les anciennes configurations Hyper-V.

Blackjack00
la source

Réponses:

20

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.

Ryan Ries
la source
7
@ Flapjack00 Non ... c'est exactement le contraire de ce que je viens de dire. 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) 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.
Ryan Ries
1
Ah! Ainsi, dans ce cas, une machine virtuelle configurée avec 4 vCPU peut planifier 4 threads à la fois. En supposant que mon hôte dispose de suffisamment de vCPU, ces 4 threads pourraient être traités en même temps?
Blackjack00
1
@ Flapjack00 "En supposant que mon hôte dispose de suffisamment de vCPU disponibles" - L'hôte n'a pas de vCPU, la VM en a. L'hôte a des cœurs (ou, plus exactement, des processeurs logiques - un seul cœur peut avoir plusieurs processeurs logiques, comme avec Hyper-threading) auxquels les vCPU sont assignées.
BlueRaja
2
@Dan, c'est un problème spécifique à VMware. Cela n'affecte pas Hyper-V.
Jake Oshins
1
Les "x vCpu nécessitent des verrous Y cpu" que VMware possédait ont été supprimés dans ESX 3.5, donc cela ne s'applique plus vraiment à aucun hyperviseur moderne. Cela étant dit, vous devez faire attention à ne pas affecter de ressources inutiles à vos machines virtuelles, et les processeurs virtuels sont particulièrement importants. Trop d'entre eux et vous perdrez globalement les performances.
pauska
3

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).

Dyasny
la source