S1 - Michael BOURAK - ACAMAYA



Documents pareils
Mise en oeuvre TSM 6.1

Technologies du Web. Créer et héberger un site Web. Pierre Senellart. Page 1 / 26 Licence de droits d usage

«Cachez-moi cette page!»

Performance, rendement Vs Evolutivité

Supervision et infrastructure - Accès aux applications JAVA. Document FAQ. Page: 1 / 9 Dernière mise à jour: 15/04/12 16:14

Programmation Web. Madalina Croitoru IUT Montpellier

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

RELEASE NOTES. Les nouveautés Desktop Manager 2.8

Module 10 : Supplément 2

Oracle Maximum Availability Architecture

FICHE PRODUIT COREYE CACHE Architecture technique En bref Plateforme Clients Web Coreye Cache applicative Références Principe de fonctionnement

L3 informatique TP n o 2 : Les applications réseau

Vulnérabilités et sécurisation des applications Web

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Alfstore workflow framework Spécification technique

Maarch Framework 3 - Maarch. Tests de charge. Professional Services. 11, bd du Sud Est Nanterre

Le serveur HTTPd WASD. Jean-François Piéronne

WEB page builder and server for SCADA applications usable from a WEB navigator

BIRT (Business Intelligence and Reporting Tools)

Optimiser les performances d un site web. Nicolas Chevallier Camille Roux

Lotus Notes et Domino 8.5 Administration de serveurs Domino

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Performances. Gestion des serveurs (2/2) Clustering. Grid Computing

Sauvegarde avec R1Soft Guide de mise en route

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

Chapitre 1 Windows Server

Lieberman Software Corporation

Sécurité Informatique. Description. Prérequis. Un petit test avant de commencer s embourber

WDpStats Procédure d installation

Module pour la solution e-commerce Magento

Network Shutdown Module V3 Extension du Manuel Utilisateur pour architecture Virtualisée VMWare ESX Server 3, 3.5

HAUTE DISPONIBILITÉ DE MACHINE VIRTUELLE AVEC HYPER-V 2012 R2 PARTIE CONFIGURATION OPENVPN SUR PFSENSE

Mise en œuvre des serveurs d application

HSCS 6.4 : mieux appréhender la gestion du stockage en environnement VMware et service de fichiers HNAS Laurent Bartoletti Product Marketing Manager

Guide de démarrage Intellipool Network Monitor

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

Notes de cours : bases de données distribuées et repliquées

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

Règles et paramètres d'exploitation de Caparmor 2 au 11/12/2009. Pôle de Calcul Intensif pour la mer, 11 Decembre 2009

Tutoriel de formation SurveyMonkey

VAMT 2.0. Activation de Windows 7 en collège

Janvier Entretien de l ordinateur

«clustering» et «load balancing» avec Zope et ZEO

Petit guide pour l installation de CVW sous Linux

OpenPaaS Le réseau social d'entreprise

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

JES Report Broker. Campus Technologies. SAE de CHALEMBERT 1 Rue Blaise PASCAL JAUNAY-CLAN info@campustec.

Architecture Orientée Service, JSON et API REST

Prérequis. Résolution des problèmes WMI. Date 03/30/2010 Version 1.0 Référence 001 Auteur Antoine CRUE

UserLock Quoi de neuf dans UserLock? Version 8.5

Développement d applications Internet et réseaux avec LabVIEW. Alexandre STANURSKI National Instruments France

Introduction à ElasticSearch

Résoudre les problèmes PHP, les meilleures (et les pires) techniques

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

1 ) INSTALLATION DE LA CONSOLE 2 2 ) PREMIER DÉMARRAGE DE LA CONSOLE 3 3 ) LES JOBS 4 4 ) LES ORDINATEURS 6

La base de données dans ArtemiS SUITE

VoD ( Video on Demand ) avec VLC

AngularJS pour une application d'entreprise

Francis Mignault. ! Coauteur : Expert Oracle Application Express. ! Membre du Oracle APEX Advisory Board apex.oracle.com/vote

Quick Start Guide This guide is intended to get you started with Rational ClearCase or Rational ClearCase MultiSite.

Performance Front-End

Windows Server Chapitre 1: Découvrir Windows Server 2008

TechSoftware Présentations

Bien architecturer une application REST

Micro-ordinateurs, informations, idées, trucs et astuces utiliser le Bureau à distance

IBM Lotus Notes/Domino v7, fonctionnalités et évolutions

Déploiement de SAS Foundation

Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10

WebSpy Analyzer Giga 2.1 Guide de démarrage

sshgate Patrick Guiran Chef de projet support

Installation d'un TSE (Terminal Serveur Edition)

ADMINISTRATION DE ADOBE LIVECYCLE MOSAIC 9.5

Tivoli Identity Manager

WordPress Référencement naturel (SEO) Optimiser. son référencement. Daniel Roch. Préface d Olivier Andrieu

Logiciel : GLPI Version : SYNCRHONISATION DE GLPI AVEC ACTIVE DIRECTORY. Auteur : Claude SANTERO Config. : Windows 2003.

