Efficienza prestazionale
Si supponga che sia stata pubblicata una notizia sull'annuncio di un prodotto della propria organizzazione. La pubblicità aggiuntiva generata dalla pubblicazione della notizia determina un elevato afflusso di traffico verso il proprio sito Web. Il sito Web può gestire questo aumento del traffico? Il sito può assorbire il carico aggiuntivo senza diventare lento o smettere di rispondere?
In questa unità vengono esaminati alcuni dei principi di base per garantire prestazioni ottimali delle applicazioni. In particolare, i concetti di scalabilità e ottimizzazione alla base del principio fondamentale dell'efficienza delle prestazioni.
Che cos'è l'efficienza delle prestazioni?
Per efficienza delle prestazioni si intende la capacità di adattare le risorse disponibili di un'applicazione in base alle richieste ricevute. L'efficienza delle prestazioni include il ridimensionamento delle risorse, l'identificazione e l'ottimizzazione di potenziali colli di bottiglia e l'ottimizzazione del codice dell'applicazione per le prestazioni massime.
Di seguito vengono illustrati alcuni modelli e procedure che consentono di migliorare la scalabilità e le prestazioni dell'applicazione.
Scalabilità verticale e orizzontale
Le risorse di calcolo possono essere ridimensionate, o scalate, in due direzioni:
La scalabilità verticale consiste nell'aggiunta di altre risorse a una singola istanza. È sinonimo di ridimensionamento verticale.
La scalabilità orizzontale consiste nell'aggiunta di più istanze. È sinonimo di ridimensionamento orizzontale.
La scalabilità verticale riguarda l'aggiunta di più risorse, ad esempio CPU o memoria, a una singola istanza. Questa istanza può essere una macchina virtuale o un servizio PaaS.
L'aggiunta di ulteriore capacità all'istanza aumenta le risorse disponibili per l'applicazione, ma non senza un limite. La capacità delle macchine virtuali è limitata a quella dell'host in cui vengono eseguite e gli host stessi hanno limitazioni fisiche. Quando si applica la scalabilità verticale per un'istanza, è possibile incorrere in questi limiti. Tali limiti impediscono di aggiungere risorse oltre a una certa quantità in un'istanza.
La scalabilità orizzontale riguarda l'aggiunta di più istanze a un servizio. Può trattarsi di macchine virtuali o servizi PaaS. Invece di aggiungere capacità rendendo una singola istanza più potente, si aggiunge capacità aumentando il numero totale di istanze.
Il vantaggio della scalabilità orizzontale è che può essere applicata all'infinito se si hanno più computer da aggiungere all'architettura. La scalabilità orizzontale richiede un qualche tipo di distribuzione del carico. Ad esempio, un servizio di bilanciamento del carico che distribuisce le richieste tra i server disponibili oppure un meccanismo di individuazione dei servizi che identifica i server attivi a cui inviare le richieste.
In entrambi i tipi di scalabilità, le risorse possono essere ridotte, con conseguente ottimizzazione dei costi nell'immagine.
La scalabilità automatica è il processo di allocazione dinamica delle risorse in base ai requisiti di corrispondenza delle prestazioni. Man mano che aumenta il volume di lavoro, un'applicazione può richiedere più risorse per mantenere i livelli di prestazioni desiderati e soddisfare i contratti di servizio. Quando la richiesta diminuisce e le risorse aggiuntive non sono più necessarie, è possibile deallocarle per ridurre al minimo i costi.
La scalabilità automatica sfrutta la flessibilità degli ambienti ospitati nel cloud, semplificando nel contempo la gestione. Riduce la necessità che un operatore monitori continuamente le prestazioni di un sistema e prenda decisioni sull'aggiunta o la rimozione di risorse.
Ottimizzare le prestazioni di rete
Quando si ottimizzano le prestazioni, si esaminano le prestazioni di rete e di archiviazione per assicurarsi che i rispettivi livelli rientrino nei limiti accettabili. Questi livelli di prestazioni possono influire sul tempo di risposta dell'applicazione. La scelta delle tecnologie di rete e di archiviazione più appropriate per l'architettura contribuisce a garantire la migliore esperienza possibile per gli utenti.
L'aggiunta di un livello di messaggistica tra i servizi può avere un impatto positivo sulle prestazioni e sulla scalabilità. Un livello di messaggistica crea un buffer per garantire che il flusso delle richieste possa continuare senza errori anche se l'applicazione ricevente non è in grado di gestirle immediatamente. L'applicazione gestisce quindi le richieste rispondendo nell'ordine in cui sono state ricevute.
Ottimizzare le prestazioni di archiviazione
In molte soluzioni su larga scala i dati vengono suddivisi in partizioni separate in modo che sia possibile gestire i dati e accedervi separatamente. La strategia di partizionamento deve essere scelta attentamente per ottimizzare le prestazioni riducendo al minimo gli effetti negativi. Il partizionamento può aiutare a migliorare la scalabilità, ridurre i conflitti e ottimizzare le prestazioni.
L'uso della memorizzazione nella cache nell'architettura può contribuire a migliorare le prestazioni. La memorizzazione nella cache è un meccanismo tramite il quale i dati o gli asset (pagine Web, immagini) usati di frequente vengono archiviati per poter essere recuperati più rapidamente. È possibile usare la memorizzazione nella cache a diversi livelli dell'applicazione. È possibile usarla tra i server applicazioni e un database, per ridurre i tempi di recupero dati,
È anche possibile usare la memorizzazione nella cache tra gli utenti e i server Web, posizionando il contenuto statico più vicino agli utenti. Questo tipo di memorizzazione nella cache riduce il tempo necessario per restituire le pagine Web agli utenti. Ha anche l'effetto secondario di eseguire l'offload delle richieste dal database o dai server Web, aumentando le prestazioni per altre richieste.
Identificare i colli di bottiglia relativi alle prestazioni nell'applicazione
Le applicazioni e i servizi distribuiti in esecuzione nel cloud sono componenti software complessi che comprendono molte parti mobili. In un ambiente di produzione è importante poter monitorare il modo in cui gli utenti utilizzano il sistema. È anche importante tracciare l'utilizzo delle risorse e, in generale, monitorare l'integrità e le prestazioni del sistema. Queste informazioni possono essere usate come strumento diagnostico per rilevare e correggere i problemi. Consentono inoltre di individuare potenziali problemi e impedire che si verifichino.
Per ottimizzare le prestazioni è importante anche conoscere le prestazioni delle applicazioni stesse. Errori, codice con prestazioni insufficienti e colli di bottiglia in sistemi dipendenti possono essere individuati con uno strumento di gestione delle prestazioni delle applicazioni. Spesso questi problemi possono essere nascosti o non immediatamente visibili ad utenti finali, sviluppatori e amministratori, ma possono incidere negativamente sulle prestazioni complessive dell'applicazione.
Esaminare tutti i livelli dell'applicazione per identificare e risolvere gli eventuali colli di bottiglia delle prestazioni. Questi colli di bottiglia possono essere dovuti a una gestione della memoria non ottimale o anche al processo di aggiunta di indici nel database. Può trattarsi di un processo iterativo, in quanto individuando un collo di bottiglia se ne può scoprire un altro di cui non si era a conoscenza.
Con un approccio completo al monitoraggio delle prestazioni, è possibile determinare i tipi di modelli e le procedure utili per l'architettura.