Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questa raccomandazione della checklist sull'efficienza delle prestazioni del Framework Azure Well-Architected si applica a:
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 usa eccessivamente codice e infrastruttura, viene creato 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 | Definition |
---|---|
Concurrency | 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. |
Mucchio | 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. |
Parallelism | Quando vengono eseguite più attività o processi contemporaneamente. |
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 principali 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 procedura di aggiunta di 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 all'inizio del ciclo di vita dello sviluppo software. In precedenza si rileva un problema di codice, più economico è risolverlo. Si vuole automatizzare la maggior parte possibile di questa analisi del codice. 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. L'ambiente di 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, seguire questa procedura:
Analizzare i dati di runtime: raccogliere i dati di runtime e analizzarli per identificare le aree del codice che utilizzano risorse significative, ad esempio le operazioni di CPU, memoria o I/O. Cercare modelli o sezioni di codice che vengono eseguiti di frequente 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 colli di bottiglia e aree per migliorare.
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 offrire 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 consumo minore di risorse. È consigliabile rimuovere tutte le operazioni non necessarie all'interno del percorso del codice che potrebbero influire sulle prestazioni. Classificare in ordine di priorità l'ottimizzazione dei percorsi ad accesso frequente per visualizzare i migliori miglioramenti dell'efficienza delle prestazioni. Per ottimizzare la logica del codice, considerare le strategie seguenti:
Rimuovere le chiamate di funzione non necessarie: esaminare il codice e identificare 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 di cicli ed eliminare i calcoli ridondanti. Prendere in considerazione lo spostamento dei 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 i dati in modo efficiente, 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 adatta 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 i tipi di dati appropriati e inserendo i dati in modo efficiente.
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 eccelleno 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 a taglio incrociato: considerare gli effetti delle implementazioni di taglio incrociato, 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 con cui si sta lavorando. 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 una persona altamente qualificata necessaria 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 l'affinamento 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.
Eseguire il debug dei problemi di memoria. I dump di memoria sono snapshot della memoria dell'applicazione. Acquisiscono lo stato di memoria di un'applicazione in un momento specifico. I dump della 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 alle 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 di 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:
Acquisire i dump della memoria: iniziare configurando un meccanismo per acquisire i dump della memoria durante il runtime dell'applicazione. L'acquisizione può essere attivata manualmente, automaticamente o quando vengono soddisfatte condizioni specifiche (ad esempio un consumo eccessivo di memoria). Alcuni servizi cloud potrebbero già offrire questo processo.
Analizzare i dump della 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.
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.
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.
Iterazione e monitoraggio: la gestione della memoria è un processo continuo. Monitorare regolarmente l'utilizzo della memoria dell'applicazione e rendere persistente la 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 complessivo della memoria del codice. Il carico di lavoro può usare in modo efficiente la memoria disponibile. 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, lo spazio della cache è minore, quindi è possibile usare efficacemente la cache. Un numero elevato di allocazioni di memoria può compromettere 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 in modo efficace i buffer per evitare di allocare buffer di memoria di grandi dimensioni.
Pool 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 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 simultanea di più attività o processi o in modo sovrapposto per un uso efficiente delle 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 parti diverse di un programma di eseguire 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 simultaneamente.
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 le 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
eawait
, in linguaggi come C#. Con queste parole chiave, è possibile definire metodi asincroni. Per il traffico HTTP, è consigliabile usare il modello asincrono Request-Reply.Molti framework e librerie offrono il supporto predefinito per la programmazione asincrona. Ad esempio, nella piattaforma .NET è possibile implementare operazioni asincrone usando modelli come Task-Based modello asincrono e Event-Based modello asincrono. 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 sperimenta picchi di domanda. Per altre informazioni, vedereQueue-Based modello di livellamento del carico e code di archiviazione e code del bus di servizio.
Usare il pool di connessioni
Il pool di connessioni è la procedura per riutilizzare le connessioni di database 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 di 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 è quello di gestire rapidamente le nuove richieste in ingresso nel pool di connessioni.
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, le dimensioni predefinite del pool possono essere costituite da poche connessioni che eseguono rapidamente in scenari di test di base. L'applicazione potrebbe esaurire le dimensioni predefinite del pool in scala e creare un collo di bottiglia. È necessario stabilire una dimensione del pool mappata al numero di transazioni simultanee supportate in ogni istanza dell'applicazione.
Testare il pool di connessioni. Ogni database e piattaforma dell'applicazione ha 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 che vengono 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 di 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 un'operazione ritardata quando il sistema è in carico. Per migliorare le prestazioni, è possibile ridimensionare le istanze di calcolo che ospitano attività in background. Per altre informazioni, vedere Considerazioni sui processi in background e sul ridimensionamento 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 gli sprechi, ridurre i ritardi e ottenere maggiori risultati con le risorse disponibili. Garantisce che i carichi di lavoro vengano eseguiti in modo affidabile e rapido, con conseguente miglioramento delle esperienze utente e dei risparmi sui costi. Per ottimizzare le prestazioni dell'infrastruttura, considerare 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 dei pod nel 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, si ottimizza l'utilizzo delle risorse della memoria, della potenza di elaborazione e dell'archiviazione.
Ridurre il carico. Per ridurre il carico su un carico di lavoro, ridurre al minimo la domanda inserita in un'applicazione e consentire alle risorse di eseguire le attività principali. Ad esempio, è prassi comune evitare di eseguire soluzioni di sicurezza all'interno del codice o in singole istanze di calcolo. I server Web devono invece soddisfare le richieste HTTP. I web application firewall 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 di datare leggermente i dati. La coerenza finale riduce la domanda immediata sui cicli della CPU e sulla 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 esegue l'offload di 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 operare al massimo livello di efficienza.
Protocolli di rete: eseguire l'aggiornamento a protocolli moderni come HTTP/2, che consentono l'invio di più richieste tramite una singola connessione. I protocolli moderni riducono il sovraccarico di stabilire 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 recuperino solo le informazioni necessarie. Evitare di recuperare grandi quantità di dati non necessari, con conseguente aumento del traffico di rete e rallentamento delle prestazioni.
Dati statici: usare una rete per la distribuzione di contenuti per memorizzare nella cache contenuti statici a cui si accede di frequente vicino agli utenti. Quando si memorizzano nella cache i dati, non è necessario spostarsi su lunghe distanze. 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 aggregare i dati di file e contenuto HTTP per consentire una trasmissione rapida tra client e server. La compressione riduce i dati restituiti da una pagina o un'API e li restituisce al browser o all'app client. La compressione ottimizza il traffico di rete, che può accelerare la comunicazione delle applicazioni.
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 con 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 si tratta di una soluzione ottimale per il carico di lavoro. Per altre informazioni, vedere Compressione della risposta in ASP.NET Core.
Facilitazione di Azure
Strumentazione del codice: Application Insights di Monitoraggio di Azure supporta la strumentazione automatica (strumentazione automatica) e la strumentazione manuale del codice dell'applicazione. La strumentazione automatica abilita la raccolta di dati di telemetria senza toccare il codice dell'applicazione. La strumentazione manuale richiede modifiche al codice per implementare Application Insights o l'API 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 le applicazioni e le risorse di Azure. Gli SDK offrono un'interazione ottimale con i servizi di Azure, riducendo la latenza e migliorando l'efficienza.
Ottimizzazione della gestione della memoria: usare la funzionalità di rilevamento intelligente di Application Insights per analizzare il consumo di memoria e aiutare a identificare e risolvere le perdite di memoria.
Il servizio app di Azure dispone di una funzionalità di analisi e raccolta di dump della memoria e del profiler. La funzionalità di ridimensionamento automatico del servizio app può eseguire automaticamente dump della memoria e profilare tracce di app .NET e Java.
Uso della concorrenza e del parallelismo: diversi servizi di Azure offrono un supporto univoco per la concorrenza, ad esempio Azure Cosmos DB, Funzioni di Azure e Archiviazione BLOB. Per il parallelismo, il servizio Azure Kubernetes supporta la distribuzione di applicazioni in contenitori, migliorando 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 Azure Resource Manager 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 rispettino le procedure consigliate e gli 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 accodamento delle attività ed 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.
Collegamenti correlati
- AKS
- Funzionalità di rilevamento intelligente di Application Insights
- Modello di Request-Reply asincrono
- Evitare allocazioni di memoria
- Azure Batch
- Criteri di Azure
- Modelli di Gestione risorse di Azure
- Azure SDK
- Processi in background
- Considerazioni sulla scalabilità e sulle prestazioni dei processi in background
- Comprimere i dati dei file
- Comprimere il contenuto HTTP
- Definire i limiti di CPU e memoria dei pod
- Event-Based modello asincrono
- Macchine virtuali Java
- Heap oggetti di grandi dimensioni
- Frammentazione del pool
- Queue-Based modello di livellamento del carico
- Compressione della risposta in ASP.NET Core
- Code di archiviazione e code del bus di servizio
- Task-Based modello asincrono
Elenco di controllo per l'efficienza delle prestazioni
Fare riferimento al set completo di raccomandazioni.