Cursus Sage ERP X3 Outils & Développement. Le parcours pédagogique Sage ERP X3 Outils et Développement

Hébergement de site web Damien Nouvel

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

Tolérance aux Fautes des Grappes d Applications J2EE. Applications Internet dynamiques

Application de lecture de carte SESAM-Vitale Jeebop

Tivoli Storage Manager version TSM Server

Data Tier Application avec SQL Server 2008 R2

MSP Center Plus. Vue du Produit

Procédure d installation de la Sauvegarde de Windows Server

Livre Blanc WebSphere Transcoding Publisher

Acronymes et abréviations. Acronymes / Abbréviations. Signification

Messagerie & Groupeware. augmentez l expertise de votre capital humain

4. SERVICES WEB REST 46

Cours 13. RAID et SAN. 2004, Marc-André Léger

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

S7 Le top 10 des raisons d utiliser PHP pour moderniser votre existant IBM i

Protection des protocoles

Intégrateur de l ERP Proginov 25 chefs de projet et 32 développeurs dédiés aux clients Proginov

Sauvegarde et Restauration d un environnement SAS

Table des matières. 1. Installation de VMware ESXI Pré-requis Installation... 3

WiFi Security Camera Quick Start Guide. Guide de départ rapide Caméra de surveillance Wi-Fi (P5)

Transcription:

Performance pour les applications Notes & Domino S1 - Michael BOURAK - ACAMAYA

Introduction 45 minutes Critères d évaluation d une application - 7+ slides Je vais en sauter beaucoup, vous aurez donc de la lecture pour après ;-) Justesse Performance Maintenabilité La justesse est primordiale mais - Si l application répond le résultat correct en 1min! Si l application répond en 1/1ème de seconde mais que le code n est pas évolutif et que vous êtes le seul à pouvoir le comprendre que toute modification demande un refactoring important Optimiser une application, c est souvent trouver de bons compromis Ne pas oublier l aspect utilisateur - la performance «perçue»

Généralités Il faut Mesurer - - On ne peut, en général, pas prédire les performances d une application Il faut être capable de quantifier les progrès suite à une «optimisation» Il n y a pas que le temps d exécution à prendre en compte Mémoire utilisée CPU Charge réseau induite Il faut toujours comparer des résultats en environnement équivalent La performance est un critère à prendre en compte tout au long du développement et de la vie de l application Rien ne remplace une bonne conception et souvent rien ne permettra de rattraper une mauvaise conception! Domino n est pas la solution adaptée à tous les problèmes - Cette remarque est valable pour tous les serveurs d applications Domino peut être utilisé conjointement à un serveur J2EE, une base de données La «légende urbaine» sur la mauvaise performance des applications Domino

Facteurs de performance d une application Le Serveur - Serveur physique : CPU / RAM / Disk - Réseau - Configuration du serveur Domino L application elle-même - Toutes les recommandations sont très «application dependant» - Il faudra toujours tester : - Dans votre contexte applicatif Dans votre environnement On peut toujours tuner un serveur Domino, mais Dans la majorité des cas le facteur le plus influant sur les performances d une application est l application elle-même ;-) - Pourtant, en cas de problème, la tendance est de commencer par regarder le serveur, essayer de le tuner - Seul un serveur trés mal configuré ou avec un problème hardware peut causer des problèmes de performance - A moins qu il ne soit sous dimensionné depuis le début Ou que la volumétrie de l application / le nombre d utilisateurs aient augmenté significativement Une application non optimisée sera toujours peu performante même avec un serveur tuné Dimensionner un serveur sans connaitre un minimum de l application est souvent impossible

Un coup d œil sur le serveur Domino

Un bon début

Première analyse des performances d un serveur Domino Log.nsf - Evénements divers : recherche d erreurs, d incidents etc Informations sur les bases : tailles des bases, des vues etc Commandes Serveur - Show Task Show Server Show Stats Show dbs Notes.ini et Directory (names) du serveur - Paramètres spécifiques Planification de taches type compact (documents «program») Réseau - Commandes niveau O.S Notesconnect On aboutit à un premier bilan sur le serveur - On a vérifié qu il n y a rien d anormal Première approche applicative

Show Task T as k Des c ription Databas e Server P erform c ons ole c ommands Databas e Server Lis ten for c onnec t reques ts on T C P I P Databas e Server Load M onitor is idle Databas e Server Databas e Direc tory M anager C ac he Refres her is idle Databas e Server O rganization N ame C ac he Refres her is idle Databas e Server I dle tas k Databas e Server P erform Databas e C ac he maintenanc e Databas e Server I dle tas k... Databas e Server P latform Stats is idle SM T P Server I dle tas k LDA P Server I dle tas k LDA P Server I dle tas k SM T P Server I dle tas k A dmin P roc es s I dle LDA P Server Lis ten for c onnec t reques ts on T C P P ort:3 8 9 SM T P Server Lis ten for c onnec t reques ts on T C P P ort:2 5 A gent M anager E xec utive '2 ': I dle A gent M anager Replic ator E xec utive '1 ': I dle I dle SM T P Server C ontrol tas k LDA P Server Router C ontrol tas k I dle A dmin P roc es s I dle Sc hedule M anager I dle Direc tory I ndexer I ndexer I dle I dle A gent M anager I dle Direc tory I ndexer I ndexer I dle I dle Direc tory I ndexer I ndexer E vent M onitor I dle I dle I dle

