Recommandations pour optimiser le code et l’infrastructure
S’applique à cette recommandation de liste de contrôle d’efficacité des performances d’Azure Well-Architected Framework :
PE :07 | Optimisez le code et l’infrastructure. Utilisez du code performant et assurez-vous qu’il décharge les responsabilités sur la plateforme. Utilisez le code et l’infrastructure uniquement pour leur objectif principal et uniquement si nécessaire. |
---|
Ce guide décrit les recommandations pour optimiser les performances du code et de l’infrastructure. Pour optimiser votre code et votre infrastructure, vous devez utiliser vos composants uniquement pour leur objectif principal et uniquement en cas de besoin. Lorsque vous surutilisez le code et l’infrastructure, cela crée une consommation de ressources inutile, des goulots d’étranglement et des réponses lentes. Pour compenser ces inefficacités, vous devez ajouter des ressources supplémentaires pour accomplir les mêmes tâches.
Définitions
Terme | Définition |
---|---|
Accès concurrentiel | Lorsque plusieurs tâches ou processus sont exécutés à la fois, mais pas nécessairement en même temps. |
Architecture UC | Composants et principes qui affectent le fonctionnement de l’ordinateur. |
Compression des données | Action de réduire la taille des fichiers en réduisant les données redondantes. |
Segment de mémoire (heap) | Zone de mémoire utilisée pour les allocations de mémoire d’exécution. |
Fuite de mémoire | Lorsqu’une charge de travail ne parvient pas à libérer la mémoire allouée une fois que la mémoire n’est plus nécessaire. |
Parallélisme | Lorsque plusieurs tâches ou processus sont exécutés en même temps. |
Stratégies de conception
L’optimisation du code et de l’infrastructure implique d’affiner le code et l’infrastructure de prise en charge pour améliorer l’efficacité des performances. Il nécessite un code performant qui exécute des tâches rapidement et ne gaspille pas de ressources. Elle nécessite une infrastructure bien conçue et rationalisée pour éviter une complexité inutile. Une charge de travail doit utiliser les fonctionnalités inhérentes de la plateforme. Il s’agit d’une approche qui permet de s’assurer que le code et l’infrastructure sont utilisés principalement à leurs fins principales et uniquement si nécessaire.
Optimiser les performances du code
Pour optimiser les performances du code, modifiez le code pour réduire l’utilisation des ressources, réduire le runtime et améliorer les performances. Vous pouvez modifier le code pour améliorer l’efficacité et la vitesse d’un programme logiciel. Ne masquez pas les problèmes de performances avec la force brute. La force brute signifie l’ajout de ressources de calcul pour compenser les performances du code, comme l’ajout d’une capacité supplémentaire au lieu de traiter la source. Vous devez résoudre les problèmes de performances avec l’optimisation. Lorsque vous optimisez les performances du code, cela permet d’optimiser l’utilisation des ressources système, d’améliorer le temps de réponse, de réduire la latence et d’améliorer l’expérience utilisateur.
instrumentalisation de votre code
L’instrumentation de code fait référence à la pratique consistant à ajouter des extraits de code ou des bibliothèques au code qui collectent des données et surveillent les performances du code pendant l’exécution. L’instrumentation du code permet aux développeurs de collecter des informations sur les métriques clés telles que la consommation des ressources (uc, utilisation de la mémoire) et le temps d’exécution. En instrumentant le code, les développeurs peuvent obtenir des insights sur les chemins d’accès chauds du code, identifier les goulots d’étranglement des performances et optimiser le code pour une meilleure efficacité des performances.
Dans un environnement idéal, vous devez effectuer une analyse du code au début du cycle de vie du développement logiciel. Plus vous interceptez tôt un problème de code, moins il est bon de le résoudre. Vous souhaitez automatiser autant que possible cette analyse de code. Utilisez des outils d’analyse de code dynamiques et statiques pour réduire l’effort manuel. Toutefois, gardez à l’esprit que ce test est toujours une simulation de production. La production fournit la compréhension la plus claire de l’optimisation du code.
Compromis : les outils de surveillance du code sont susceptibles d’augmenter les coûts.
Identifier les chemins d’accès chauds
En instrumentant votre code, vous pouvez mesurer la consommation de ressources pour différents chemins de code. Ces mesures vous aident à identifier les chemins chauds. Les chemins d’accès chauds ont un effet significatif sur les performances et l’utilisation des ressources. Il s’agit de sections critiques ou fréquemment exécutées d’un programme qui nécessitent des performances élevées et une faible latence. Pour identifier les chemins d’accès chauds du code, procédez comme suit :
Analyser les données d’exécution : collectez les données d’exécution et analysez-les pour identifier les zones du code qui consomment des ressources importantes, telles que le processeur, la mémoire ou les opérations d’E/S. Recherchez des modèles ou des sections de code qui sont fréquemment exécutés ou qui prennent beaucoup de temps.
Mesurer les performances : utilisez des outils de profilage ou des infrastructures de test des performances pour mesurer le temps d’exécution et la consommation de ressources de différents chemins de code. Il permet d’identifier les goulots d’étranglement et les domaines à améliorer.
Tenez compte de la logique métier et de l’effet utilisateur : évaluez l’importance des différents chemins de code en fonction de leur pertinence par rapport aux fonctionnalités de l’application ou aux opérations métier critiques. Déterminez quels chemins de code sont essentiels pour fournir de la valeur aux utilisateurs ou répondre aux exigences de performances.
Optimiser la logique de code
L’optimisation de la logique de code consiste à affiner la structure et la conception du code pour effectuer des tâches avec moins de ressources. Une logique améliorée réduit les opérations inutiles. Il crée une exécution plus rapide avec moins de consommation de ressources. Vous devez supprimer toutes les opérations inutiles dans le chemin du code qui peuvent affecter les performances. Hiérarchiser l’optimisation des chemins d’accès chauds pour obtenir les meilleurs gains d’efficacité en matière de performances. Pour optimiser la logique du code, tenez compte des stratégies suivantes :
Supprimer les appels de fonction inutiles : passez en revue votre code et identifiez toutes les fonctions qui ne sont pas essentielles pour la fonctionnalité souhaitée et qui peuvent affecter les performances de manière négative. Par exemple, si un appel de fonction effectue une validation effectuée précédemment dans le code, vous pouvez supprimer l’appel de fonction de validation inutile.
Réduire les opérations de journalisation : la journalisation peut être utile pour le débogage et l’analyse, mais une journalisation excessive peut affecter les performances. Évaluez la nécessité de chaque opération de journalisation et supprimez tous les appels de journalisation inutiles qui ne sont pas critiques pour l’analyse des performances.
Optimiser les boucles et les conditions : analysez les boucles et les conditions dans votre code et identifiez les itérations ou conditions inutiles qui peuvent être supprimées. La simplification et l’optimisation de ces structures peuvent améliorer les performances de votre code. Réduisez les appels de fonction dans les boucles et éliminez les calculs redondants. Envisagez de déplacer des calculs en dehors de la boucle ou d’utiliser le déroulement des boucles.
Réduire le traitement inutile des données : passez en revue votre code pour toutes les opérations de traitement de données inutiles, telles que les calculs ou transformations redondants. Éliminez ces opérations inutiles pour améliorer l’efficacité de votre code.
Optimisez les structures de données. Pour stocker et récupérer efficacement des données, sélectionnez les structures de données appropriées, telles que des tableaux, des listes liées, des arborescences et des tables de hachage. Choisissez la meilleure structure de données pour un problème spécifique. Une structure de données appropriée améliore les performances de l’application.
Réduire les requêtes réseau : si votre code implique d’effectuer des requêtes réseau, réduisez le nombre de requêtes et optimisez leur utilisation. Traiter les demandes par lot lorsque cela est possible et éviter les allers-retours inutiles pour améliorer les performances.
Réduire les allocations : identifiez les zones où une allocation de mémoire excessive se produit. Optimisez le code en réduisant les allocations inutiles et en réutilisant les ressources existantes lorsque cela est possible. En réduisant les allocations, vous pouvez améliorer l’efficacité de la mémoire et les performances globales. Utilisez les stratégies de gestion de la mémoire et de garbage collection appropriées pour votre langage de programmation.
Réduire la taille de la structure de données : évaluez la taille de vos structures de données, telles que les classes, et identifiez les zones où la réduction est possible. Passez en revue les exigences en matière de données et éliminez les champs ou propriétés inutiles. Optimisez l’utilisation de la mémoire en sélectionnant les types de données appropriés et en empaquetant efficacement les données.
Utilisez des sdk et des bibliothèques optimisés pour les performances. Utilisez des SDK natifs ou des bibliothèques optimisées pour les performances. Les SDK natifs sont conçus pour interagir avec les services et les ressources sur une plateforme ou au sein d’une infrastructure. Par exemple, les SDK natifs cloud fonctionnent mieux avec les plans de données de service cloud qu’avec l’accès API personnalisé. Les SDK excellent dans la gestion des demandes réseau et l’optimisation des interactions. Les bibliothèques optimisées pour les performances, telles que les Math.NET, contiennent des fonctions optimisées pour les performances. Lorsque vous appliquez les fonctions de manière appropriée, vous pouvez améliorer les performances de votre charge de travail.
Implémentation transversale : tenez compte des effets des implémentations transversales, telles que les vérifications d’intergiciels ou de jetons, et évaluez si elles affectent négativement les performances.
Passez en revue les recommandations en matière de performances spécifiques au langage de programmation que vous utilisez. Évaluez votre code par rapport à ces recommandations pour identifier les domaines à améliorer.
Compromis :
- L’optimisation du code et des chemins d’accès à chaud nécessite une expertise des développeurs dans l’identification des inefficacités du code est subjective et peut être une personne hautement qualifiée requise pour d’autres tâches.
- Les kits SDK offrent des fonctionnalités pratiques et éliminent la complexité de l’interaction avec les API. Toutefois, les kits SDK peuvent limiter vos options de contrôle et de personnalisation pour le code personnalisé.
Optimiser la gestion de la mémoire
L’optimisation de la gestion de la mémoire implique d’affiner la façon dont une charge de travail utilise, alloue et libère les ressources mémoire pour améliorer l’efficacité. Une gestion appropriée de la mémoire améliore les performances du code, car elle réduit la surcharge des opérations de mémoire. Une utilisation efficace de la mémoire réduit la latence, empêche les ralentissements ou les plantages du système et optimise le débit des tâches de calcul. Envisagez les stratégies suivantes pour optimiser la gestion de la mémoire.
Déboguer les problèmes de mémoire. Les vidages de mémoire sont des instantanés de mémoire d’application. Ils capturent l’état de la mémoire d’une application à un point spécifique dans le temps. Les vidages de mémoire permettent une analyse rétrospective des problèmes liés à la mémoire. Sélectionnez le type de vidage de mémoire approprié en fonction de la nature du problème que vous essayez de diagnostiquer et des ressources disponibles. Vous devez utiliser des vidages miniatures pour le débogage de routine et des vidages complets pour les problèmes complexes et critiques. Cette stratégie offre un équilibre entre l’utilisation des ressources et les fonctionnalités de diagnostic. De nombreux services d’hébergement de code prennent en charge le débogage de mémoire. Vous devez préférer les services qui prennent en charge l’analyse de la mémoire à ceux qui ne le font pas. Voici les étapes de base pour déboguer les problèmes de mémoire :
Capturer les vidages de mémoire : commencez par configurer un mécanisme pour capturer les vidages de mémoire pendant l’exécution de votre application. La capture peut être déclenchée manuellement, automatiquement ou lorsque des conditions spécifiques (comme une consommation excessive de mémoire) sont remplies. Certains services cloud peuvent déjà proposer ce processus.
Analyser les vidages de mémoire : une fois que vous avez collecté les vidages de mémoire, analysez-les. De nombreux outils peuvent vous aider à inspecter ces vidages, tels que WinDbg pour les applications Windows ou GDB pour les systèmes Unix.
Identifier les fuites de mémoire : concentrez-vous sur l’identification des fuites de mémoire pendant l’analyse. Des fuites de mémoire se produisent lorsque votre application alloue de la mémoire, mais ne parvient pas à la libérer lorsque la mémoire n’est plus nécessaire. Recherchez des objets ou des structures de données qui restent en mémoire même quand ils doivent être libérés.
Correction et test : après avoir identifié le code problématique, concentrez-vous sur la résolution des problèmes de mémoire. Les résolutions peuvent impliquer la libération correcte de la mémoire, l’optimisation des structures de données ou la réévaluation des pratiques de gestion de la mémoire. Vérifiez que vos solutions sont soumises à des tests rigoureux pour garantir leur efficacité.
Itérer et surveiller : la gestion de la mémoire est un processus continu. Surveillez régulièrement l’utilisation de la mémoire de votre application et conservez la collecte des vidages de mémoire en production. Passez régulièrement en revue les étapes d’analyse et d’optimisation pour vous assurer que les problèmes de mémoire ne réapparaîtront pas avec les modifications de code suivantes.
En incorporant l’analyse du vidage de la mémoire dans votre cycle de vie de développement logiciel, vous pouvez amplifier la fiabilité et l’efficacité de vos applications. Cela permet de réduire la probabilité de problèmes liés à la mémoire en production.
Réduisez les allocations de mémoire. Réduisez les allocations de mémoire pour réduire l’empreinte mémoire globale du code. Votre charge de travail peut utiliser efficacement la mémoire disponible. Le récupérateur de mémoire a moins besoin de récupérer la mémoire inutilisée, et il réduit la fréquence et la durée des cycles de nettoyage de la mémoire. Les allocations de mémoire peuvent être coûteuses, en particulier si vous les effectuez fréquemment. Réduisez les allocations de mémoire afin que le code puisse s’exécuter rapidement et efficacement.
Les caches stockent les données fréquemment consultées à proximité du processeur, ce qui améliore les performances. Lorsque vous réduisez les allocations de mémoire, il y a moins de contention pour l’espace du cache, ce qui vous permet d’utiliser efficacement le cache. Un nombre élevé d’allocations de mémoire peut dégrader les performances de l’application et générer des erreurs. Voici d’autres façons de réduire les allocations de mémoire :
Variables locales : utilisez des variables locales au lieu de variables globales pour réduire la consommation de mémoire.
Initialisation différée : implémentez l’initialisation différée pour différer la création d’objets ou de ressources jusqu’à ce qu’ils soient nécessaires.
Mémoires tampons : gérez efficacement les tampons pour éviter d’allouer des mémoires tampons volumineuses.
Regroupement d’objets : envisagez le regroupement d’objets pour réutiliser des objets volumineux au lieu de les allouer et de les désallouer.
Pour plus d’informations, consultez Réduire les allocations de mémoire et Le tas d’objets volumineux sur les systèmes Windows.
Utiliser l’accès concurrentiel et le parallélisme
L’utilisation de l’accès concurrentiel et du parallélisme implique l’exécution de plusieurs tâches ou processus simultanément ou d’une manière qui se chevauche pour utiliser efficacement les ressources informatiques. Ces techniques augmentent le débit global et le nombre de tâches qu’une charge de travail peut traiter. Lorsque vous exécutez des tâches simultanément ou en parallèle, cela réduit le runtime de l’application, diminue la latence et augmente les temps de réponse. L’accès concurrentiel et le parallélisme permettent une utilisation efficace des ressources de calcul, telles que les cœurs de processeur ou les systèmes distribués. L’accès concurrentiel et le parallélisme répartissent efficacement la charge de travail entre les ressources de calcul.
Utilisez le parallélisme. Le parallélisme est la capacité d’un système à déclencher simultanément plusieurs tâches ou processus sur plusieurs ressources informatiques. Le parallélisme divise une charge de travail en tâches plus petites exécutées en parallèle. Vous pouvez atteindre le parallélisme en utilisant des techniques telles que le multitraitement ou l’informatique distribuée. Distribuez les tâches entre les processeurs multicœurs pour optimiser la gestion des charges de travail. Optimisez le code pour tirer parti de l’architecture du processeur, des modèles de thread et des processeurs multicœurs. Lorsque vous exécutez du code en parallèle, les performances s’améliorent, car la charge de travail est distribuée sur plusieurs cœurs.
Utilisez l’accès concurrentiel. L’accès concurrentiel est la capacité d’un système à exécuter plusieurs tâches ou processus. L’accès concurrentiel permet à différentes parties d’un programme de progresser indépendamment, ce qui peut améliorer les performances globales. Vous pouvez implémenter l’accès concurrentiel à l’aide de techniques telles que le multithreading, dans lequel plusieurs threads s’exécutent simultanément au sein d’un même processus. Vous pouvez également utiliser la programmation asynchrone, dans laquelle les tâches sont déclenchées simultanément.
Programmation asynchrone : la programmation asynchrone est une approche permettant de déclencher des tâches sans bloquer le thread main. La programmation asynchrone permet à un programme de déclencher des tâches tout en attendant la fin des opérations de longue durée. Avec la programmation asynchrone, le programme peut lancer plusieurs tâches et attendre qu’elles se terminent de manière asynchrone. Le programme n’a pas besoin d’attendre la fin de chaque tâche avant de passer à la suivante.
Il existe de nombreuses techniques et modèles de programmation asynchrones, en fonction du langage de programmation et de la plateforme. Une approche courante consiste à utiliser des mots clés et des constructions asynchrones, tels que
async
etawait
, dans des langages comme C#. Avec ces mots clés, vous pouvez définir des méthodes asynchrones. Pour le trafic HTTP, envisagez d’utiliser le modèle de Request-Reply asynchrone.De nombreuses infrastructures et bibliothèques fournissent une prise en charge intégrée de la programmation asynchrone. Par exemple, dans la plateforme .NET, vous pouvez implémenter des opérations asynchrones à l’aide de modèles tels que le modèle asynchrone basé sur les tâches et le modèle asynchrone basé sur les événements. L’implémentation spécifique de la programmation asynchrone varie en fonction du langage de programmation, de la plateforme et des exigences de l’application.
Files d’attente : une file d’attente est une mémoire tampon de stockage située entre un composant demandeur (producteur) et le composant de traitement (consommateur) de la charge de travail. Il peut y avoir plusieurs consommateurs pour une seule file d’attente. À mesure que les tâches augmentent, vous devez mettre à l’échelle les consommateurs pour répondre à la demande. Le producteur place les tâches dans une file d’attente. La file d’attente stocke les tâches jusqu’à ce qu’un consommateur ait une capacité. Une file d’attente est souvent la meilleure façon de transmettre le travail à un service de traitement qui connaît des pics de demande. Pour plus d’informations, consultez Modèle de nivellement de charge basé sur la file d’attente et Files d’attente de stockage et files d’attente Service Bus.
Utiliser le regroupement de connexions
Le regroupement de connexions consiste à réutiliser des connexions aux bases de données établis au lieu de créer une connexion pour chaque requête. L’établissement d’une connexion à une base de données peut être coûteux. Vous devez créer une connexion réseau authentifiée au serveur de base de données distant. Les connexions de base de données sont particulièrement coûteuses pour les applications qui ouvrent fréquemment de nouvelles connexions. Le regroupement de connexions réutilise les connexions existantes et élimine les dépenses liées à l’ouverture d’une nouvelle connexion pour chaque requête. Le regroupement de connexions réduit la latence de connexion et permet un débit de base de données élevé (transactions par seconde) sur le serveur. Vous devez choisir une taille de pool qui peut gérer plus de connexions que vous n’en avez actuellement. L’objectif est de permettre au pool de connexions de gérer rapidement les nouvelles demandes entrantes.
Comprendre les limites de regroupement de connexions. Certains services limitent le nombre de connexions réseau. Lorsque vous dépassez cette limite, les connexions peuvent ralentir ou s’arrêter. Vous pouvez utiliser le regroupement de connexions pour établir un ensemble fixe de connexions au moment du démarrage, puis gérer ces connexions. Dans de nombreux cas, une taille de pool par défaut peut se composer de quelques connexions qui s’exécutent rapidement dans les scénarios de test de base. Votre application peut épuiser la taille de pool par défaut sous l’échelle et créer un goulot d’étranglement. Vous devez établir une taille de pool qui correspond au nombre de transactions simultanées prises en charge sur chaque application instance.
Testez le pool de connexions. Chaque base de données et plateforme d’application a des exigences légèrement différentes pour la configuration et l’utilisation d’un pool. Testez votre pool de connexions pour vous assurer qu’il fonctionne efficacement sous charge.
Risque : le regroupement de connexions peut créer une fragmentation du pool et dégrader les performances.
Optimiser les travaux en arrière-plan
De nombreuses applications nécessitent des tâches en arrière-plan qui s’exécutent indépendamment de l’interface utilisateur. L’application peut démarrer le travail et continuer à traiter les demandes interactives des utilisateurs. Des exemples de travaux en arrière-plan incluent les travaux par lots, les tâches gourmandes en processeur et les processus de longue durée, tels que les workflows. Les tâches en arrière-plan ne doivent pas bloquer l’application ou entraîner des incohérences en raison d’un retard d’opération lorsque le système est en cours de chargement. Pour améliorer les performances, vous pouvez mettre à l’échelle les instances de calcul qui hébergent des tâches en arrière-plan. Pour plus d’informations, consultez Travaux en arrière-planet Considérations relatives à la mise à l’échelle et aux performances.
Optimiser les performances de l’infrastructure
L’optimisation des performances de l’infrastructure implique d’améliorer et d’ajuster les éléments d’infrastructure pour garantir un fonctionnement optimal et une utilisation optimale des ressources pour une charge de travail. En réglant l’infrastructure, vous pouvez réduire le gaspillage, réduire les retards et en faire plus avec les ressources disponibles. Il garantit que les charges de travail s’exécutent de manière fiable et rapide, ce qui permet d’améliorer les expériences utilisateur et de réaliser des économies. Pour optimiser les performances de l’infrastructure, envisagez les stratégies suivantes :
Ajoutez des limites d’utilisation. Vous pouvez implémenter des limites d’utilisation sur certains composants de charge de travail. Par exemple, pour supprimer les pods instables, vous pouvez définir des limites de processeur et de mémoire dans Azure Kubernetes Service (AKS). Pour optimiser les performances, vous pouvez définir des limites de mémoire dans les machines virtuelles Java.
Rationalisez l’infrastructure. Simplifiez votre charge de travail pour réduire le risque de problèmes d’interaction, de dépendance et de compatibilité. Lorsque vous simplifiez votre charge de travail, vous optimisez l’utilisation des ressources de la mémoire, de la puissance de traitement et du stockage.
Réduisez la charge. Pour réduire la charge de travail, réduisez la demande d’une application et autorisez les ressources à effectuer leurs tâches principales. Par exemple, il est courant d’éviter d’exécuter des solutions de sécurité dans votre code ou sur des instances de calcul individuelles. Au lieu de cela, les serveurs web doivent traiter les requêtes HTTP. Les pare-feu d’applications web et les ressources de passerelle peuvent gérer les vérifications de sécurité. Les stratégies suivantes permettent de réduire la charge de travail :
Cohérence à terme : adoptez un modèle de cohérence éventuel pour améliorer les performances en permettant aux données d’être légèrement datées. La cohérence finale réduit la demande immédiate sur les cycles du processeur et la bande passante réseau pour les mises à jour de données constantes.
Déléguer des tâches : déléguer des tâches serveur à des clients ou des intermédiaires, tels que des index de recherche et des caches. Déléguer des tâches telles que le tri des données, le filtrage des données ou le rendu des vues. Lorsque vous déchargez ces tâches, vous réduisez la charge de travail sur vos serveurs et améliorez les performances.
Optimisez le réseau. Pour optimiser les performances d’un réseau de charge de travail, configurez et ajustez l’infrastructure réseau. Assurez-vous que la charge de travail peut fonctionner à son niveau d’efficacité le plus élevé.
Protocoles réseau : effectuez une mise à niveau vers des protocoles modernes comme HTTP/2, qui permettent l’envoi de plusieurs requêtes via une seule connexion. Les protocoles modernes réduisent la surcharge liée à l’établissement de nouvelles connexions.
Compromis : les protocoles modernes peuvent exclure des clients plus anciens.
Conversation réseau : regrouper les requêtes réseau pour réduire le nombre de demandes. Au lieu d’effectuer plusieurs petites requêtes, combinez-les en demandes plus volumineuses pour réduire la surcharge réseau.
Requêtes de base de données : assurez-vous que les requêtes de base de données récupèrent uniquement les informations nécessaires. Évitez de récupérer de grandes quantités de données inutiles, ce qui peut entraîner une augmentation du trafic réseau et des performances lentes.
Données statiques : utilisez un réseau de distribution de contenu pour mettre en cache du contenu statique fréquemment consulté et proche des utilisateurs. Lorsque vous mettez en cache des données, elles n’ont pas besoin de parcourir de longues distances. La mise en cache améliore les temps de réponse et réduit le trafic réseau.
Collecte des journaux : collectez et conservez uniquement les données de journal nécessaires pour répondre à vos besoins. Configurez des règles de collecte de données et implémentez des considérations de conception pour optimiser vos coûts Log Analytics.
Compression des données : compressez et regroupez le contenu HTTP et les données de fichier pour permettre une transmission rapide entre les clients et les serveurs. La compression réduit les données qu’une page ou une API retourne et renvoie au navigateur ou à l’application cliente. La compression optimise le trafic réseau, ce qui peut accélérer la communication de l’application.
Compromis : la compression ajoute un traitement côté serveur et côté client. L’application doit compresser, envoyer et décompresser les données. La communication multidiffusion, ou communication avec plusieurs destinataires, peut créer une surcharge de décompression. Vous devez tester et mesurer les variations de performances avant et après l’implémentation de la compression des données pour déterminer si elle convient à votre charge de travail. Pour plus d’informations, consultez Compression des réponses dans ASP.NET Core.
Animation Azure
Code d’instrumentation : Azure Monitor Application Insights prend en charge l’instrumentation automatique (autoinstrumentation) et l’instrumentation manuelle du code d’application. L’instrumentation automatique permet la collecte de données de télémétrie sans toucher au code de l’application. L’instrumentation manuelle nécessite des modifications de code pour implémenter Application Insights ou l’API OpenTelemetry. Vous pouvez utiliser Application Insights Profiler pour optimiser les chemins d’accès à chaud.
Optimisation de la logique du code : Azure propose des sdk et des bibliothèques pour différents langages de programmation afin d’interagir avec les services Azure. Utilisez les kits SDK pour simplifier les interactions entre les applications et les ressources Azure. Les kits SDK fournissent une interaction optimale avec les services Azure, ce qui réduit la latence et améliore l’efficacité.
Optimisation de la gestion de la mémoire : utilisez la fonctionnalité de détection intelligente d’Application Insights pour analyser la consommation de mémoire et aider à identifier et résoudre les fuites de mémoire.
Azure App Service dispose d’un profileur et d’une fonctionnalité de collecte et d’analyse de vidage de mémoire. La fonctionnalité de App Service de répétition automatique peut prendre automatiquement des vidages de mémoire et des traces de profil des applications .NET et Java.
Utilisation de l’accès concurrentiel et du parallélisme : différents services Azure fournissent une prise en charge unique de l’accès concurrentiel, par exemple Azure Cosmos DB, Azure Functions et stockage Blob. Pour le parallélisme, les services AKS prennent en charge le déploiement d’applications conteneurisées, ce qui améliore le traitement parallèle.
Azure Batch est un service de planification des travaux basé sur le cloud que vous pouvez utiliser pour activer le calcul parallèle et hautes performances sans avoir à configurer l’infrastructure. Pour plus d’informations, consultez Travaux en arrière-plan.
Optimisation des performances de l’infrastructure : implémentez des modèles Azure Resource Manager pour définir et déployer l’infrastructure à l’aide de code. Utilisez ces modèles pour implémenter des déploiements de ressources efficaces, reproductibles et cohérents. Azure Policy fournit des fonctionnalités de gouvernance pour s’assurer que les déploiements de ressources respectent les meilleures pratiques et normes organisationnelles.
Pour la programmation asynchrone, utilisez des services de mise en file d’attente scalables, tels que stockage file d’attente Azure et Azure Service Bus, pour faciliter la programmation asynchrone. Vous pouvez mettre en file d’attente des tâches et les traiter indépendamment. Pour prendre en charge les opérations asynchrones, Place de marché Azure propose des files d’attente et des outils tiers que vous pouvez intégrer aux services Azure.
Liens connexes
- AKS
- Fonctionnalité de détection intelligente Application Insights
- Modèle de demande-réponse asynchrone
- Éviter les allocations de mémoire
- Azure Batch
- Azure Policy
- Modèles Microsoft Azure Resource Manager
- Kits Azure SDK
- Travaux en arrière-plan
- Considérations relatives à la mise à l’échelle et aux performances des travaux en arrière-plan
- Compresser les données de fichier
- Compresser le contenu HTTP
- Définir des limites de processeur et de mémoire de pod
- Modèle asynchrone basé sur les événements
- Machines virtuelles Java
- Tas d'objets volumineux
- Fragmentation du pool
- Modèle de nivellement de charge basé sur une file d’attente
- Compression de réponse dans ASP.NET Core
- Files d’attente de stockage et files d’attente Service Bus
- Modèle asynchrone basé sur les tâches
Liste de contrôle d’efficacité des performances
Reportez-vous à l’ensemble complet de recommandations.