Suggerimenti per l'ottimizzazione del codice e dell'infrastruttura

Si applica a questa raccomandazione per l'efficienza delle prestazioni di Azure Well-Architected Framework:

PE:07 Ottimizzare il codice e l'infrastruttura. Usare il codice con prestazioni elevate e assicurarsi che offload delle responsabilità per la piattaforma. Usare il codice e l'infrastruttura solo per lo scopo principale e solo quando necessario.

Questa guida descrive le raccomandazioni per ottimizzare le prestazioni del codice e dell'infrastruttura. Per ottimizzare il codice e l'infrastruttura, è consigliabile usare i componenti solo per lo scopo principale e solo quando necessario. Quando si sovrautilizza il codice e l'infrastruttura, crea un consumo di risorse non necessario, colli di bottiglia e risposte lente. Per compensare tali inefficienze, è necessario aggiungere altre risorse per eseguire le stesse attività.

Definizioni

Termine Definizione
Concorrenza Quando più attività o processi vengono eseguiti contemporaneamente, ma non necessariamente contemporaneamente.
Architettura della CPU Componenti e principi che influiscono sul funzionamento del computer.
Compressione dei dati L'azione di ridurre le dimensioni dei file riducendo al minimo i dati ridondanti.
Heap Area in memoria usata per le allocazioni di memoria di runtime.
Perdita di memoria Quando un carico di lavoro non riesce a rilasciare la memoria allocata dopo che la memoria non è più necessaria.
Parallelismo Quando più attività o processi vengono eseguiti contemporaneamente.

Strategie di progettazione chiave

L'ottimizzazione del codice e dell'infrastruttura comporta l'ottimizzazione del codice e dell'infrastruttura di supporto per migliorare l'efficienza delle prestazioni. Richiede codice con prestazioni elevate che esegue rapidamente le attività e non sprecare risorse. Richiede un'infrastruttura ben progettata che sia semplificata per evitare complessità non necessarie. Un carico di lavoro deve usare le funzionalità intrinseche della piattaforma. Si tratta di un approccio che consente di garantire che sia il codice che l'infrastruttura vengano usati principalmente per i loro scopi di base e solo quando necessario.

Ottimizzare le prestazioni del codice

Per ottimizzare le prestazioni del codice, modificare il codice per ridurre l'utilizzo delle risorse, ridurre al minimo il runtime e migliorare le prestazioni. È possibile modificare il codice per migliorare l'efficienza e la velocità di un programma software. Non mascherare i problemi di prestazioni con la forza bruta. Forza bruta significa aggiungere risorse di calcolo per compensare le prestazioni del codice, ad esempio l'aggiunta di capacità aggiuntiva anziché l'indirizzamento all'origine. È necessario risolvere i problemi di prestazioni con l'ottimizzazione. Quando si ottimizzano le prestazioni del codice, consente di ottimizzare l'utilizzo delle risorse di sistema, migliorare il tempo di risposta, ridurre la latenza e migliorare l'esperienza utente.

Instrumentare il codice

La strumentazione del codice si riferisce alla pratica di aggiungere frammenti di codice o librerie al codice che raccolgono dati e monitorano le prestazioni del codice durante il runtime. La strumentazione del codice consente agli sviluppatori di raccogliere informazioni sulle metriche chiave, ad esempio il consumo di risorse (CPU, utilizzo della memoria) e il tempo di esecuzione. Instrumentando il codice, gli sviluppatori possono ottenere informazioni dettagliate sui percorsi ad accesso frequente del codice, identificare i colli di bottiglia delle prestazioni e ottimizzare il codice per migliorare l'efficienza delle prestazioni.

In un ambiente ideale, è consigliabile eseguire l'analisi del codice nelle prime fasi del ciclo di vita dello sviluppo software. Prima si rileva un problema di codice, più economico è risolverlo. Si vuole automatizzare la maggior parte di questa analisi del codice possibile. Usare strumenti di analisi del codice statici e dinamici per ridurre il lavoro manuale. Tenere tuttavia presente che questo test è ancora una simulazione della produzione. La produzione fornisce la comprensione più chiara dell'ottimizzazione del codice.

Compromesso: è probabile che gli strumenti di monitoraggio del codice aumentino i costi.

Identificare i percorsi ad accesso frequente

