Optimisation de Perf’ sur Calypso

Les problèmes de perf’… Thème récurrent, dans le monde IT pour lequel vos managers sont prêts à vous donner du budget, mais derrière pas toujours facile de l’utiliser à bon escient. Pas de solution miracle, vous devrez, en bon ingénieur que vous êtes, adopter une démarche logique vous permettant de solutionner vos problèmes :

1) Identifier le ou les symptômes

2) Diagnostiquer la maladie
3) Apporter le ou les traitements adéquats

Symptômes

Il faut se poser les bonnes questions : où et quand rencontrez-vous des problèmes, des temps d’exécutions démesurés, des pics d’activités à des moments clés de la journée, ce fameux moment où le Big-Boss ouvre sa Main Entry qui freeze… comme par hasard ! Heureusement Calypso est là pour nous aider :

– Les engines dépilent-ils ? => Allons voir les Stats de l’écran AdminMonitor.

– La mémoire est-elle saturée ? => L’AdminMonitor propose là aussi différentes vues pour analyser la mémoire.

– Le sqlmonitor pour observer les requêtes bloquantes, redondantes, etc.

– Analyser le nombre de clients démarrés :  les MainEntry, les process, etc.

– Temps d’exécution de certaines Scheduled Tasks via leur écran de reporting.

– Problèmes de latences sur certains process Java, inter-blocages ? Lancez un ThreadDump qui vous donnera à l’instant t, une photo de tous les threads en cours d’exécution : utilisation des objets, garbage collector efficace, saturation mémoire, etc. ?

– Vous pouvez également utiliser JProfiler sur un environnement de tests pour mesurer finement tous les temps d’exécutions classe par classe, méthode par méthode et voir rapidement les bouts de codes trop consommateurs.

Diagnostic

Une fois tous les éléments cités précédemment collectés, il vous reste à poser votre diagnostic : où se trouve le problème ? En effet, cette question est primordiale, s’agit-il d’un engine ou bien de mon DataServer ou bien de la base de données. Le fait de bien identifier la root cause de votre problème est bien évidemment la clé pour y apporter une solution efficace.

Solutions

De nombreux axes d’optimisations propres à Calypso et faciles à mettre en place existent :

– La transposition de certaines tables : en effet, les tables clé-valeur permettent de stocker plusieurs attributs pour une entité donnée sur autant de lignes. L’idée est donc de transposer l’exhaustivité de ces attributs sur une seule ligne. Exemple de la table xfer_attributes

Nous aurons donc à remonter qu’une seule ligne par entité en base au lieu des 5 lignes précédemment. Si cet accès se fait des millions de fois par jour l’amélioration des perfs se fera ressentir. En plus de la modification du schéma de base de données, il faudra faire évoluer la couche java d’accès aux données, la classe CustomTransferAttributeSQL.

Démultiplication d’engines : si vous observez que l’activité d’un engine en particulier est de plus en plus importante et qu’il a de plus en plus de mal à dépiler ses events tout seul, vous pourrez alors créer plusieurs engines identiques dans leur fonction mais qui se différencieront par les events qu’ils traiteront. Il faut alors déterminer judicieusement le caractère discrimant de vos events : type de produits, le marché traité, un trade_keyword particulier. Par exemple, imaginez que vous souhaitiez dupliquer le TransferEngine en discriminant votre flux en 2 flux de taille égale. Vous pourrez créer un EventFilter qui traitera uniquement les events portant sur un tradeId pair et vous créez son opposé qui n’accepte que les tradeId impair. Vous pouvez maintenant créer 2 engines : TransferEnginePair et TransferEngineImpair en leur appliquant leur EventFilter respectif et ainsi dédoubler l’activité du TransferEngine sur 2 engines.

DSRO : le cœur du système, le DataServer peut également être dupliqué. Vous aurez alors à créer un nouveau DS « read only » par lequel vous passerez pour tout accès en lecture seule à la base de données. Cette approche permet de soulager le DataServer de toutes les requêtes liées au reporting par exemple.

– Le paramétrage : vaste chantier que celui de choisir au mieux les différents paramètres. En effet, que ce soit

  • le démarrage de la JVM (Xms, Xmx, Xmn, etc.)
  • la politique de cache (LRU, Hashtable, LFU, etc.)
  • le paramétrage des engines (nombre limite d’events, fréquences, etc.)
  • le paramétrage du DS : des variables d’environnement au démarrage sont pris en compte depuis le fichier de properties.

– Le multi-threading : en effet, la parallélisation de processus peut être mis en place facilement sur votre code custom et ainsi être en capacité de diminuer les temps d’exécutions pour vos Scheduled Tasks par exemple.

Tuning de base de données : faites-vous aider par un DBA pour optimiser l’accès à votre base : indexes, plans d’exécutions, profiling de requêtes SQL, partitionnement de tables, utilisation d’IOT.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *