Les échecs les plus notables en matière de performance des applications web – un top 5

Boucles infinies involontaires

Une boucle infinie ou boucle improductive se produit dans les programmes informatiques lorsque la boucle ne se termine jamais. Cela se produit soit parce que la boucle n’a pas de condition de fin, soit parce qu’elle en a une qui ne peut jamais être remplie, soit parce qu’elle recommence la boucle. La boucle infinie fait que les programmes consomment tout le temps du processeur, ce qui fait que les systèmes ne répondent plus.

Voici un type de message d’erreur que l’utilisateur voit apparaître dans son navigateur en cas de problèmes de concurrence –

Ces problèmes de concurrence, s’ils sont traités pendant la phase de test, ne se produisent que très rarement en production et réduisent considérablement les pertes de chiffre d’affaires et d’image pour les organisations. Ces problèmes peuvent être reproduits en effectuant des tests de concurrence en temps réel. Dans mon prochain article, j’expliquerai comment un utilisateur peut effectuer de tels tests de concurrence à forte charge en utilisant Jmeter.

Allocations de mémoire et ramassage des ordures

La logique d’allocation de mémoire et de création de déchets, si elle n’est pas gérée correctement, consomme beaucoup de temps de traitement et affecte les performances d’une application. Les programmes qui manipulent des chaînes de caractères ont tendance à allouer beaucoup de mémoire, en particulier s’ils ne sont pas conçus avec soin pour éviter les allocations inutiles. L’allocation de mémoire nécessitant une synchronisation, nous devons nous assurer que les régions de mémoire allouées par différents threads ne se chevauchent pas.

D’autre part, l’allocation d’une grande quantité de mémoire signifie généralement que nous devrons également effectuer un grand nombre de ramassages pour récupérer la mémoire qui a été libérée. Si le ramassage des ordures domine le temps d’exécution du programme, il ne fera qu’augmenter le ramassage des ordures.

Questions relatives à la localité

Parfois, la modification d’un programme pour qu’il s’exécute en parallèle a un effet négatif sur la localité. Par exemple, disons que nous voulons effectuer une opération sur chaque élément d’un tableau. Sur une machine à deux cœurs, nous pourrions créer deux tâches : l’une pour effectuer l’opération sur les éléments ayant des indices pairs et l’autre pour traiter les indices impairs.

Mais la conséquence négative est que la localité de référence se dégrade avec chaque fil. Les éléments auxquels un thread doit accéder sont intercalés avec des éléments dont il ne se préoccupe pas. Chaque ligne de cache contiendra deux fois moins d’éléments qu’auparavant, ce qui peut signifier que deux fois plus d’accès à la mémoire iront jusqu’à la mémoire principale.

Dans ce cas particulier, une solution consiste à diviser le tableau en une moitié gauche et une moitié droite, plutôt qu’en éléments pairs et impairs. Dans les cas plus complexes, le problème et la solution peuvent ne pas être aussi évidents, de sorte que l’effet de la parallélisation sur la localité de référence est l’une des choses à garder à l’esprit lors de la conception d’algorithmes parallèles.

Blocages de base de données

Les blocages de base de données se produisent dans un système lorsque plusieurs processus attendent que l’autre (les autres) libère(nt) un (des) verrou(s) et qu’aucun d’entre eux ne peut traiter sa demande à moins que l’autre ne libère le verrou.

Par exemple, dans l’exemple ci-dessous, le processus 1 et le processus 2 attendent l’un et l’autre que l’autre ait terminé sa requête, ce qui crée un blocage.

Équilibrage de la charge

L’équilibrage des charges est une méthode de réseau informatique permettant de répartir les charges de travail entre plusieurs serveurs (ordinateurs) ou une grappe d’ordinateurs, des liaisons réseau, des unités centrales ou d’autres ressources. Un bon équilibrage de la charge permet d’optimiser l’utilisation des ressources, de maximiser le débit, de minimiser le temps de réponse et d’éviter les surcharges. L’utilisation de plusieurs composants avec équilibrage de la charge au lieu d’un seul composant peut accroître la fiabilité grâce à la redondance. Le fait de décharger certaines tâches de votre serveur web sur l’équilibreur de charge, comme l’accélération SSL, permet d’augmenter la capacité de ce dernier.

L’absence d’un équilibrage approprié de la charge peut causer des ravages dans les systèmes. Le manque de visibilité et la sous-utilisation des fonctionnalités et des capacités peuvent conduire à de tels problèmes. Elle peut également être le résultat d’algorithmes non optimisés. Le fait d’avoir des unités centrales de grande capacité derrière vos équilibreurs de charge ne garantit pas toujours des temps de réponse rapides.

Pour un équilibrage efficace de la charge, nous devons nous assurer que la charge est répartie uniformément sur les différentes machines. Ce n’est pas aussi simple qu’il n’y paraît, car le temps nécessaire à l’exécution des différents « morceaux » de travail peut varier considérablement. En outre, nous ignorons souvent la quantité de travail nécessaire pour chaque élément jusqu’à ce que nous l’exécutions jusqu’à son terme.

Ex – Supposons que toutes les itérations d’une boucle nécessitent un traitement similaire et prennent le même temps, nous pourrions simplement diviser la plage en autant de plages contiguës que nous avons de cœurs, et assigner chaque plage à un cœur. Malheureusement, ce n’est pas le cas et le travail par itération varie. Il est donc possible qu’un noyau se retrouve avec de nombreuses itérations consommatrices de processus, alors que d’autres noyaux auront moins de travail à effectuer. Dans une situation extrême, un seul noyau peut se voir confier la quasi-totalité du travail, ce qui nous ramène au cas séquentiel.