Instrumentando il codice, è possibile misurare l'utilizzo delle risorse per percorsi di codice diversi. Queste misurazioni consentono di identificare i percorsi ad accesso frequente. I percorsi ad accesso frequente hanno un effetto significativo sulle prestazioni e sull'utilizzo delle risorse. Sono sezioni critiche o eseguite di frequente di un programma che richiedono prestazioni elevate e bassa latenza. Per identificare i percorsi ad accesso frequente del codice, prendere in considerazione questi passaggi:

  • Analizzare i dati di runtime: raccogliere i dati di runtime e analizzarli per identificare le aree del codice che usano risorse significative, ad esempio le operazioni di CPU, memoria o I/O. Cercare modelli o sezioni di codice che vengono eseguiti frequentemente o che richiedono molto tempo per il completamento.

  • Misurare le prestazioni: usare strumenti di profilatura o framework di test delle prestazioni per misurare il tempo di esecuzione e il consumo di risorse di percorsi di codice diversi. Consente di identificare i colli di bottiglia e le aree per il miglioramento.

  • Prendere in considerazione la logica di business e l'effetto dell'utente: valutare l'importanza di percorsi di codice diversi in base alla pertinenza delle funzionalità dell'applicazione o alle operazioni aziendali critiche. Determinare quali percorsi di codice sono fondamentali per fornire valore agli utenti o soddisfare i requisiti di prestazioni.

Ottimizzare la logica del codice

L'ottimizzazione della logica del codice consiste nel perfezionare la struttura e la progettazione del codice per eseguire attività con meno risorse. La logica migliorata riduce le operazioni non necessarie. Crea un'esecuzione più veloce con un minor consumo di risorse. È consigliabile rimuovere tutte le operazioni non necessarie all'interno del percorso del codice che potrebbero influire sulle prestazioni. Assegnare priorità all'ottimizzazione dei percorsi ad accesso frequente per visualizzare i migliori miglioramenti in termini di efficienza delle prestazioni. Per ottimizzare la logica del codice, prendere in considerazione le strategie seguenti:

  • Rimuovere le chiamate di funzione non necessarie: esaminare il codice e identificare tutte le funzioni che non sono essenziali per la funzionalità desiderata e potrebbero influire negativamente sulle prestazioni. Ad esempio, se una chiamata di funzione esegue una convalida completata in precedenza nel codice, è possibile rimuovere la chiamata di funzione di convalida non necessaria.

  • Ridurre al minimo le operazioni di registrazione: la registrazione può essere utile per il debug e l'analisi, ma la registrazione eccessiva può influire sulle prestazioni. Valutare la necessità di ogni operazione di registrazione e rimuovere tutte le chiamate di registrazione non necessarie che non sono critiche per l'analisi delle prestazioni.

  • Ottimizzare cicli e condizionali: analizzare cicli e condizionali nel codice e identificare eventuali iterazioni o condizioni non necessarie che possono essere eliminate. Semplificare e ottimizzare queste strutture può migliorare le prestazioni del codice. Ridurre al minimo le chiamate di funzione all'interno dei cicli ed eliminare i calcoli ridondanti. Prendere in considerazione lo spostamento di calcoli all'esterno del ciclo o l'annullamento della registrazione del ciclo.

  • Ridurre l'elaborazione dei dati non necessaria: esaminare il codice per eventuali operazioni di elaborazione dati non necessarie, ad esempio calcoli ridondanti o trasformazioni. Eliminare queste operazioni non necessarie per migliorare l'efficienza del codice.

  • Ottimizzare le strutture dei dati. Per archiviare e recuperare in modo efficiente i dati, selezionare strutture di dati appropriate, ad esempio matrici, elenchi collegati, alberi e tabelle hash. Scegliere la struttura dei dati migliore per un problema specifico. Una struttura di dati appropriata migliora le prestazioni dell'applicazione.

  • Ridurre al minimo le richieste di rete: se il codice prevede l'esecuzione di richieste di rete, ridurre al minimo il numero di richieste e ottimizzare l'utilizzo. Richieste batch quando possibile ed evitare round trip non necessari per migliorare le prestazioni.

  • Ridurre al minimo le allocazioni: identificare le aree in cui si verifica un'allocazione eccessiva di memoria. Ottimizzare il codice riducendo le allocazioni non necessarie e riutilizzando le risorse esistenti quando possibile. Riducendo al minimo le allocazioni, è possibile migliorare l'efficienza della memoria e le prestazioni complessive. Usare le strategie appropriate di gestione della memoria e Garbage Collection per il linguaggio di programmazione.

  • Ridurre le dimensioni della struttura dei dati: valutare le dimensioni delle strutture di dati, ad esempio le classi, e identificare le aree in cui è possibile ridurre. Esaminare i requisiti dei dati ed eliminare eventuali campi o proprietà non necessari. Ottimizzare l'utilizzo della memoria selezionando in modo efficiente i tipi di dati appropriati e la compressione dei dati.

  • Usare SDK e librerie ottimizzati per le prestazioni. Usare SDK nativi o librerie ottimizzate per le prestazioni. Gli SDK nativi sono progettati per interagire con i servizi e le risorse in una piattaforma o all'interno di un framework. Ad esempio, gli SDK nativi del cloud funzionano meglio con i piani dati del servizio cloud che con l'accesso api personalizzato. Gli SDK sono eccellenti nella gestione delle richieste di rete e nell'ottimizzazione delle interazioni. Le librerie ottimizzate per le prestazioni, ad esempio Math.NET, contengono funzioni ottimizzate per le prestazioni. Quando si applicano le funzioni in modo appropriato, è possibile migliorare le prestazioni del carico di lavoro.

  • Implementazione trasversale: considerare gli effetti delle implementazioni trasversali, ad esempio il middleware o i controlli dei token, e valutare se influiscono negativamente sulle prestazioni.

