L'objectif de cet article est de proposer des solutions et des outils en vue d'analyser et améliorer les performances d’une application Voozanoo4.

Edit me

Les quick wins

Cette section liste plusieurs actions permettant d’améliorer les performances d’une application Voozanoo4.

Limiter le nombre d’informations dans les formulaires

Dès qu’un formulaire devient trop long (trops de champs, trop d’opérations, etc.), il est nécessaire de le diviser en plusieurs pages.

Si l’on suit cette logique, l’utilisation du WidgetPages (les onglets) est à proscrire.

Passer les dataqueries en “lecture seule”

Passer les dataqueries qui n’ont pas besoin d’être en “lecture/écriture” (mode="rw") en “lecture seule” (mode="r") permet de désactiver les contrôles de cohérences, très gourmands en performances.

Désactiver les contrôles de cohérences sur les formulaires qui n’en n’ont pas besoin

Pour les formulaires où il n’est pas possible de passer tous les dataqueries en “lecture seule” mais où les tests de cohérences ne sont pas souhaités, il est possible de désactiver ces derniers en ajoutant un noeud <coherence_test>false</coherence_test> à la balise <config> du formulaire (utiliser la propriété “form.config” dans epicraft).

Si la démarche est pertinente pour le projet, il est également possible des droits sur les tests de cohérence. Pour en savoir plus, se référer à l’article Appliquer les droits sur les tests de cohérence.

Appliquer les droits sur les contrôles de cohérence

L’article Appliquer les droits sur les contrôles de cohérence explique comment activer et créer des contrôles de cohérences propres à certains groupes d’utilisateurs. Ce paramétrage peut, potentiellement, améliorer les performances de l’application.

Améliorer les requêtes sur les groupes

S’il y a des requêtes sur la table {pj}_pj_group dans le but de manipuler les groupes d’un projet, ajouter une condition WHERE id_axis IS NOT NULL pour éviter de récupérer les groupes-utilisateurs inutilement.

Consulter les requêtes XHR du formulaire présentant des lenteurs

Vérifier dans la console du navigateur si les requêtes XHR effectuées par le formulaire sont cohérentes (pas de répétition d’une même requête, pas de requête inutile, etc.) et si certaines sont particulièrement longues.

console_navigateur_reseau

Consulter le plan de test du projet

Ce plan de test remonte les problèmes repérés au sein du projet, notamment les problèmes d’index.

Il est disponible via l’interface “Paramètres généraux”.

plan_test_projet

Vérifier si les datasets et dictionnaires chargés sont tous utiles au formulaire

Un de debug est proposé dans la console pour récupérer ces informations, notamment debug.getDatasets() et debug.getDataset('mon_dataset').ToJSON() (voir l’article Outil de débogage côté client).

Nettoyer les formulaires

Ne garder que les champs réellement utilisés dans la datastructure ET le layout.

S’assurer de ne pas recharger la mainframe lors des redirection. Pour ce faire, privilégier l’utilisation du WidgetButton et n’utiliser le type de redirection “window” que si nécessaire.

Désactiver l’authentification par CPS si ce mode n’est pas nécessaire

L’authentification par CPS ajoute du temps de réponse.

Cette option peut-être désactivée en demandant l’intervention de l’infra (une issue pour un script dédié est créée).

Les outils pour pousser plus loin l’analyse

Exporter les requêtes d’un projet pour les analyser

Il est possible de récupérer toutes les requêtes SQL générées par les dataqueries d’un projet : Exporter du SQL depuis un dataquery.

Le fichier résultant peut être passé à un outil comme MySQL Workbench ou DBeaver pour faciliter leur analyse et repérer d’éventuelles améliorations.

Tester un dataquery en CLI pour l’analyser (retour, erreurs et temps d’exécution)

Pour vérifier le résultat d’un dataquery ou connaître son temps d’exécution, il est également possible de l’exécuter en CLI. La procédure à suivre est disponible dans l’article Exécuter un dataquery.

Cette commande renvoie également la requête SQL effectuée et les erreurs rencontrées s’il y en a.

Identifier les requêtes les plus coûteuses

Pour identifier les requêtes les plus longues, il existe un mode slow_query_log dans MySQL. Une fois activé MySQL va logger, dans un fichier de log spécifique (mysql-slow.log), les requêtes dont le temps d’exécution dépasse le temps défini par la variable MySQL long_query_time.

Le fichier de log est peu lisible mais des outils d’analyse existent pour en extraire les informations pertinentes, tels que mysqldumpslow (fourni avec MySQL) ou pt-query-digest (recommandé).

Effectuer un profilage de l’application via XHProf pour une analyse approfondie

Une documentation ainsi qu’un exemple d’utilisation sont disponibles dans le wiki de framework : XHProf

Les bonnes pratiques pour les dataqueries

Les dataqueries doivent respecter les bonnes pratiques SQL (limiter les fonctions de tri au strict nécessaire, ne pas faire de jointure sur des variables de types différent, etc.), et éviter certaines erreurs courantes comme utiliser une variable calculées dans une condition, laisser un dataquery en mode “rw”, etc.

En cas de doutes sur les bonnes pratiques à appliquer pour éviter des requêtes inutilement coûteuses, s’adresser au DBA.