Comment identifier et éliminer rapidement les goulots d'étranglement d'un serveur, améliorer les performances du serveur et empêcher les régressions ?
Présentation
Ce guide vous explique comment résoudre un problème de serveur surchargé en quatre étapes:
- Évaluation: identifiez le goulot d'étranglement du serveur.
- Stabiliser: mettez en œuvre des correctifs rapides pour atténuer l'impact.
- Amélioration: améliore et optimise les capacités du serveur.
- Surveiller: utilisez des outils automatisés pour éviter que les problèmes ne se reproduisent.
Évaluation
Lorsque le trafic surcharge un serveur, un ou plusieurs des éléments suivants peuvent devenir un goulot d'étranglement: processeur, réseau, mémoire ou E/S disque. Identifier le goulot d'étranglement permet de concentrer les efforts sur les mesures d'atténuation les plus efficaces.
- CPU: l'utilisation du CPU dépasse systématiquement 80% doit être examinée et corrigée. Les performances des serveurs se dégradent souvent une fois que l'utilisation du processeur atteint environ 80 à 90%, puis elles deviennent plus prononcées à mesure que l'utilisation se rapproche de 100%. L'utilisation du processeur lors du traitement d'une seule requête est négligeable, mais une utilisation à une échelle adaptée aux pics de trafic peut parfois surcharger un serveur. Le déchargement de la diffusion sur une autre infrastructure, la réduction des opérations coûteuses et la limitation du nombre de requêtes permettent de réduire l'utilisation du processeur.
- Réseau: lors des périodes de trafic élevé, le débit réseau requis pour traiter les requêtes des utilisateurs peut dépasser la capacité. Certains sites, en fonction du fournisseur d'hébergement, peuvent également rencontrer des limites en termes de transfert de données cumulatif. Réduire la taille et la quantité des données transférées vers et depuis le serveur permet d'éliminer ce goulot d'étranglement.
- Mémoire: lorsqu'un système n'a pas assez de mémoire, les données doivent être déchargées sur le disque pour être stockées. L'accès au disque est considérablement plus lent que la mémoire, ce qui peut ralentir toute une application. Si la mémoire est complètement épuisée, des erreurs de type Saturation de la mémoire peuvent se produire. L'ajustement de l'allocation de mémoire, la correction des fuites de mémoire et la mise à niveau de la mémoire peuvent éliminer ce goulot d'étranglement.
- E/S disque: la vitesse à laquelle les données peuvent être lues ou écrites à partir du disque est limitée par le disque lui-même. Si les E/S disque constituent un goulot d'étranglement, l'augmentation de la quantité de données mises en cache en mémoire peut permettre de résoudre ce problème (mais cela augmente l'utilisation de la mémoire). Si cela ne fonctionne pas, il peut être nécessaire de mettre à niveau vos disques.
Les techniques présentées dans ce guide sont axées sur la résolution des goulots d'étranglement du processeur et du réseau. Pour la plupart des sites, le processeur et le réseau constituent les goulots d'étranglement les plus importants lors d'un pic de trafic.
L'exécution de top
sur le serveur concerné est un bon point de départ pour identifier les goulots d'étranglement. Le cas échéant, ajoutez les données historiques de votre fournisseur d'hébergement ou de vos outils de surveillance.
Stabiliser
Une surcharge de serveur peut rapidement entraîner des échecs en cascade ailleurs dans le système. Il est donc important de stabiliser le serveur avant d'essayer d'apporter des modifications plus importantes.
Limitation du débit
La limitation du débit protège l'infrastructure en limitant le nombre de requêtes entrantes. Ce point est d'autant plus important que les performances du serveur se dégradent: à mesure que les temps de réponse augmentent, les utilisateurs ont tendance à actualiser la page de manière agressive, augmentant encore plus la charge du serveur.
Solution
Bien que le rejet d'une requête soit relativement peu coûteux, le meilleur moyen de protéger votre serveur consiste à gérer la limitation du débit en amont (par exemple, via un équilibreur de charge, un proxy inverse ou un CDN).
Instructions :
Autres références :
Mise en cache HTTP
Cherchez des moyens de mettre en cache le contenu de manière plus agressive. Si une ressource peut être diffusée à partir d'un cache HTTP (qu'il s'agisse du cache du navigateur ou d'un CDN), il n'est pas nécessaire de la demander au serveur d'origine, ce qui réduit la charge du serveur.
Les en-têtes HTTP tels que Cache-Control
, Expires
et ETag
indiquent comment une ressource doit être mise en cache par un cache HTTP. Auditer et corriger ces en-têtes améliorera la mise en cache.
Bien que les service workers puissent également être utilisés pour la mise en cache, ils font appel à un cache distinct et viennent compléter, et non remplacer, la mise en cache HTTP appropriée. C'est pourquoi, lorsque vous gérez un serveur surchargé, vous devez vous concentrer sur l'optimisation de la mise en cache HTTP.
Diagnostic
Exécutez Lighthouse et examinez l'audit Diffuser des éléments statiques avec une règle de cache efficace pour afficher la liste des ressources ayant une durée de vie (TTL) courte ou moyenne. Pour chaque ressource répertoriée, déterminez si la valeur TTL doit être augmentée. À titre indicatif:
- Les ressources statiques doivent être mises en cache avec une longue valeur TTL (un an).
- Les ressources dynamiques doivent être mises en cache avec une valeur TTL courte (trois heures).
Solution
Définissez l'instruction max-age
de l'en-tête Cache-Control
sur le nombre de secondes approprié.
Instructions :
Dégradation progressive
La dégradation progressive est la stratégie qui consiste à réduire temporairement les fonctionnalités afin d'éviter l'excès de charge d'un système. Ce concept peut être appliqué de différentes manières: par exemple, afficher une page de texte statique au lieu d'une application complète, désactiver la recherche ou renvoyer moins de résultats de recherche, ou désactiver certaines fonctionnalités coûteuses ou non essentielles. L'accent doit être mis sur la suppression des fonctionnalités qui peuvent être supprimées facilement et en toute sécurité, avec un impact minimal sur l'entreprise.
Améliorer
Utiliser un réseau de diffusion de contenu (CDN)
La diffusion d'éléments statiques peut être déchargée de votre serveur vers un réseau de diffusion de contenu (CDN), ce qui réduit la charge.
La fonction principale d'un CDN est de livrer rapidement du contenu aux utilisateurs en fournissant un vaste réseau de serveurs situés à proximité des utilisateurs. Cependant, la plupart des CDN offrent également des fonctionnalités supplémentaires liées aux performances, telles que la compression, l'équilibrage de charge et l'optimisation des médias.
Configurer un CDN
Les CDN bénéficient d'une grande évolutivité. Il est donc rarement judicieux d'exploiter votre propre CDN. Une configuration CDN de base est assez rapide (environ 30 minutes) et consiste à mettre à jour les enregistrements DNS pour qu'ils pointent vers le CDN.
Optimiser l'utilisation du CDN
Diagnostic
Identifiez les ressources qui ne sont pas diffusées par un CDN (alors qu'elles devraient l'être) en exécutant WebPageTest. Sur la page de résultats, cliquez sur le carré au-dessus de "Utilisation efficace du CDN" pour afficher la liste des ressources à diffuser à partir d'un CDN.
![Flèche pointant vers le bouton "Utilisation efficace du CDN"](https://web.dev/static/articles/overloaded-server/image/arrow-pointing-the-effe-b5f163f623b97.jpg?authuser=5&hl=fr)
Solution
Si une ressource n'est pas mise en cache par le CDN, vérifiez que les conditions suivantes sont remplies:
- Elle comporte un en-tête
Cache-Control: public
. - Elle comporte un en-tête
Cache-Control: s-maxage
,Cache-Control: max-age
ouExpires
. - Il comporte un
Content-Length
, unContent-Range
ou unTransfer-Encoding header
.
Faire évoluer les ressources de calcul
La décision d'effectuer le scaling des ressources de calcul doit être prise avec précaution. Bien qu'il soit souvent nécessaire de faire évoluer les ressources de calcul de manière prématurée, cela peut générer une complexité architecturale inutile et des coûts financiers inutiles.
Diagnostic
Un délai avant le premier octet élevé peut indiquer qu'un serveur s'approche de sa capacité maximale. Vous trouverez ces informations dans l'audit Lighthouse Réduire le temps de réponse du serveur (TTFB) de Lighthouse.
Pour approfondir l'analyse, utilisez un outil de surveillance afin d'évaluer l'utilisation du processeur. Si l'utilisation actuelle ou prévue du processeur dépasse 80 %, envisagez d'augmenter le nombre de vos serveurs.
Solution
L'ajout d'un équilibreur de charge permet de répartir le trafic entre plusieurs serveurs. Un équilibreur de charge est placé devant un pool de serveurs et achemine le trafic vers le serveur approprié. Les fournisseurs de services cloud proposent leurs propres équilibreurs de charge (GCP, AWS, Azure). Vous pouvez également configurer les vôtres à l'aide de HAProxy ou NGINX. Une fois l'équilibreur de charge en place, vous pouvez ajouter des serveurs supplémentaires.
Outre l'équilibrage de charge, la plupart des fournisseurs de services cloud proposent l'autoscaling (GCP, AWS, Azure). L'autoscaling fonctionne conjointement avec l'équilibrage de charge. L'autoscaling adapte automatiquement les ressources de calcul à la demande à un moment donné. Cela dit, l'autoscaling n'est pas magique. La mise en ligne des nouvelles instances prend du temps et nécessite une configuration importante. En raison de la complexité supplémentaire que représente l'autoscaling, une configuration plus simple basée sur un équilibreur de charge doit être envisagée en premier.
Autoriser la compression
Les ressources textuelles doivent être compressées à l'aide de gzip ou brotli. Gzip peut réduire d'environ 70 % la taille de transfert de ces ressources.
Diagnostic
Utilisez l'audit Lighthouse Activer la compression de texte pour identifier les ressources à compresser.
Solution
Mettez à jour la configuration de votre serveur pour autoriser la compression. Instructions :
Optimisez les images et les médias
Les images constituent la majorité de la taille des fichiers sur la plupart des sites Web. L'optimisation des images permet de réduire rapidement et de manière significative la taille d'un site.
Diagnostic
Lighthouse propose différents audits permettant de signaler d'éventuelles optimisations d'images. Une autre stratégie consiste à utiliser les outils de développement pour identifier les fichiers image les plus volumineux. Ces images seront probablement optimisées.
Audits Lighthouse pertinents:
- Taille d'images correcte
- Différer les images hors écran
- Encoder efficacement les images
- Diffuser des images aux formats nouvelle génération
- Utiliser des formats vidéo pour le contenu animé
Workflow des outils pour les développeurs Chrome:
- Consigner l'activité réseau
- Cliquez sur Img pour exclure les ressources qui ne sont pas des images.
- Cliquez sur la colonne Taille pour trier les fichiers image par taille.
Solution
Si votre temps est limité...
Concentrez-vous sur l'identification des images volumineuses et fréquemment chargées et sur leur optimisation manuelle à l'aide d'un outil tel que Squoosh. Les images principales se prêtent souvent à l'optimisation.
À retenir :
- Taille: les images ne doivent pas être plus grandes que nécessaire.
- Compression: en règle générale, un niveau de qualité compris entre 80 et 85 a un impact minimal sur la qualité de l'image tout en réduisant la taille des fichiers de 30 à 40 %.
- Format: utilisez le format JPEG pour les photos plutôt que PNG. Utilisez le format MP4 pour le contenu animé plutôt que GIF.
Si vous avez plus de temps...
Envisagez de configurer un CDN pour les images si les images constituent une partie importante de votre site. Les CDN d'images sont conçus pour diffuser et optimiser des images. Ils déchargent la diffusion des images du serveur d'origine. La configuration d'un CDN pour une image est simple, mais nécessite de mettre à jour les URL d'images existantes pour qu'elles pointent vers le CDN de l'image.
Autres références :
Réduire la taille des fichiers JS et CSS
La minimisation supprime les caractères inutiles dans JavaScript et CSS.
Diagnostic
Utilisez les audits Lighthouse Minify CSS (Réduire la taille des ressources CSS) et Minify JavaScript (Minifier la taille de JavaScript) pour identifier les ressources qui doivent être minimisées.
Solution
Si vous disposez de peu de temps, concentrez-vous sur la réduction de la taille de votre code JavaScript. La plupart des sites ont plus de code JavaScript que CSS, ce qui a un impact plus important.
Surveiller
Les outils de surveillance des serveurs fournissent des données collectées, des tableaux de bord et des alertes concernant les performances des serveurs. Leur utilisation peut aider à prévenir et à atténuer les futurs problèmes de performances des serveurs.
Une configuration de surveillance doit être aussi simple que possible. Une collecte de données et des alertes excessives ont des coûts: plus la collecte ou la fréquence de la collecte de données est importante, plus leur collecte et leur stockage coûtent cher. Une alerte excessive conduit inévitablement à des pages ignorées.
Les alertes doivent utiliser des métriques qui détectent les problèmes de manière cohérente et précise. Le temps de réponse du serveur (latence) est une métrique particulièrement efficace dans ce cas de figure: elle permet d'identifier une grande variété de problèmes et d'être directement corrélée à l'expérience utilisateur. Les alertes basées sur des métriques de niveau inférieur telles que l'utilisation du processeur peuvent être un complément utile, mais elles permettent de détecter un sous-ensemble plus restreint de problèmes. En outre, les alertes doivent être basées sur les performances observées en fin de ligne (c'est-à-dire les 95e ou 99e centiles), plutôt que sur les moyennes. Sinon, les moyennes peuvent facilement masquer des problèmes qui n'affectent pas tous les utilisateurs.
Solution
Tous les principaux fournisseurs de services cloud proposent leurs propres outils de surveillance (GCP, AWS, Azure). De plus, Netdata est une excellente alternative sans frais et Open Source. Quel que soit l'outil que vous choisissez, vous devrez installer l'agent de surveillance de l'outil sur chaque serveur que vous souhaitez surveiller. Une fois l'opération terminée, veillez à configurer les alertes.
Instructions :