Esaminare le raccomandazioni sulle prestazioni specifiche del linguaggio di programmazione in uso. Valutare il codice in base a queste raccomandazioni per identificare le aree per il miglioramento.

Compromessi:

  • L'ottimizzazione del codice e dei percorsi ad accesso frequente richiede competenze per gli sviluppatori per identificare l'inefficienze del codice è soggettiva e potrebbe essere un individuo altamente qualificato necessario per altre attività.
  • Gli SDK offrono praticità ed eliminano le complessità dell'interazione con le API. Tuttavia, gli SDK potrebbero limitare le opzioni di controllo e personalizzazione per il codice personalizzato.

Ottimizzare la gestione della memoria

L'ottimizzazione della gestione della memoria comporta la ridefinizione del modo in cui un carico di lavoro usa, alloca e rilascia risorse di memoria per migliorare l'efficienza. La gestione corretta della memoria migliora le prestazioni del codice perché riduce il sovraccarico delle operazioni di memoria. L'utilizzo efficiente della memoria riduce la latenza, impedisce rallentamenti o arresti anomali del sistema e ottimizza la velocità effettiva delle attività di calcolo. Prendere in considerazione le strategie seguenti per ottimizzare la gestione della memoria.

Problemi di memoria di debug. I dump di memoria sono snapshot di memoria dell'applicazione. Acquisiscono lo stato di memoria di un'applicazione in un momento specifico. I dump di memoria consentono l'analisi retrospettiva dei problemi correlati alla memoria. Selezionare il tipo appropriato di dump della memoria in base alla natura del problema che si sta tentando di diagnosticare e le risorse disponibili. È consigliabile usare dump in miniatura per il debug di routine e i dump completi per problemi complessi e critici. Questa strategia offre un equilibrio tra l'utilizzo delle risorse e le funzionalità di diagnostica. Molti servizi di hosting del codice supportano il debug della memoria. È consigliabile preferire i servizi che supportano l'analisi della memoria rispetto a quelli che non lo fanno. Ecco i passaggi di base per il debug dei problemi di memoria:

  1. Acquisire dump di memoria: iniziare configurando un meccanismo per acquisire i dump di memoria durante il runtime dell'applicazione. L'acquisizione può essere attivata manualmente, automaticamente o quando vengono soddisfatte condizioni specifiche (ad esempio un utilizzo eccessivo della memoria). Alcuni servizi cloud potrebbero già offrire questo processo.

  2. Analizzare i dump di memoria: dopo aver raccolto i dump della memoria, analizzarli. Numerosi strumenti consentono di controllare questi dump, ad esempio WinDbg per applicazioni Windows o GDB per sistemi basati su Unix.

  3. Identificare le perdite di memoria: concentrarsi sull'identificazione delle perdite di memoria durante l'analisi. Le perdite di memoria si verificano quando l'applicazione alloca memoria ma non riesce a rilasciarla quando la memoria non è più necessaria. Cercare oggetti o strutture di dati che rimangono in memoria anche quando devono essere deallocati.

  4. Correzione e test: durante l'identificazione del codice problematico, concentrarsi sulla risoluzione dei problemi di memoria. Le risoluzioni possono comportare il rilascio corretto della memoria, l'ottimizzazione delle strutture di dati o la rivalutazione delle procedure di gestione della memoria. Verificare che le soluzioni vengano sottoposte a test rigorosi per garantire la loro efficacia.

  5. Iterazione e monitoraggio: la gestione della memoria è un processo continuo. Monitorare regolarmente l'utilizzo della memoria dell'applicazione e renderlo persistente nella raccolta dei dump di memoria nell'ambiente di produzione. Rivedere regolarmente le fasi di analisi e ottimizzazione per assicurarsi che i problemi di memoria non vengano nuovamente visualizzati con le successive modifiche al codice.

Incorporando l'analisi del dump della memoria nel ciclo di vita dello sviluppo software, è possibile amplificare l'affidabilità e l'efficienza delle applicazioni. Consente di ridurre la probabilità di problemi correlati alla memoria nell'ambiente di produzione.

Ridurre le allocazioni di memoria. Ridurre al minimo le allocazioni di memoria per ridurre il footprint di memoria complessivo del codice. Il carico di lavoro può usare la memoria disponibile in modo efficiente. Per recuperare memoria inutilizzata, è meno necessario il Garbage Collector e riduce la frequenza e la durata dei cicli di Garbage Collection. Le allocazioni di memoria possono essere costose, soprattutto se vengono eseguite frequentemente. Ridurre al minimo le allocazioni di memoria, in modo che il codice possa essere eseguito in modo rapido ed efficiente.

Le cache archiviano i dati a cui si accede di frequente vicino al processore, migliorando così le prestazioni. Quando si riducono al minimo le allocazioni di memoria, è presente una contesa minore per lo spazio della cache, in modo da poter usare efficacemente la cache. Un numero elevato di allocazioni di memoria può ridurre le prestazioni dell'applicazione e generare errori. Altri modi per ridurre al minimo le allocazioni di memoria includono:

  • Variabili locali: usare variabili locali anziché variabili globali per ridurre al minimo il consumo di memoria.

  • Inizializzazione differita: implementare l'inizializzazione differita per rinviare la creazione di oggetti o risorse fino a quando non sono necessari.

  • Buffer: consente di gestire i buffer in modo efficace per evitare di allocare buffer di memoria di grandi dimensioni.

  • Pooling di oggetti: prendere in considerazione il pool di oggetti per riutilizzare oggetti di grandi dimensioni anziché allocarli e deallocarli.

Per altre informazioni, vedere Ridurre le allocazioni di memoria e L'heap di oggetti di grandi dimensioni nei sistemi Windows.

Usare la concorrenza e il parallelismo

L'uso della concorrenza e del parallelismo comporta l'esecuzione di più attività o processi contemporaneamente o in modo sovrapposto per usare in modo efficiente le risorse di calcolo. Queste tecniche aumentano la velocità effettiva complessiva e il numero di attività che un carico di lavoro può elaborare. Quando si eseguono attività simultaneamente o in parallelo, riduce il runtime dell'applicazione e riduce la latenza e aumenta i tempi di risposta. La concorrenza e il parallelismo consentono un utilizzo efficiente delle risorse di calcolo, ad esempio core CPU o sistemi distribuiti. La concorrenza e il parallelismo distribuiscono efficacemente il carico di lavoro tra le risorse di calcolo.

Usare il parallelismo. Il parallelismo è la capacità di un sistema di attivare simultaneamente più attività o processi su più risorse di calcolo. Il parallelismo divide un carico di lavoro in attività più piccole eseguite in parallelo. È possibile ottenere il parallelismo usando tecniche come il multiprocessore o il calcolo distribuito. Distribuire le attività tra processori multicore per ottimizzare la gestione del carico di lavoro. Ottimizzare il codice per sfruttare l'architettura della CPU, i modelli di threading e i processori multicore. Quando si esegue il codice in parallelo, le prestazioni migliorano perché il carico di lavoro viene distribuito tra più core.

Usare la concorrenza. La concorrenza è la capacità di un sistema di eseguire più attività o processi. La concorrenza consente a diverse parti di un programma di fare progressi in modo indipendente, migliorando così le prestazioni complessive. È possibile implementare la concorrenza usando tecniche come il multithreading, in cui più thread vengono eseguiti simultaneamente all'interno di un singolo processo. È anche possibile usare la programmazione asincrona, in cui le attività vengono attivate contemporaneamente.

  • Programmazione asincrona: la programmazione asincrona è un approccio per attivare le attività senza bloccare il thread principale. La programmazione asincrona consente a un programma di attivare attività durante l'attesa del completamento delle operazioni a esecuzione prolungata. Con la programmazione asincrona, il programma può avviare più attività e attendere che vengano completate in modo asincrono. Il programma non deve attendere il completamento di ogni attività prima di passare a quello successivo.

    Esistono molte tecniche e modelli di programmazione asincroni, a seconda del linguaggio di programmazione e della piattaforma. Un approccio comune consiste nell'usare parole chiave e costrutti asincroni, ad esempio async e await, in linguaggi come C#. Con queste parole chiave, è possibile definire metodi asincroni. Per il traffico HTTP, prendere in considerazione l'uso del modello di Request-Reply asincrono.

    Molti framework e librerie offrono il supporto predefinito per la programmazione asincrona. Ad esempio, nella piattaforma .NET è possibile implementare operazioni asincrone usando modelli come modello asincrono basato su attività e modello asincrono basato su eventi. L'implementazione specifica della programmazione asincrona varia a seconda del linguaggio di programmazione, della piattaforma e dei requisiti dell'applicazione.

  • Code: una coda è un buffer di archiviazione che si trova tra un componente richiedente (producer) e il componente di elaborazione (consumer) del carico di lavoro. Possono essere presenti più consumer per una singola coda. Man mano che le attività aumentano, è necessario ridimensionare i consumer per soddisfare la domanda. Il producer inserisce le attività in una coda. La coda archivia le attività fino a quando un consumer non ha capacità. Una coda è spesso il modo migliore per passare il lavoro a un servizio di elaborazione che presenta picchi di domanda. Per altre informazioni, vedere Modello di livellamento del carico basato sucoda e code di archiviazione e code del bus di servizio.

Utilizzare un pool di connessioni

Il pool di connessioni è la pratica di riutilizzare le connessioni alle banche dati stabilite anziché creare una nuova connessione per ogni richiesta. Può essere costoso stabilire una connessione a un database. È necessario creare una connessione di rete autenticata al server di database remoto. Le connessioni al database sono particolarmente costose per le applicazioni che spesso aprono nuove connessioni. Il pool di connessioni riutilizza le connessioni esistenti ed elimina la spesa per l'apertura di una nuova connessione per ogni richiesta. Il pool di connessioni riduce la latenza di connessione e abilita una velocità effettiva elevata del database (transazioni al secondo) nel server. È consigliabile scegliere una dimensione del pool in grado di gestire più connessioni rispetto a quelle attualmente disponibili. L'obiettivo è consentire al pool di connessioni di gestire rapidamente le nuove richieste in ingresso.

Informazioni sui limiti di pool di connessioni. Alcuni servizi limitano il numero di connessioni di rete. Quando si supera questo limite, le connessioni potrebbero rallentare o terminare. È possibile usare il pool di connessioni per stabilire un set fisso di connessioni al momento dell'avvio e quindi gestire tali connessioni. In molti casi, una dimensione predefinita del pool può essere costituita da solo alcune connessioni che eseguono rapidamente negli scenari di test di base. L'applicazione potrebbe esaurire le dimensioni predefinite del pool in base alla scala e creare un collo di bottiglia. È necessario stabilire una dimensione del pool che esegue il mapping al numero di transazioni simultanee supportate in ogni istanza dell'applicazione.

Testare il pool di connessioni. Ogni database e piattaforma applicazione presenta requisiti leggermente diversi per la configurazione e l'uso di un pool. Testare il pool di connessioni per assicurarsi che funzioni in modo efficiente nel carico.