Show Server Lotus Domino (r) Server (Release 6.5.4FP1 for UNIX) 7/12/25 9:44:58 AM Server name: XXXXX/OUOUOUOU/OOOOO - Serveur DOMINO de XXXXX Server directory: /notes/donnees Partition:.notes.donnees Elapsed time: 1:55:47 Transactions/minute: Last minute: 1581; Last hour: 56; Peak: 315 Peak # of sessions: 31 at 7/12/25 9:44:36 AM Transactions: 254933 Max. concurrent: -19521568 Availability Index: 1 (state: AVAILABLE) Mail Tracking: Not Enabled Mail Journaling: Not Enabled Shared mail: Not Enabled Number of Mailboxes: 1 Pending mail: 3 Dead mail: 1 Waiting Tasks: Transactional Logging: Not Enabled Fault Recovery: Enabled Activity Logging: Not Enabled Server Controller: Not Enabled Diagnostic Directory: /var/log/notes/ibm_technical_data Console Logging: Not Enabled Console Log File: /var/log/notes/ibm_technical_data/console.log

Show dbs Database Name Refs Mod FDs LockWaits/AvgWait #Waiters MaxWaiters.../stats.nsf 1 Y 1.../mail/fmut.nsf 3 Y 1.../public/diffacoss.nsf5 Y 1.../public/capnats.nsf 3 Y 2 1.../mail/pika.nsf 3 N 1.../mail/rr.nsf 3 N 1.../mail/reyj.nsf 3 Y 1.../mail/ur312433.nsf 3 Y 1.../mail/edibdem.nsf 3 N 1.../mail/ur312476.nsf 3 Y 1 NB : Certains indicateurs nécessitent le positionnement d une variable dans le notes.ini

Show stat Database.Database.BufferPool.Maximum.Megabytes = 256 Database.Database.BufferPool.MM.Reads = 1 Database.Database.BufferPool.MM.Writes = Database.Database.BufferPool.Peak.Megabytes = 255 Database.DbCache.CurrentEntries = 93 Database.DbCache.HighWaterMark = 566 Database.DbCache.Hits = 4311 Database.DbCache.InitialDbOpens = 5936 Database.DbCache.Lookups = 616 Database.DbCache.MaxEntries = 768 NET.TCPIP.Sessions.Limit = 65535 NET.TCPIP.Sessions.LimitMax = 65535 NET.TCPIP.Sessions.LimitMin = 1 NET.TCPIP.Sessions.Peak = 38 Platform.Memory.RAM.AvailMBytes = 1 893 Platform.Memory.RAM.AvailMBytes.Avg = 1 878 Platform.Memory.RAM.AvailMBytes.Min = 1 543 Platform.Memory.RAM.AvailMBytes.Peak = 3 314 Platform.Memory.RAM.PctUtil = 52 Platform.Memory.RAM.TotalMBytes = 3 997 Server.Users.Peak = 32 Server.Users.Active15Min = 25 Server.Users.Active1Min = 67

Notes.ini AMGR_DISABLEMAILLOOKUP=1 CONSTRAINEDSHMSIZEMB=124 EXTMGR_ADDINS=libmailreleaser.so INET_AUTHENTICATE_WITH_SECONDARY=1 NSF_BUFFER_POOL_SIZE_MB=256 ROUTERDISABLEREADERSFIELD=1 ROUTERENABLEMAILBYDEST= SERVER_MAX_CONCURRENT_TRANS=2 UPDATERS=3 VIEW_REBUILD_DIR=/translog/dtf/

Coming in 8.5

Désactiver les options de log et debug! Il y a des tas de paramètres pour tracer, loguer, débuguer Log_update, log_replication, debug_... Mais attention Comparatif debugthreadlogging - HTTPD.cnf 6 # req / s 5 4 3 2 1 debugthreadlogging on Note: C ette variable s e trouve dans le fic hier httpd.c nf debugthreadlogging off

Quelques recommandations «serveur» Lisez le redbook ;-) - Défragmentation des disques - A associer intelligemment avec l optimisation des bases(compact) Seulement si vous avez suffisamment d espace libre Toujours copier les bases Domino via Domino - pas de ftp, partage réseau etc.. Tips set config CLUSTER_ADMIN_ON=1 CL copy servera!!db1.nsf serverb!!db2.nsf Transaction Log sur un disque séparé - Vraiment séparé Sinon, les performance seront certainement dégradées Attention aux config RAID, aux SAN Il y a beaucoup de chose dont je n ai pas le temps de parler (clustering etc ) «Best practices for Implementing Lotus Domino in a Storage Area Network (SAN) Environment» Attention aux environnements virtualisés - Le monde virtuel est parfois loin du monde réel ;-)

