mardi 16 février 2016

[vSphere] CPU Scheduling - Part 1

Introduction

Pour mon 1er article sur vrun, je souhaite aborder le fonctionnement de l’ordonnanceur CPU sous VMware 5.1 et supérieur. Tout est parti d’une question qu’un client m'a posée:
« Si une VM possède 8 vCPU et que seuls 4 pCPU sont disponibles, la VM peut-elle s’exécuter ? »

Après avoir donné les premiers éléments de réponse au client, je me suis rendu compte qu’il existait en règle générale une mauvaise compréhension du fonctionnement de l’ordonnanceur CPU VMware.
J’espère donc que cette suite d’articles vous aidera à y voir un peu plus clair.

Terminologie

Avant de rentrer dans les explications, voici quelques termes de vocabulaire nécessaires pour la bonne compréhension de cet article :
   - CMP = une architecture mutli-core (CMP = chip multi-core)
   - pCPU = CPU physique du serveur ESXi 
   - vCPU (Virtual CPU) correspond au CPU d’une machine virtuelle. L'hôte ESXi le voit comme un processus ou « World ». 

Maintenant que nous sommes d'accord sur les termes utilisés, nous pouvons commencer !

Les enjeux de l’ordonnanceur CPU

Pour comprendre son fonctionnement, nous devons comprendre ses objectifs. Les enjeux de l’ordonnanceur sont multiples :

   - Efficace: maximiser l’utilisation des CPU physiques afin que les VMs soient performantes.
   - Réactif : ne pas laisser un environnement trop longtemps dans la file d’attente.
   - Equitable : respectueux des priorités (shares), réservations, limites de chaque vCPU.
   - Evolutif : les limites de la version 6 de vSphere ont été repoussées par rapport à la version 5.5.
           Par exemple, vSphere 6.0 supporte :
             - 128 vCPU par VM
             - 4 096 vCPU par ESXi
             - 1 024 VMs par ESXi

Principe de fonctionnement

Le principe de base de l’ordonnanceur VMware, est de considérer tous les « Worlds » comme égaux. On parle de « Proportional Share Algorithm ». L’ordonnanceur créé juste une file d’attente contenant les Worlds et les exécute dans l’ordre au fur et à mesure.

Bien évidemment,  le poids de chaque World est influencé par les réservations, limites et shares attribués à une VM. Cela permet donc de définir la priorité d’exécution d’un vCPU par rapport à un autre.

En fonction de la configuration de la VM (nombre de vCPU) et des paramètres appliqués à cette VM (réservation, limites et shares) l’ordonnanceur définit une valeur appelée « Entitlement » (ou "droit" en français) attribuée à chaque VM. C’est tout simplement la quantité de temps CPU que cette VM est autorisée à consommer. L’utilisateur peut jouer sur la valeur initiale de l’entitlement en attribuant une priorité (share) plus forte à une VM. Donc si une VM1 dispose de 2 fois plus de shares qu’une VM2, la VM1 aura 2 fois plus de temps CPU que la VM2.

L’Entitlement est donc une valeur numérique. Plus cette valeur est faible, moins la VM a consommé de temps CPU et donc plus la VM a une priorité forte pour la prochaine exécution. L’entitlement nous permet donc de chronométrer et comptabiliser (appeler aussi « charger ») en permanence le temps CPU alloué à chaque World. La priorité de chaque World est donc recalculée de manière dynamique contrairement à un système Unix classique.

Les différents états d’un vCPU

Maintenant que nous avons compris les enjeux et principes de base de l’ordonnanceur, nous allons regarder plus en détails les mécanismes apportés par VMware.

Chaque CPU virtuel de vos VMs se trouve à chaque instant dans un état précis. Voici les différents états possibles d’un vCPU (Virtual CPU):
-          RUN
-          READY
-          COSTOP
-          WAIT

 

Lors du 1er ajout dans la liste de l’ordonnanceur, le vCPU est mis soit en mode RUN soit en mode READY, cela dépend de la disponibilité des pCPU (Physical CPU). Si un pCPU est tout de suite disponible, le vCPU est alors schédulé et se trouve alors en RUN (exécution), sinon il est mis en mode en READY (prêt à être exécuté sur un pCPU).

Lorsqu’un vCPU est dans l’état READY et qu’un pCPU devient disponible, il est distribué par l’ordonnanceur de l’ESXi et passe dans l’état RUN. Il peut ensuite être dé-schedulé pour être mis dans l’état READY ou COSTOP (Nous verrons l’état COSTOP dans le chapitre « Co-Scheduling »).

Un vCPU est mis dans l’état WAIT lorsqu’il est en attente d’une ressource externe, comme une action de l’utilisateur par exemple, ou un accès disque trop lent. Une fois la ressource externe opérationnelle, le vCPU repasse dans l’état READY, c'est-a-dire prêt à être exécuté de nouveau.


Dans la prochaine partie, nous verrons les mécanismes mis en place par VMware pour optimiser les performances et répartir la charge entre les différents coeurs et socket CPU.

0 commentaires :

Enregistrer un commentaire