Rischio: il pool di connessioni può creare frammentazione del pool e ridurre le prestazioni.

Ottimizzare i processi in background

Molte applicazioni richiedono attività in background eseguite indipendentemente dall'interfaccia utente. L'applicazione può avviare il processo e continuare a elaborare richieste interattive dagli utenti. Esempi di processi in background includono processi batch, attività a elevato utilizzo del processore e processi a esecuzione prolungata, ad esempio flussi di lavoro. Le attività in background non devono bloccare l'applicazione o causare incoerenze a causa di operazioni ritardate quando il sistema è in carico. Per migliorare le prestazioni, è possibile ridimensionare le istanze di calcolo che ospitano attività in background. Per altre informazioni, vedere Processi in backgrounde Considerazioni sulla scalabilità e sulle prestazioni.

Ottimizzare le prestazioni dell'infrastruttura

L'ottimizzazione delle prestazioni dell'infrastruttura significa migliorare e regolare gli elementi dell'infrastruttura per garantire un'operazione di picco e l'uso ottimale delle risorse per un carico di lavoro. Ottimizzando l'infrastruttura, è possibile ridurre al minimo i rifiuti, ridurre i ritardi e ottenere maggiori risultati con le risorse disponibili. Garantisce che i carichi di lavoro vengano eseguiti in modo affidabile e rapido, portando a migliorare le esperienze utente e i risparmi sui costi. Per ottimizzare le prestazioni dell'infrastruttura, prendere in considerazione le strategie seguenti:

Aggiungere limiti di utilizzo. È possibile implementare limiti di utilizzo per alcuni componenti del carico di lavoro. Ad esempio, per rimuovere pod instabili, è possibile definire limiti di CPU e memoria pod in servizio Azure Kubernetes (servizio Azure Kubernetes). Per ottimizzare le prestazioni, è possibile definire limiti di memoria nelle macchine virtuali Java.

Semplificare l'infrastruttura. Semplificare il carico di lavoro per ridurre il potenziale di interazione, dipendenza e problemi di compatibilità. Quando si semplifica il carico di lavoro, è possibile ottimizzare l'utilizzo delle risorse di memoria, potenza di elaborazione e archiviazione.

Ridurre il carico. Per ridurre il carico su un carico di lavoro, ridurre al minimo la domanda inserita in un'applicazione e abilitare le risorse per eseguire le attività primarie. Ad esempio, è pratica comune evitare di eseguire soluzioni di sicurezza all'interno del codice o su singole istanze di calcolo. I server Web devono invece servire richieste HTTP. I firewall delle applicazioni Web e le risorse del gateway possono gestire i controlli di sicurezza. Le strategie seguenti consentono di ridurre il carico sul carico di lavoro:

  • Coerenza finale: adottare un modello di coerenza finale per migliorare le prestazioni consentendo ai dati di essere leggermente datati. La coerenza finale riduce la domanda immediata sui cicli della CPU e la larghezza di banda di rete per gli aggiornamenti costanti dei dati.

  • Delegare le attività del server ai client o agli intermediari, ad esempio indici di ricerca e cache. Delegare attività come l'ordinamento dei dati, il filtro dei dati o le visualizzazioni di rendering. Quando si scaricano queste attività, si riduce il carico di lavoro nei server e si migliorano le prestazioni.