Un coup d œil sur les applications Domino Recommandations générales Recommandations spécifiques pour les applications Web Recommandations spécifiques pour les applications Notes

Recommandations générales La conception de l application est le point crucial - Particulièrement en environnement Domino qui est moins «libre» que d autres - Il y a un certain nombre de questions à se poser avant de démarrer les développements Légomino? Volumétrie, nombres d utilisateurs, type de client (w eb / notes), sécurité etc. Vous aurez besoin d un serveur pour faire vos tests - Soit vous avez une architecture dev / recette / preprod / prod Soit local, mais il vous faut donc un minimum de connaissance d administration Toujours tester vos applications avec des jeux de données représentatifs Toujours spécifier en début de projet les populations visées - nombres d utilisateurs, nombre d utilisateurs simultanés Vos interlocuteurs fonctionnels peuvent comprendre les implications de leurs décisions sur les performances - Pour peu que vous leur expliquiez! Au moins, vous les aurez prévenu ;-)

Recommandations générales Les agents et le scripting ne sont pas la solution ultime - La plupart du temps, un traitement en @Formulas sera bien plus performant - Essayez de toujours penser de façon «progressive» Il faut prendre en compte et utiliser à votre profit les spécificités de Domino Si vous devez intervenir quand il y a déjà un problème de performance - Quelques points-clés Identifier les goulots d étranglement avant de se lancer dans une optimisation Réduire l influence des composants non concernés (par exemple, le réseau) Un changement à la fois - www.redbooks.ibm.com : «Introduction to performance tuning in Domino» - We know how to do that!

Au niveau Application (base) Domino Vérifier que votre application est au bon niveau d ODS Bien configurer les options des applications Domino Ne pas activer l enregistrement des activités utilisateur Evidemment, à ajuster en fonction de l application! Organisation des données : - Les améliorations de performances amenées par les versions successives de Domino sont souvent liées à l ODS - Compact c + notes.ini en 8 / 8.5 (CREATE_R8_DATABASE=1) - Archiver les données inutiles - Structurez vos applis pour éviter que les bases les plus accédées soient aussi celles où le plus de document sont créés Exemple : 1 base C atalogue produits et 1 base C ommandes, pas une seule base Tous les traitements ne sont pas obligatoirement à exécuter en temps réel - pensez aux agents planifiés

Au niveau Application Domino : 8 & 8.5

Au niveau Application Domino (suite)

@ & Performance

Commandes @DB Utiliser intelligemment les options de cache - @DbLookup( class : cache ; server : database ; view ; key ; columnnumber ; keywords) - NoCache que si vraiment utile, penser à «ReCache» - Cache + fermeture/ouverture de la base NoCache en bcp plus efficace Faire les requêtes sur une colonne plutôt que sur un nom de champ - @DbLookup( class : cache ; server : database ; view ; key ; columnnumber ; keywords) - Si requête sur un numéro de colonne, la donnée est issue de l index, sinon Domino doit «ouvrir» le document Utiliser les @IsDocBeingxxx pour ne faire les calculs que quand nécessaire - Sinon vos requêtes s exécutent plusieurs fois - Y compris dans les formules de choix, même si ND6/7/8 ont fait un certain nombre d optimisations seuls Formule de choix de valeurs : @If(@IsDocBeingLoaded ; @Unavailable ; @DBColumn( ))

Commandes @DB (suite) Rapatrier toutes les données en 1 seule @DBx et parser le résultat - plutôt que de faire n @DBx Toujours faire les @DBx sur des vues systèmes non susceptibles d être modifiées pour des raisons «graphiques» Penser à l option de vue «generate unique keys in index» et à la catégorisation - Permet de limiter la quantité de données renvoyée - C est le moteur d indexation de Domino qui fait le travail une fois à l indexation - au lieu que ce soit vous à chaque requête @DBx (avec un @Unique par ex) Tirer partie des nouvelles fonctionnalités : @Sort, @Tranform, @For - Permettent dans bien des cas de ne pas avoir recours à un agent WQO / WQS

LS & Performance

LotusScript Certaines recommandations sont possibles au niveau «core language» - List plutôt que Array - For Loops plutôt que Do Loop plutôt que While Wend For y=1 to 15 z=z+1 Next Do z=z+1 y=y+1 Loop While y<= 15 - Simplifier vos «branching» if (a=x and b=y) then if a=x then if b=y then - Toujours déclarer les variables Les opérations de conversion de type sont très c outeuses For I = 1 to 1/ Next vs Dim I as Integer For I = 1 to 1 Next Mais dans la majorité des cas, si il y a pb, il ne vient pas de là - cela ne veut pas dire qu il ne faut pas y faire attention ;-)

