Problèmes de performances ? Quelles sont les causes possibles ? Voici une liste
Travaillant très fréquemment sur des problèmes de performances, je me suis demandé quelles sont les causes courantes de ces problèmes. J’ai alors rédigé une liste listant les problèmes de performances déjà rencontrés.
L’idée est d’avoir une checklist indiquant l’ensemble des causes possibles pour un problème de performance. Cette liste ne contient volontairement pas d’éléments de méthodologie pour diagnostiquer les problèmes de performances, seules les causes sont listées.
Vous trouverez ci dessous cette liste, cette liste et non exhaustive et est amenée à évoluer. N’hésitez pas à me donner vos idées pour la compléter.
Problèmes liées au code
- Problème algorithmique
- Parcours de collection trop importante par rapport au besoin
- Ex : Calcul des promotions sur l'ensemble des produits alors que seul 10 produits sont affichés
- Réalisation de calcul non nécessaire
- Ex : réalisation d'un calcul lourd sur l'ensemble des nœuds d'un arbre alors que seul les nœuds de niveau 1 sont affichés au client
- Non utilisation de contexte : les même informations sont recalculés plutôt que sauvegardés au sein d'un contexte
- Appels à des calculs algorithmiques complexes trop fréquents
- Appels à la base de données trop fréquents
- Appels à des WebService trop fréquents
- Mauvaise estimation de la volumétrie
- ex : chargement d'un fichier XML en mémoire. Développé avec un fichier de quelques ko, en production avec un fichier de plusieurs centaines de Mo.
- Gestion de la parallèlisation
- Problème de synchro de thread (dead lock)
- Appel aux services tiers de façon synchrone
- info : Les services tiers peuvent être défaillants ou surchargés
- Non asynchronisation de méthode / mauvaise utilisation de la parallèlisation
- Ex : Une requête attend que son entrée dans les logs soit écrite pour pouvoir continuer. Cette action n'influe pas sur le résultat, elle peut être déléguée
- info : Ce problème arrive et arrivera de plus en plus fréquemment suite au nombre de cœur en constante augmentation
- Mauvaise découpe de l’application
- manque d’architecture
- ex : mauvaise séparation des couches
- Code trop complexe
- ex : un écran qui fait trop de choses au lieu de plusieurs écrans simples
- tips : non utilisation du SRP (Single Responsibility Principle)
- tips : non KISS compliant
- Page trop complexe
- Poids de la page trop important ; la réponse envoyé au client fait plusieurs centaine de ko voir mo
- ex : le viewstate est beaucoup trop lourd
- Trop de dépendance vers l’extérieur
- ex : JavaScript de tracking, régie pub
- ex : trop d’images sont chargés sur la page
- Complexité du code client
- ex : CSS trop lourde ou complexe
- ex : incohérence des JavaScript envoyés au client
- ex : HTML complexe et mal construit
- Mauvaise utilisation du framework
- Non libération des ressources non managées
- Mauvaise utilisation du framework .net
- Ex : concaténation de String sans utilisation de StringBuilder
- Ex : Utilisation de tableau au lieu d'utilisation de Stream
- Ex : Génération d’un fichier XML en concaténant des bouts de String
- Réécriture de code présent dans le framework .net
- Mauvaise gestion du cache
- Absence de cache sur la couche présentation
- tips : L'ajout d'outputCache est la solution idéale quant à ces problèmes
- Durée de vie du cache trop court
- Couche de cache trop nombreuses
- Cache au niveau de l'accès à la base, cache métier, cache présentation 1, cache présentation2, etc.
- Autres
- Dépendances non mis à jour ou non testé
- Ex : utilisation d’un code trouvé sur le net sans l’avoir relu
Problèmes liées à la configuration
- Configuration de IIS
- Compression GZip non activée
- tips : sur IIS 7+, un mécanisme désactive la compression des fichiers dynamiques si la charge CPU est trop importante
- Pas de cache client sur les fichiers statiques
- ex : images, CSS, JavaScript
- Activation de modules IIS inutiles
- ex : module d'authentification
- Règle de rewriting trop complexe
- Redirections trop nombreuses
- ex : http ==> https ==> sous domaine ==> login ==> etc.
- Configuration d'une stratégie des AppPool trop agressifs
- ex : configuration du recyclage des applications toutes les 20 minutes
- Utilisation du mode 32 bits non nécessaire sur un système d’exploitation 64 bits
- Problème sur la configuration avancée de IIS
- ex : taille de la file d'attente, délai d'attente du ping, chargement du user profile, etc.
- Base de données
- Opération de maintenance en période de charge
- Table d'historisation non nettoyée ou non partitionnée
- ex : Insertion d'une entrée dans une table des logs contenant plusieurs millions de lignes
- Index
- Fragmentation des indexes importants
- absence ou surplus d'index
- Absence de plan de maintenance
- pour reconstruire les index
- pour sauvegarder les fichiers de logs
- Fichier de log et fichier de données sur la même partition physique (disque dur)
- tips : Ce problème apparait dans un contexte de forte charge SQL
- Configuration de l'application
- Valeurs des timeout trop élevées
- Utilisation des url de preproduction plutôt que des urls de production
- Configuration de debug laissé en production
- Log applicatifs trop fréquents
- ex : mauvaise configuration de log4net ; écriture de l’ensemble des infos
- Dépendances utilisées non à jour ; la dernière version ayant corrigé des problèmes de performances
- Configuration des autres applications
- Antivirus qui scrute tous les fichiers
- Outil de monitoring
- Outil de backup qui monopolise toute la bande passante
- Outils de monitoring qui surveille trop
- ex : un outil de monitoring qui effectue plusieurs vérifications par second
- ex : L’outil de monitoring relance trop fréquemment les applications
- Problème DNS : le DNS ne répond pas ou prends du temps
- info : Un site web peut avoir besoin de faire des requêtes DNS pour connaitre l'ip d'un service web.
- Système d'exploitation membre d'un Active Directory
- AD non accessible, trop lent, mal répliqué
- Batches
- Batch utilisant 100% de CPU/RAM pendant quelques secondes
- Traitement des opérations sur l’ensemble plutôt que par lot
- ex : application qui met à jour des milliers d’éléments en une fois plutot que plein de mis à jour par petit paquet.
- Mauvaise plannification des batches
- ex : Plannification des batches en période de forte activité
- Autres :
- Système d'exploitation pas à jour
- Quota définit par l'hébergeur
- Attaque DoS en cours
Problèmes liées à l'infrastructure
- Disque dur
- Erreur dans la grappe RAID
- ex : reconstruction du RAID en cours
- ex : Utilisation du bit de parité pour accéder aux données (RAID5)
- Fragmentation des disques élevée
- Partitionnement physique incohérent
- RAID logiciel plutôt que matériel
- Manque d'espace disque
- CPU
- CPU pas assez puissant
- CPU trop puissant : plus le nombre de cœur est élevé, plus les problèmes de synchro de thread sont fréquent
- Mémoire
- Manque de RAM
- info : Le système swap en permanence pour trouver de la ram
- ex : l’application fonctionne en mode dégradée (le cache n’est pas utilisé
- Système d'exploitation installé en 32 bits alors que l'on dispose de plus de 4Go de RAM
- Réseau
- Carte réseau défaillante
- Driver de carte réseau non à jour
- Surcharge réseau
- réseau mal dimensionné (utilisation de switch 10Mbits/s)
- Restriction de bande passante liée à l'hébergement
- Carte non configurée en Full-Duplex
- Switch / réseau défaillant
- perte de paquet
- Mauvaise configuration des protocoles de routages
- Topologie réseau incohérente
- ex : Plusieurs switch/routeur sont à traverser pour attaquer la base de données
- ex : Utilisation de plusieurs vlan entre les différents serveurs applicatifs
- Firewall
- Mauvaise configuration du firewall
- Sous dimensionnement du firewall
- Activation de IpV6 (ou ipv4) inutile
- Load Balancing
- Load balancer inactif
- Mauvaise répartition de la charge
- Load balancer sous dimensionnée par rapport au reste de l'infra.
- Autres :
- Mauvaise utilisation d'un proxy applicatif
- Virtualisation
- outils client non installés sur la VM
- mauvaise configuration des disques virtuels sur les disques physiques
- mauvaise configuration de l’hyperviseur
Et vous quelles autres causes avez-vous déjà rencontrés ? N’hésitez pas à me fournir vos éléments, je compléterais la liste en conséquence.