Une fois que l'on a un parc supervisé, on peut souhaiter de temps en temps procéder à des optimisations sur sa consommation, et tout particulièrement sur sa consommation CPU car elle a un coût non négligeable. Une fois les sondes les plus consommatrices de CPU identifiées, une optimisation de ces dernières sera la méthode la plus efficace afin de consommer moins de CPUs, et possiblement avoir des serveurs plus petits, ou moins de serveurs.
Pour cela, nous allons extraire des informations issues de la commande shinken-scheduler-export-data afin d'avoir:
Pour cela, nous allons avoir besoin d'un dump de données avec en option une prévision de la charge sur une période, disons par exemple 1 heure. Il suffit alors de lancer la commande comme ceci:
shinken-scheduler-export-data --full --simulation-extra-period=3600 |
Avec ce lancement, les noms (hôte, check, commandes et royaumes) seront présents dans l'export. Il est tout à fait possible de faire l'analyse sur un export sans les noms en retirant l'option --full. Cependant pour ne pas avoir à manipuler des uuid lors de la lecture des résultats nous préconisons un export avec les noms. |
L'importation du fichier .csv généré est décrit dans shinken-scheduler-export-data : export des données du Scheduler
A partir des nombreuses données de checks que nous avons, nous allons devoir procéder à une consolidation afin d'avoir notre résultat facilement exploitable. Pour cela nous allons utiliser un tableau croisé dynamique.
Un tableau croisé dynamique dans un tableur est un outil d'analyse de données qui vous permet de créer une vue synthétique et facile à lire d'une grande quantité de données ( ici nos exécutions de checks ). On y choisit les données à inclure, comment les organiser et comment les synthétiser, filtrer, classer et totaliser les données en fonction de nos besoins.
Afin de pouvoir faire une analyse complète, notre objectif sera ici d'obtenir:
La création du tableau récapitulatif passe par la création d'un Tableau croisé dynamique. Depuis votre Feuille d'importation des données, il faut cliquer sur Insertion→ Tableau croisé dynamique, et valider:
|
Arrivé sur la nouvelle feuille, Excel demande quelles lignes sélectionner, dans le bloc de droite nommé "Champs de tableau croisé dynamique".
Dans notre cas, il faut faire glisser le champ command_name ( ou bien command_name_anonymous_hash si on a une version anonyme de l'export ) vers le bloc "Lignes":
|
Ceci permet de définir nos lignes dans la colonne A avec l'ensemble de nos commandes.
A chaque commande, il faut lui assigner une ( ou plusieurs ) "Valeurs". Pour cela, on fait glisser le champ "cpu_time" vers le bloc "Valeurs" afin d'avoir pour chaque royaume son champs cpu_time associé:
|
A noter que, par défaut, Excel prends le nombre d’occurrences du champ cpu_time comme "Valeur", ce qui n'est pas ce qui est souhaité ( "Nombre de cpu_time" ).
Une modification des "Paramètres des champs de valeurs" est nécessaire sur "Nombre de cpu_time" qu'il faut changer en Somme pour donner au final "Somme de cpu_time":
|
On obtient alors la somme en temps ( secondes ) consommée par chaque commande.
Le titre de la colonne n'étant pas des plus lisible pour notre analyse, on le changer en double cliquant dessus. On le renomme alors "Consommation CPU totale par check (en s)":
|
Notre première valeur est obtenue.
S'il est possible de trier par rapport au temps absolu consommé par un check et donc avoir les plus consommateurs, il peut être également très intéressant d'avoir leur pourcentage par rapport à la consommation totale.
Ceci en facilitera grandement la lecture, et il sera ainsi possible de savoir de quel ordre de grandeur une optimisation sera bénéfique pour la consommation.
Il faut rajouter une seconde fois le champ "cpu_time" dans les valeurs, ce qui rajoute une nouvelle colonne:
|
|
Le changement dans cette étape consiste à changer l'affichage dans le menu "Afficher les valeurs" en choisissant "% du total général" pour obtenir la Répartition de la consommation CPU par check:
|
Comme précédemment, on change le titre par défaut en double cliquant dessus. On le renomme alors "Consommation CPU totale par check (en s)":
|
Ces deux premières colonnes nous permettent de trier rapidement les checks les plus consommateurs.
La suivante, et dernière, va nous permettre d'affiner l'analyse en calculant le temps moyen de CPU par exécution de check.
La dernière statistique qui va nous intéresser pour prioriser nos actions d'optimisation va être d'obtenir la consommation CPU moyenne pour une exécution de check.
Pour cela, il faut rajouter une dernière fois le champ "cpu_time" dans les valeurs, exactement comme pour les deux précédentes colonnes:
|
Pour cette colonne, il faut changer le calcul de Nombre à un calcul en "Moyenne de cpu_time":
|
Comme pour les deux colonnes précédentes, on change le titre de la colonne en change en double cliquant dessus. On le renomme alors "Consommation CPU moyenne pour une exécution (en s)":
|
On obtient alors le tableau final que l'on peut analyser afin d'identifier de la manière la plus efficace possible la ou les checks les plus consommateurs. Il est ainsi possible de se concentrer sur l'optimisation des checks qui auront un véritable impact sur les performances de la plateforme.
|
Faisons l’exercice avec notre exemple. Nous avons 3 checks ( leur temps d’exécution est extrait de la colonne "Consommation CPU moyenne pour une exécution (en s)" ):
En ne regardant que cette statistique, et en ne se basant que sur notre intuition, on serait tenté de se dire que le check le plus consommateur est dump-check-example-1 avec ses 5s de temps d’exécution par check. C'est en effet un temps anormal pour un check de supervision.
Mais si on regarde mieux notre tableau on s’aperçoit que ce check ne représente qu'environ 25% du temps CPU total consommé ( 23,91%, colonne "Répartition de la consommation CPU par check" ). Il n'est ainsi pas le plus consommateur/prioritaire.
Contrairement à notre première intuition, le check le plus consommateur est dump-check-example-2, avec ses plus de 75% de temps CPU total consommé ( 75,93% ). Il est donc intéressant de voir les gains que l'on peut faire sur ce dernier, surtout qu'avec ses 200ms de temps d’exécution, il n'est pas léger, et donc des optimisations doivent être possibles.
Dans notre cas, nous avions pris un temps de 3600s=1h pour notre récupération d’ordonnancement. La somme totale des temps d'exécutions de toutes les checks est de 5445s, soit moins de 2h de temps de calcul ( 7200s ).
L'ensemble des checks consomment ainsi actuellement moins de 2 CPUs ( 5445/3600=1.5 CPUs ).
Si l'on souhaite ne consommer qu'un seul CPU sur cette plateforme, il faut ainsi gagner 5445-3600=1845s de temps de traitement:
| Dans notre cas, il faut donc un gain de 45% sur le check dump-check-example-2 afin de limiter la consommation CPU de la plateforme à 1 seul CPU. |