LotusScript (suite) Les objets Domino sont souvent gros et leur création prend du temps LotusScript gère des références vers les objets - Tant qu il existe une référence vers un objet, celui-ci reste en mémoire Recommandations concernant les objets Domino - Les créer seulement quand et au moment où vous en avez besoin - Supprimer les quand vous n en avez plus besoin (Delete) - Passez les aux différentes Sub(...) et Function(...) plutôt que de les recréer Sub Initialize Dim s as New NotesSession Set db = s.currentdatabase Set view = db.getview ( "(Keyw ords)" ) Call Sub1 ( view ) Call Sub2 ( view ) -Ou utiliser les déclarations globales -Pas la peine pour les objets Session, CurrentDatabase et «Source» (dans les évènements), ces objets étant créés automatiquement par Domino

LotusScript (suite) Utiliser des variables temporaires pour référencer les objets Domino plutôt que de les utiliser directement dans des boucles de traitement VarViews = db.views Forall v in VarViews print v.name End Forall Forall v in db.views print v.name End Forall Utiliser les méthodes d accès plutôt que la notation étendue - doc.getitemvalue(«title»)() plutôt que doc.title() - Idem doc.replaceitemvalue( ) Utiliser la bonne casse - Si un champ s appelle Title, getitemvalue(«title») est plus performant que getitemvalue(«title») Accéder aux éléments de structure via leur nom, en respectant la casse - Rechercher un élément de structure par son alias est moins performant - Rechercher avec la bonne casse est plus performant

LotusScript (suite) Chaines - LotusScript gère toutes les strings en UNICODE (UTF16) - Notes/Domino gère les strings en LMBCS - Conclusion Faire les manipulations de chaines toujours en LS Eviter les va-et-vient entre LS et objets Domino Méthodes d accès aux documents - Get*ByKey Souvent la méthode la plus rapide Rapide mais nécessite la création de l index de recherche qui n est pas toujours à jour Limite du nombre de résultats en R5 Attention, ne jamais utiliser de cutoff date, surtout si la base est grosse - FTSearch - dbsearch - Penser à View.AutoUpdate pour les Get*ByKey - ByUNID ou ByNoteID?

LotusScript (suite) Db.DelayUpdates = True - Save & Remove method View.AutoUpdate = False - Décale la mise à jour de l index de vue à la fin de l exécution (et pas à chaque modification de document) - A utiliser Lors de mise à jour en masse de documents Lors de parcours de vue avec suppression Méthodes au niveau de toute une collection plutôt qu une itération - RemoveAll, StampAll - StampAllMulti en 8.5 Librairies de script - Plus il y a de librairies de script déclarées, plus le chargement est long charger uniquement les librairies utiles et concevoir les librairies de façon à ce que chaque librairie n ai pas besoin de toutes les autres - Plus la librairie est grosse, plus son chargement est long - Appendix B-2 : Dynamic Script Library Loading du redbook Domino Performance Considerations

Comment en savoir plus sur les performances d un script Agent Profiler - Depuis la R7 - Permet d évaluer les performances des agents et des webservices, en LS ou Java - Même si vous êtes en version inférieure, rien ne vous empêche de monter un serveur de test pour «profiler» vos agents

Comment en savoir plus sur les performances d un script GetThreadInfo - Retourne des informations sur l unité d exécution courante - Exmple : (Getthreadinfo(6)-StartTic) / Getthreadinfo(7) - Il existe aussi LSI_Info mais à ne pas utiliser! Function Value LSI_THREAD_LINE () C urrent line number LSI_THREAD_PROC (1) Name of current procedure LSI_THREAD_MODULE (2) Name of current module LSI_THREAD_VERSION (3) LotusScript version number LSI_THREAD_LANGUAGE (4) (Human) language setting LSI_THREAD_C OUNTRY (5) C ountry or region setting LSI_THREAD_TIC KS (6) Get current clock ticks LSI_THREAD_TIC KS_PER_SEC (7) Get clock ticks per second LSI_THREAD_PROC ESS_ID (8) Get current process ID LSI_THREAD_TASK_ID (9) Get current task ID LSI_THREAD_C ALLPROC (1) Get the name of the calling procedure LSI_THREAD_C ALLMODULE (11) Get the name of the calling module

Et si on faisait un p tit peu de Java?

