Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

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.

Posted: samedi 19 février 2011 15:20 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

JeremyJeanson a dit :

Très bonne liste Cyril...

Avec tellement de points déjà rencontrés en production :(

# février 19, 2011 17:26

Graveen a dit :

Trés pertinent Cyril, merci. Je prends un peu de recul avec les technos MS en ce moment, mais cette liste est tout à fait pertinente.

# février 19, 2011 21:32

Billou_13 a dit :

Effectivement, cela fait resurgir quelques problèmes lors de mise en prod...

Merci Cyril !

# février 21, 2011 09:46

zorky a dit :

sur "Mauvaise utilisation du framework" : non désabonnement à des évènements, ce qui pt conduire à une catastrophe car le GC ne libère jamais les objets attachés

# février 22, 2011 11:36

coq a dit :

Dans le même ordre d'idée on peut ajouter la mise en variable de session de quelque chose tenant une référence à un contrôle/une page/... ASP.NET.

# février 22, 2011 12:02

cyril a dit :

@zorky : je l'ai eu aussi celui la ... en plus, c'est galère à detecter.

@coq : en quoi cela pose des problèmes de perfs ? :)

# février 23, 2011 00:16

coq a dit :

Dans ce cas là on peut se retrouver avec un joli graphe d'objets qui ne seront pas libérables avant expiration de la session, avec dans certains cas une consommation mémoire qui monte de manière assez impressionante.

En 32bit ça devrait se finir en OutOfMemory assez rapidement, mais en 64bit ça peut aller très loin.

# février 23, 2011 08:52

MrKhal a dit :

Tres bonne liste Cyril

# février 28, 2011 18:48
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01

- SharePoint Online: Script PowerShell pour supprimer une colonne dans tous les sites d’une collection par Blog Technique de Romelard Fabrice le 11-27-2018, 18:01