Souvent, une installation de notre application basée sur Debian et stable s'exécute sur une machine virtuelle - généralement dans VMware ESXi. Dans le cas général, nous n'avons pas de visibilité ou d'influence sur leur environnement de virtualisation et n'avons pas accès, par exemple, au client VMware vCenter ou équivalent. Je me concentre sur VMware ici, car c'est de loin le plus courant que nous voyons.
Nous aimerions:
- Dites à l'administrateur VMware d'un client: Vous pouvez exécuter notre application dans, par exemple, votre environnement VMware ESX, tant qu'il répond aux critères de performance X, Y et Z.
- Être en mesure de déterminer si les critères X, Y et Z sont effectivement respectés en continu (par exemple également en ce moment ), même sur un système en cours d'exécution (nous ne pouvons pas arrêter notre application et exécuter des tests de performance, et un test de performance initial ne suffira pas, car les performances dans les environnements virtuels évoluent avec le temps).
- Ayez confiance que si les critères X, Y et Z sont remplis, nous disposerons de ressources matérielles virtuelles adéquates pour exécuter notre application avec des performances satisfaisantes.
Maintenant, quels sont X, Y et Z?
Nous avons vu maintes et maintes fois que lorsqu'il y a des problèmes de performances, le problème n'est pas avec notre application, mais avec l'environnement de virtualisation. Par exemple, une autre machine virtuelle utilise des tonnes de CPU, de mémoire ou le SAN sur lequel les disques sont réellement stockés sont fortement utilisés par autre chose que notre application. Nous n'avons actuellement aucun moyen de le prouver ou de le réfuter.
Théoriquement, il pourrait également être possible que notre application soit parfois lente ... ;-)
Comment déterminer la cause première de nos problèmes de performances: l'environnement virtuel ou notre application?
Il y a généralement 3 domaines pour les problèmes de performances CPU, mémoire et E / S DISQUE.
CPU
Par exemple, dans VMware, l'administrateur peut spécifier la réservation et la limite, exprimées en MHz, mais est-ce que, par exemple, 512 MHz sur un hôte ESX est exactement le même que 512 MHz sur un autre hôte ESX, éventuellement dans un cluster ESX complètement différent?
Et comment mesurer si nous obtenons réellement cela? Pendant que notre application est en cours d'exécution, nous pouvons peut-être voir que nous sommes à 212% d'utilisation du CPU sur 4 CPU. Est-ce parce que notre application fait beaucoup ou parce qu'une autre machine virtuelle sur le même hôte exécute une tâche gourmande en processeur et utilise tout le processeur?
Mémoire (montgolfière?)
Si nous demandons par exemple 16 Go de RAM, qui est souvent configuré, mais à cause de la montgolfière , nous n'obtenons en fait que 4 Go, et surprise, notre application fonctionne mal.
On peut interroger les outils VMware sur la montgolfière actuelle, mais nous avons constaté qu'elle ment souvent (ou est inexacte au moins). Nous avons vu des exemples où le système d'exploitation pense qu'il y a 16 Go de RAM totale, la somme de la mémoire résidente (RSS) de tous les processus est de 4 Go de RAM, mais il n'y a que 2 Go de RAM libre, même lorsque VMware Tools nous dit qu'il n'y a pas de bulle: - (
De plus, le simple ajout de RSS n'est pas valide, car il pourrait facilement y avoir de la RAM partagée, par exemple une mémoire de copie sur écriture, donc 512 Mo + 512 Mo ne signifient pas nécessairement 1 Go mais pourraient signifier quelque chose de moins. Ainsi, on ne peut pas simplement soustraire RSS de tous les processus pour obtenir une mesure de la quantité de RAM qui devrait être libre et ainsi détecter de manière fiable le gonflement. On peut détecter certains cas de montgolfière, mais il existe d'autres cas où la montgolfière est en vigueur, mais non détectable par cette méthode.
E / S disque
Je suppose que nous pourrions représenter graphiquement au fil du temps le nombre de lectures et d'écritures sur disque, le nombre d'octets lus et écrits et le pourcentage d'attente d'E / S. Mais cela nous donnera-t-il une image précise des E / S disque? J'imagine que s'il y a un mineur Bitcoin en cours d'exécution dans une autre machine virtuelle utilisant tout le processeur, notre% d'attente d'E / S augmentera, même si le SAN sous-jacent donne exactement les mêmes performances, simplement parce que nos ressources de processeur diminuent, et donc l'attente d'E / S ( qui est mesurée en% ) augmente.
Donc, en résumé, quel langage pouvons-nous utiliser pour décrire, par exemple, à un administrateur VMware, quelles performances nous avons besoin, d'une manière portable et mesurable?
"It runs fine with x, y, and z"
n'est pas assez précis. Vous devez être en mesure de dire précisément à vos clients ce dont votre application a besoin. S'ils vous donnent ces ressources et que l'application fonctionne mal, la question ne l'est pas "What do we need from a resource perspective?"
, mais"Why is it performing poorly even though the proper resources have been allocated?"