Recycle me baby! Nécessaire car le GC Java ne sait pas réclamer la mémoire utilisée par les objets «non java» - Toutes les ressources sont récupérées a la fin de l exécution d un agent ou de l application - La méthode recycle ne corrige pas de fuite mémoire à proprement parler - C est plus un GC qui agit pendant l exécution - Très utile pour les servlets ou programme «hors domino» Recycle a plus d influence sur la stabilité de l application que sur sa vitesse d exécution Il faut recycler si possible, tous les «gros/nombreux» objets que l on crée - Les meilleurs candidats au recycle sont les parcours de collections de documents Document doc, doctemp; doc = view.getfirstdocument(); w hile (doc!= null) { // Le code ici... doctemp = view.getnextdocument(doc); doc.recycle(); doc = doctemp; } - Dans les agents (et uniquement dans les agents), les objets suivants ne peuvent pas être «recyclés» CurrentDatabase, CurrentAgent, AgentContext Car ils sont créés par Domino

Give me more! Où stocker ses librairies Java? Comparatif Librairies Java 8 7 # req / s 6 5 4 3 2 1 Librairies Java "dans" l'agent Jar dans l'agent Jar dans le JavaUserClasses DIIOP - Se connecter depuis un programme Java «distant» - Utilisation d un pool de connexion (ex : Apache Commons Pool) Servlets - Domino possède un moteur de servlet mais aussi un «Websphere entitlement» - Bientôt peut-être que

Parlons un peu de vue

Vues Limiter le nombre de vues dans vos applications - Chaque vue demande des ressources pour son indexation - Si votre appli possède plus de 5 vues - Moyen simple d analyse : log.nsf Taille des vues, utilisation Formule de sélection la plus simple possible - Elle est évaluée pour chaque document de la base Même remarque pour les formules de colonnes - Dans certains cas, il vaut mieux stocker dans chaque document le résultat d une formule complexe plutôt que de mettre cette formule dans une vue - Bien sûr, cela implique de gérer les mises à jour Attention aux catégorisations, aux tris, au «re-sort» - Chaque tri supplémentaire augmente la taille d une vue Et donc les ressources nécessaires pour mettre à jour d index Autant de ressources qui ne seront pas disponibles pour répondre aux autres requêtes - Chaque option compte, la pire étant re-sort - Nouveau en 8 : «defer index creation» pour les «re-sort» - Penser aux propriétés permettant de contrôler la fréquence de ré-indexation - Note: les index de vue n ont rien a voir avec l index FT (recherche)

Vues (suite) Attention aux champs lecteurs - Et à l option «do not show empty categories» Séparer les vues systèmes des vues destinées aux utilisateurs Penser à @SetViewInfo pour réduire le nombre de vues - Proche de l option «show single category» - Mais nécessite un peu de travail (nettoyage des filtres avant et après) Supprimer les vues qui ne servent plus - Cela nécessite de savoir si une vue est encore utile ou non (par ex en regardant la log.nsf) Ne «jamais» utiliser des critères dynamiques dans les formules de sélection - @Username : ne marche pas! - @Now, @Today, @Modified = impact sur les performances (réindex à chaque ouverture) - @TextToTime(@Today) = ne marche pas (sauf le premier jour ou sauf si on modifie tous les documents tous les jours) - Si vous avez besoin de ce type de vues Vues privées, si possible desktop 1 Dossier privé et y mettre les documents NSFDB2 later today ;-)

Vues (suite) Lors du parcours d une vue en LS, utiliser les données des vues plutôt qu ouvrir chaque document - NotesViewEntryCollection & ColumnValues plutôt que NotesDocumentCollection et NotesDocument - Si pas possible, préférer GetNextDocument à GetNthDocument (pas toujours vrai, mais au pire quasi-équivalent) set doc = collection.getfirstdocument while not doc is nothing Set doc = collection.getnextdocument(doc) wend for x = 1 to collection.count set doc = collection.getnthdocument(x) next x Notes.ini: log_update = 1 pour suivre les mises à jour d index de vues Essayer de rendre les vues le plus «étanches» possibles les unes des autres Ne pas masquer les vues pour Notes, même si elles ne sont que pour les clients web Notes.ini : ViewRebuildDir = path - La mise à jour d un document doit entrainer le moins de ré-indexation possible - Sinon elles sont hors de portée de la tache d indexation - A faire pointer vers un disque rapide pour optimiser l indexation

Formulaires La performance d un formulaire est principalement liée aux calculs des champs qui le composent, mais pas uniquement Limiter le nombre de champs dans un formulaire - Après qq centaines de champs, même simples, les performances se dégradent - Ces champs se retrouvent aussi dans les documents créés avec ce formulaire et cela impacte les perfs - Penser a supprimer les champs temporaires (@DeleteField, Agent plannifié, SavenDisk = false) Attention aux champs Lecteurs Formules de masquage - Très utiles, mais à ne mettre en œuvre que si le niveau de sécurité exigé par l application le demande - Pas de champ lecteur vide, ou avec un rôle que tout le monde a, ou avec * - Les champs de type auteur ont bcp moins d influence sur les performances - Limiter leur nombre, simplifier les formules - Si la même formule est répétée n fois, passer par un champ temporaire - Penser aux solutions alternatives: sous-masques calculés, masquage de sections complètes ) Autres - Tableaux très complexes, images importées - Options de refresh, évènements LS dans tout les sens remettant à jour le document (Performance perçue)