Ottimizzare la rete. Per ottimizzare una rete del carico di lavoro per le prestazioni, configurare e ottimizzare l'infrastruttura di rete. Assicurarsi che il carico di lavoro possa funzionare al massimo livello di efficienza.

  • Protocolli di rete: eseguire l'aggiornamento ai protocolli moderni, ad esempio HTTP/2, che consentono l'invio di più richieste tramite una singola connessione. I protocolli moderni riducono il sovraccarico della creazione di nuove connessioni.

    Compromesso: i protocolli moderni potrebbero escludere i client meno recenti.

  • Chattiness di rete: richieste di rete batch insieme per ridurre il numero di richieste. Anziché effettuare più richieste di piccole dimensioni, combinarle in richieste più grandi per ridurre il sovraccarico di rete.

  • Query di database: assicurarsi che le query del database recuperano solo le informazioni necessarie. Evitare di recuperare grandi quantità di dati non necessari, che possono causare un aumento del traffico di rete e prestazioni lente.

  • Dati statici: usare una rete per la distribuzione di contenuti per memorizzare nella cache contenuti statici a cui si accede di frequente che si avvicinano agli utenti. Quando si memorizzano nella cache i dati, non è necessario viaggiare su distanze lunghe. La memorizzazione nella cache migliora i tempi di risposta e riduce il traffico di rete.

  • Raccolta log: raccogliere e conservare solo i dati di log necessari per supportare i requisiti. Configurare le regole di raccolta dati e implementare considerazioni di progettazione per ottimizzare i costi di Log Analytics.

  • Compressione dei dati: comprimere e raggruppare i dati http e i dati dei file per consentire la trasmissione rapida tra client e server. La compressione riduce i dati restituiti da una pagina o da un'API e restituisce all'app browser o client. La compressione ottimizza il traffico di rete, che può accelerare la comunicazione dell'applicazione.

    Compromesso: la compressione aggiunge l'elaborazione lato server e lato client. L'applicazione deve comprimere, inviare e decomprimere i dati. La comunicazione multicast o la comunicazione a più destinatari può creare un sovraccarico di decompressione. È necessario testare e misurare le variazioni delle prestazioni prima e dopo l'implementazione della compressione dei dati per determinare se è una soluzione ottimale per il carico di lavoro. Per altre informazioni, vedere Compressione delle risposte in ASP.NET Core.

Facilitazione di Azure

Codice di strumentazione: Monitoraggio di Azure Application Insights supporta la strumentazione automatica (autoinstrumentazione) e la strumentazione manuale del codice dell'applicazione. La struttura automatica abilita la raccolta di dati di telemetria senza toccare il codice dell'applicazione. La strumentazione manuale richiede modifiche al codice per implementare l'API Application Insights o OpenTelemetry. È possibile usare Application Insights Profiler per ottimizzare i percorsi ad accesso frequente.

Ottimizzazione della logica del codice: Azure offre SDK e librerie per diversi linguaggi di programmazione per interagire con i servizi di Azure. Usare GLI SDK per semplificare le interazioni tra applicazioni e risorse di Azure. Gli SDK offrono un'interazione ottimale con i servizi di Azure, che riducono la latenza e migliorano l'efficienza.

Ottimizzazione della gestione della memoria: usare la funzionalità di rilevamento intelligente di Application Insights per analizzare l'utilizzo della memoria e aiutare a identificare e risolvere le perdite di memoria.

Servizio app di Azure dispone di una funzionalità di analisi e raccolta di dump di memoria e profiler. La funzionalità di servizio app autohealing può accettare automaticamente dump di memoria e tracce di profilo di app .NET e Java.

Uso della concorrenza e del parallelismo: diversi servizi di Azure offrono supporto univoco per la concorrenza, ad esempio Azure Cosmos DB, Funzioni di Azure e archiviazione BLOB. Per parallelismo, il servizio Azure Kubernetes supporta la distribuzione di applicazioni in contenitori, che migliorano l'elaborazione parallela.

Azure Batch è un servizio di pianificazione dei processi basato sul cloud che è possibile usare per abilitare il calcolo parallelo e ad alte prestazioni senza la necessità di configurare l'infrastruttura. Per altre informazioni, vedere Processi in background.

Ottimizzazione delle prestazioni dell'infrastruttura: implementare modelli di Resource Manager di Azure per definire e distribuire l'infrastruttura usando il codice. Usare questi modelli per implementare distribuzioni di risorse efficienti, ripetibili e coerenti. Criteri di Azure offre funzionalità di governance per garantire che le distribuzioni delle risorse siano conformi alle procedure consigliate e agli standard dell'organizzazione.

Per la programmazione asincrona, usare servizi di accodamento scalabili, ad esempio Archiviazione code di Azure e bus di servizio di Azure, per facilitare la programmazione asincrona. È possibile accodarle e elaborarle in modo indipendente. Per supportare le operazioni asincrone, Azure Marketplace offre code e strumenti di terze parti che è possibile integrare con i servizi di Azure.

Elenco di controllo dell'efficienza delle prestazioni

Fare riferimento al set completo di raccomandazioni.