Raison du plugin

Ce plugin a pour but d'évaluer les performances d'un nouveau mécanisme de gestion des arborescences basé sur Using rational numbers to key nested sets. Il fait suite à la discussion Gestion des sous-éléments sur le wiki principal de GLPI.

Il agrège tous les équipements, tous les composants (Item_Devices) et tous les enfants des ports réseau en une unique arborescence. Cela permet de gonfler cette arborescence afin de faire des tests de performance.

Présentation d'un noeud de l'arborescence

Plutôt que de créer une arborescence par classe (Computer, NetworkEquipment ...), il doit être possible, si les performances le permettent, de créer une unique arborescence regroupant l'ensemble des composants d'un noeud.
Ainsi, un noeud, possède uniquement un lien vers l'item dans l'orborescence :

 CREATE TABLE `glpi_plugin_treeevol_trees` (
              `id` int(11) NOT NULL AUTO_INCREMENT,

 # definition de l'item
              `itemtype` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
              `items_id` int(11) NOT NULL DEFAULT '0',

 # nombre rationnel du noeud dans l'arborescence
              `numerator` int(11) NOT NULL,                             
              `denominator` int(11) NOT NULL,

 # nombre rationnel du noeud suivant dans l'arborescence
              `sibling_numerator` int(11) NOT NULL,
              `sibling_denominator` int(11) NOT NULL,

 # Clef pour accelerer les requetes
              PRIMARY KEY (`id`),
              UNIQUE KEY `unicity` (`itemtype`,`items_id`),
              UNIQUE KEY `node` (`numerator`,`denominator`),
              UNIQUE KEY `sibling` (`sibling_numerator`,`sibling_denominator`)
             ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

Installation

Après avoir installé le plugin par la manière classique, il faut dans son panneau (plugins->Tree evolution checker). Il n'y a qu'une unique action : "Generate".
Cette opération est relativement lourde car elle extrait toutes les informations de la base de données pour générer l'arborescence.
Mais à terme, cette opération pourrait rejoindre install/update_08??_08??.php dans le processus standard de mise à jour de la base de données.

Mise à jours de l'arborescence

L'arborescence est automatiquement mise à jours dès qu'il y a ajout ou suppression d'un item. La mise à jours d'un noeud n'est pas encore implémenter : cela n'est pas très utile pour les évaluations dès lors que l'on peut ajouter ou supprimer un noeud. L'algorithme de mise à jours est relativement simple (cf. 3.2 "Moving subtrees" de l'article référencé).

Test de performance

Performance sur un item donné

Pour vérifier la performance du système, après avoir généré l'arborescence, on peut se rendre sur n'importe quel noeud de la base (Computer, NetworkEquipment, Item_Devices, NetworkPort ...) et aller dans son onglet "TreeEvol tree". On trouvera directement les noeuds parents dans l'ordre, ainsi que tous les noeuds enfants du noeud courant triés par type. L'information importante, en mode débug, est le temps total nécessaire pour obtenir cet information.

À titre de comparaison, sur mon système, avec 431 ordinateurs et 12942 entrées dans la table glpi_plugin_treeevol_trees, les requêtes pour cet onglet durent 9 ms. La génération complète de la table dure 42,5 s.

MoYo : génération à partir d'un bigdump : 223s (35509 entrées dans la nouvelle table). Affichage des éléments : On compare les requêtes avec quelles autres requetes ? Faudrait mettre les 2 système en parallèle non pour pouvoir comparer facilement ?

Web : cf. l'ajout ci-dessous.

requête "comme la recherche globale".

Il est possible de lancer des recherches similaires à la recherche globale (menu Assets->Global). Pour cela, il faut se rendre dans la page de recherche associée au plugin ($CFG_GLPI['root_doc'].'/plugins/treeevol/front/search.php'). On pourra comparer deux recherches identiques avec l'ancienne méthode et la nouvelle méthode. Seul le AND est disponible pour le moment.

Comparaison sur les arborescences.

Le plugin intègre une réimplantation des arborescences Location et Entity. Pour les générer, il faut aller sur la page de génération ($CFG_GLPI['root_doc'].'/plugins/treeevol/front/generator.php') et demander leur génération.

Ensuite, on peut se rendre sur l'onglet du plugin afin de vérifier les performances.

Pour générer une arborescence de locations "lourde", on peut utiliser le script : ($CFG_GLPI['root_doc'].'/plugins/treeevol/front/create_locations.php'). Il générera une arborescence de 4 niveau où chaque élément contient 10 descendants directs (en tout : 11.111 noeuds dans l'arborescence).

Dans le cas du noeud racine, les recherches entre l'ancien mécanisme et le nouveau mécanisme pourront être sensiblement identiques, bien qu'un petit peu moins favorable lorsque le cache est vide. En revanche, avec le nouveau mécanisme, est beaucoup plus souple car on peut obtenir directement les champs qui nous intéressent des noeuds enfants. On peut également modifier la requête pour restreindre en intégrant d'autres contraintes dans la recherche. Par exemple, tous les lieux comportant 'armoire informatique' dans le nom ...

Si la différence entre les deux méthodes sur de petites bases de données n'est pas significative, le plus important sera sur de très grosses arborescences car les recherches peuvent atteindre plusieurs secondes.