Formulaires (suite) Evaluer les formules une seule fois si elles sont répétées dans le formulaire Limiter l utilisation des champs partagés, les sous-masques et surtout les imbrications de ressources partagées - Exemple : passer par un champ temporaire, Computed For Display - Un sous-masque dans un sous-masque dans. Limiter l utilisation des «Form Formula» Attention à l option «Automatically Refresh Fields» AutoReload = False (dans les vues) - Désynchronise le NotesUIDocument et son NotesDocument correspondant en back-end - Utiliser la méthode Reload pour rafraichir le uidoc M odific ations made to non-ric h-text items on the bac k- end doc ument ac c es s ed through the Doc ument property appear on the c urrent doc ument immediately; A utoreload is unnec es s ary. M odific ations made to non-ric h-text items on the c orres ponding bac k-end doc ument ac c es s ed from the front-end doc ument but not through the Doc ument property (for example, if you us e GetDoc umentbyu N I D) do not appear immediately unles s A utoreload is T rue. T o make the modific ations appear when A utoreload is Fals e, c all the Reload method or c los e the doc ument and reopen it. M odific ations made to ric h-text items on the bac k-end doc ument do not appear on the c urrent doc ument until it is c los ed and reopened.

Documents «Profile» Documents de structure, stockés en mémoire pendant leur utilisation - N apparaissent pas dans les vues Soit globaux, soit par «utilisateur» Excellente performance en lecture - Parfait pour stocker la configuration d une application, des listes de valeurs - @GetProfileField( ) beaucoup plus performant que des @DBLookup etc Principe de base : «one write, many read» - Si vous tentez d échapper à ce principe, vous risquez de rencontrer des pb liés au cache - Mais il y a des moyens de rafraichir le cache d une application Sortir de la base par exemple (c est le cas dans un agent planifié) Plus compliqué à gérer dans le cadre des applications web

Performance des applications Web Domino

Comment évaluer les performances d une application Web Simulation de charge - Outils simples MS W eb Application Stress Tool Pratique pour tester une url précise ou un scénario simple OpenSTA : free - Plus complets Permet de définir des scénarii complexes, de gérer des pools d utilisateurs, d injecter des données pour les formulaires, de faire du reporting etc IBM Rational Performance Tester Mercury Load Runner - A coupler avec les outils de suivi de performances de l OS Domlog.nsf - Temps serveur pour traiter chaque requête - Souvenez-vous, jamais en production ;-) Performance «coté client» - IBM Page detailler - Penser à bien vider le cache du navigateur avant un test

IBM Page Detailler & MS Web Application Stress Tool

Généralités Ne pas utiliser la Domlog - Uniquement pour du test ou site à très faible charge, activer l agent de purge - Préférer les logs au format texte : Analysable par les outils standards du marché Activer les filtres pour le pas tout loguer (images/gif, images/jpeg etc ) Autoriser les agents web concurrents - Ce n est pas le cas par défaut Pas de Cache pour les @DB pour les applis web attention! WebQueryOpen / WebQuerySave souvent les «performance killers» - A utiliser SI nécessaire - Les @Formulas s exécutent dans les évènements «WebQuery», on peut y faire des choses sans déclencher d agent

Généralités (suite) Attention à «Generate HTML for all fields» Utiliser des redirections internes quand cela est possible - [/base.nsf/mapage?openpage] [[/base.nsf/mapage?openpage]] (la ressource cible doit être sur le serveur courant) @ClientType plutôt que @UserRoles ([WebUsers]) Passthru plutôt que [< >] ou HTML Style.. Domino HTML directory Alternative HTTP Stack, ICM Configuration du serveur Domino Toutes les remarques «web» pures : - SSL seulement si vraiment nécessaire - Pas de DNSLookup - tailles des images, css, js etc.. - Gzip

Quelques mauvais exemples No!

Exemple de configuration pour GZIP

Tirer partie des spécificités du client web Javascript - Permet de déléguer certains traitements et certains rendus au browser - AJAX Ressource caching - Javascript libraries, CSS, images Comment contrôler le cache des browsers? - Domino en fait une partie Last_Modified, Expires etc Etags Expires / Pragma / Cache-control Cache Max-Age - @SetHTTPHeader - Web Site rules - Attention aux proxy (cache-control: private) Comment valider vos développements vis-à-vis du cache? - IBM Page detailer et un sniffer de Header HTTP (IE live http headers) - Domlog (pour le développement uniquement) - Attention à firebug, aux options des navigateurs, aux différences de navigateurs

Exemple de règle pour l ajout de header HTTP

Domino Command Cache Cache de pages côté serveur Présent depuis Domino 4.6x Certainement une des fonctionnalités les moins exploitées par les développeurs - et pourtant

1 6 7 2 5 3 4

1 4 3 2

Domino Command Cache (suite) Cache de pages coté serveur Uniquement pour les accès en mode Anonyme Nécessite de configurer le site pour ne pas prendre en compte les spécificités régionales du client Basé sur les URL - Le HTML généré est caché par le serveur Domino - Une entrée de cache par URL (l url est une clé de cache) - Certaines URL Domino seulement Ex :?ReadForm ok, OpenForm= ko uniquement avec des arguments Domino valides (&Count=12 ok &Count=Test Tout ajout d argument «non Domino» rend le résultat non cachable - Utile aussi pour des fichiers CSS, des lib JS stockées dans des pages Par défaut, le command cache est inactif ko) - $CacheValid : nombre, temps en seconde de validité du cache - $CacheOptions : «1» ou - Used to be notes.ini DominoAnalyzeFormulas=1, DominoTraceCmdCache=1 no more Show Stat Domino

Domino, HTTP, AJAX

Domino & HTTP HTTP Home page - Redirection interne / externe HTTP Thread settings - Le «trop» est l ennemi du bien HTTP queuing methods - HTTPQueueMethod dans le notes.ini : default: round robin distribution 1 : thread avec la queue la moins longue 2 : «à la R5» : w orker thread pulls from queue must disable http 1.1 - Scope = Serveur

Domino & HTTP (suite) HTTP 1. vs HTTP 1.1 - Toujours demander explicitement la fermeture d une connexion HTTP quand on s adresse à Domino depuis une autre application - Exemple de cas : «proxy» applicatif pour contourner les restrictions de sécurité JS en AJAX - Exemple avec les librairies Java standard try { HttpURLConnection uc = null; uc.setrequestproperty("connection","close"); } Catch ( ) { uc.disconnect(); uc = null; }

Web 2., mais AJAX is cool Mais attention - Au Nombre de requêtes HTTP par page Limitation coté serveur Limitation coté client JSON plutôt que XML Yahoo «best practices guide» http://developer.yahoo.com/performance/rules.html

Performance des applications Client Notes

Notes Client performance Plus proche d un mode «client serveur» qu avec un client web Une beaucoup plus grande partie de l application s exécute sur le poste client - Même si l application est sur le serveur - Opposé d une application web où tout s exécute sur le serveur Chaque requête vers des objets ou des données Domino (@DB, Lotuscript etc.) peut générer un trafic réseau non négligeable - Souvent ce trafic réseau tire les performances des applications Notes vers le bas - Penser à activer la compression réseau sur le client et le serveur mais ce n est pas la solution ultime!

Notes Client performance (suite) Notes.ini - CLIENT_CLOCK=1 - CONSOLE_LOG_ENABLED=1 - Debug_Outfile=C:\client.txt Résultat sous la forme - (Counter-Time [Thread]) RPC: Time Taken [Bytes Sent + Bytes Received = Total] Exemple de résultat (21-98 (22-98 (23-98 (24-98 (25-98 [251]) [252]) [253]) [254]) [255]) OPEN_DB(CN=UR83-SECUNOTS1/OU=UR83/O=REC!!names.nsf): ms. [134+29=424] FINDDESIGN_NOTES: ms. [44+16=6] OPEN_NOTE(REPC1256DCC:45CCFE-NT2A,341): ms. [48+3228=3276] OPEN_COLLECTION(REPC1256DCC:45CCFE-NT2A,,): ms. [42+34=76] FIND_BY_KEY: ms. [52+34=86]

Notes Client performance (suite) Exemple Client XXXXX (21-1 [26]) OPEN_DB(UR83-SECUNOTS1!!protect\wwatt.nsf): (Connect to UR83-S.../UR83/REC: ms) (211-1 [261]) CLOSE_DB(REPC1256EC5:56158): ms. [14+=14] (212-1 [262]) OPEN_DB(CN=UR83-SECUNOTS1/OU=UR83/O=REC!!protect\wwatt.nsf): 31 ms. [134+29=424] (213-1 [263]) SEARCH: 5469 ms. [146+13165718=13165864] (214-16 [264]) OPEN_NOTE(REPC1256EC5:56158-NTB9EFA,742): ms. [48+735=7398] (215-16 [265]) CLOSE_DB(REPC1256EC5:56158): ms. [14+=14]

Optimisations spécifiques pour une application en client Notes Cache des @DBLookup - Pas de généralisation brutale des NOCACHE - Penser au nouveau mot clé : RECACHE - Idée intéressante : Cache et, en cas de besoin, fermer et ré-ouvrir la base automatiquement RunOnServer - Demande à un agent de s exécuter sur le serveur Même si l application s éxecute sur le client Notes On élimine une bonne partie du trafic réseau Le serveur est souvent plus puissant que le poste client - Passage de paramètre via un noteid Call agent.runonserver(noteid) (également valable pour la méthode Run) Récupération du paramètre via Agent.ParameterDocID Si l agent modifie le document courant, utiliser Delete coté client pour le supprimer du cache et rapatrier la copie modifiée Attention à la sécurité, l agent va s exécuter avec les droits du signataire - Ne pas généraliser aveuglément Code générant un fort trafic réseau Code dont on sait que le serveur le traitera bcp plus rapidement que le client Sécurité

Lancer un agent en tâche de fond

Outil de simulation de charge pour une application Notes Domino Server load - Option standard du client d administration - Proche des outils de stress web - mais adapté à l environnement Notes

Conclusion Evidemment, nous n avons pas parlé de tout Le facteur principal de performance d une application est souvent l application elle-même - C est donc bien souvent aux développeurs qu on doit la «légende urbaine» - Toutes les légendes ont une fin ;-) Construire une application performante est une affaire de compromis Il faut toujours mesurer - il est difficile de prédire les performances d une application - On a souvent des surprises Ne pas oublier l aspect utilisateur

Merci!