lunedì 2 marzo 2015

Storie di trincee: Dimensionamento e avarizia con i siti web Azure

Quanta capacità avrete bisogno per la vostra applicazione?

Oppure, ha chiesto un altro modo se indossare il cappello vendor, quanti soldi ya got?

Siamo generalmente schifoso a valutare i requisiti di capacità delle infrastrutture e anche quando è preso un approccio più scientifico (e non è frequente), siamo ancora schifoso a valutare il comportamento degli utenti in situazioni del mondo reale e l'impatto che avrà sulle prestazioni del sistema.

Ora, mettere la situazione in un ambiente cloud e ha il potenziale per andare un paio di modi. Uno è che avete sottovalutato e per gentile concessione del glorioso capacità di aumentare risorse molto rapidamente, la bolletta impazzisce. Un altro è che hai sopravvalutato e si finisce per pagare per le risorse che davvero non servono. Recentemente ho passato attraverso le sfide di scala sia con il sito web e il database SQL Azure su sono stato pwned? (HIBP). Per me, non è mai di avere accesso a sufficienti scala (che è più o meno limitata dal vostro portafoglio), piuttosto si tratta di cercare di entrambi mantenere il costo basso e la perf e francamente, non voglio davvero scendere a compromessi su entrambi! Ecco quello che ho fatto con il sito e scriverò di più database un'altra volta.

Il sito web
Sono stato in esecuzione su una singola piccola istanza di un sito web Azure fin dal primo giorno. 95% del tempo, va bene e l'altro 5% del tempo o scale automaticamente o ... pause. Mi spiego:

Recentemente ho scritto su Capire sito Azure auto-scala magia e ho mostrato come stavo sostenendo circa 4k richieste al minuto, mentre qualcuno martellava l'API:

Le richieste al minuto picco di oltre 5k

Questo è stato, con due istanze piccolo server web:

Chart utilizzo della CPU

Ho provato scala fuori per tre piccole istanze e ... la velocità effettiva bloccato a 4k per min. Ok, quindi il consumatore del servizio è maxing la loro capacità di trasmettere ed elaborare le richieste, giusto? Voglio dire aumentando la capacità da parte mia non migliorerà le cose, quindi deve essere colpa loro. Pensiero Sound, o almeno così pensavo ...

Per un capriccio, ho scalato fino a una dimensione di server media e quindi in modo che non ci solo uno di loro e non due ero. Questo è esattamente lo stesso costo - due Smalls equivalgono a un medio - e in test di carico prima (si sa, il genere in cui tutte le condizioni sono semplicemente perfetto ...) questa comportato esattamente la stessa velocità. Ma questa volta, è raddoppiato - sono andato a 8K richieste al minuto. Il tempo di elaborazione per ogni operazione anche andato fino in fondo da circa 60ms a circa 30ms. Chiaramente, questo è stato un miglioramento significativo. Anche chiaro era che ottenere destra scala era difficile:


Allora, perché è questo? Rob Moore ha fatto un buon punto che la piccola istanza è solo 1 core e che la raccolta .NET garbage piace avere una seconda (o più), ma su questa base, se il collo di bottiglia è una singola macchina poi due macchine deve raddoppiare la velocità (anche se potrebbe spiegare i 60ms a 30ms drop). Qualcun altro ha suggerito che era legato a obiettivi di performance del piccolo esempio macchina, ma ancora una volta, non c'è niente da suggerire che due piccole istanze non possono raddoppiare la velocità di uno, che è il punto di scalare fuori! Ma a prescindere dal flusso totale, la premessa che una macchina di medie dimensioni in grado di elaborare ogni richiesta significativamente più veloce di una piccola macchina rimane e che 60ms fino a 30ms è certamente un guadagno molto positivo.

Ma ecco ciò che veramente mi ha fatto in termini di perf: la mia soluzione è attualmente questi in esso:

Tre WebJobs nella soluzione di Visual Studio

Ecco tre WebJobs separati che vengono eseguiti come processi in background. Su ogni rilascio, devono essere compilati e distribuiti , nonché il sito schierato - allora tutti hanno bisogno di essere licenziato troppo. Schiero da GitHub sul check-in modo Kudu entra in gioco, che gestisce anche sulla stessa macchina. La linea di fondo è che quando voglio schierare, mentre io sto usando un piccolo esempio, questo accade:

Web operazione volta a chiodare 2,500ms su deploy

Whoa! Ciò significa che la mia Apdex soffre e ricordate, questo è ciò che è stato osservato nel browser:

Immersione Apdex in rosso su deploy

La velocità va anche a zip per un po ':

Throughput andare a zero su deploy

E la CPU, beh, alcuni dati è stato perso del tutto, ma chiaramente sta avvicinando l'utilizzo del 40%:

Utilizzo della CPU i dati mancanti e quasi il 40%

Questo è un periodo di carico leggero troppo (solo circa una richiesta di secondo), quindi immaginate cosa che fa una volta i pali di carico su. Perdo il traffico. Potrei cambiare il mio flusso di lavoro per la distribuzione solo per l'ambiente di gestione temporanea e quindi utilizzare gli slot di distribuzione in scena per passare il traffico (e lo faccio che a volte), ma mi piace di mantenere l'applicazione in un perpetuo stato di implementazione pronto e spingere un sacco di cambiamenti frequentemente. Utilizzando Kudu in questo modo e con il numero di progetti e aumentare la base di codice sempre più grande, ero causando un'interruzione.

Ora proviamo che ancora una volta con una media istanza di un sito web:

Medio esempio sito chiodare tempo transazione 1,000ms

Quel 2,5 secondi picco è ora 1 secondo. Sei ancora intenzione di ottenere un picco sulla distribuzione, ma chiaramente è neanche lontanamente così significativo.

Il Apdex rimane molto più felice troppo - ho brevemente immerso in "tollerare" (giallo) e non "frustrante" (rosso):

Apdex andare giallo, ma non rosso

E la velocità non azzera out, infatti non perde un colpo:

Throughput rimanendo a circa 50 richieste al secondo

E l'utilizzo della CPU rimane così in basso:

immagine

Questi risultati sono tutti chiaramente solo da una prova di campione, ma quello che posso dire con forza è che di volta in volta, mi piacerebbe vedere latenza elevata sui tempi di risposta, le connessioni caduto e anche un'interruzione totale - a volte per più di un minuto - quando si distribuisce su un piccolo esempio. Non ho mai visto la perdita di un servizio o di qualcosa di più di una leggera e momentanea degrado del servizio su un'istanza di media. Non una sola volta.

Vorrei aggiungere qualcosa penetranti per gli altri interessati a perfezionare la loro scala:

Non trattare i server come animali domestici, li trattano come bestie
Questo è per gentile concessione di Richard Campbell RunAs Radio e quello che sta dicendo è che a volte potrebbe essere necessario battere solo una tantum per il miglioramento della ascoltato. Potete farlo con Azure - flick un server con un altro e vedere come va. Non ottenere un allegato ad esso come se fosse un cane, si tratta di un servizio disponibile lì per servire voi e quando si avvia la visualizzazione come una risorsa altamente transitorio, si può fare un sacco di roba impressionante, come capire qual è la migliore scala per voi sulla base di prove ed errori.

Per me, è stato il gesso e il formaggio e il percorso in avanti è stato chiaro - ho dovuto andare da piccole a medie:

Piccolo esempio è 74,40 $ / m, medio è 148,80 dollari

Sì, è un extra di $ 74,40 al mese - letteralmente doppia - ma non è un pò e ci sono altri aspetti positivi finanziari troppo. In primo luogo, l'elaborazione di tali richieste al doppio della velocità (che è mai sarà una costante, ma è ragionevole prevedere per lavorare con base all'esperienza) ha enormi pregi per i consumatori al volume di traffico. In questo caso particolare, il consumatore stava controllando circa 10 milioni di identità (qualcosa scriverò su un altro tempo) e l'istanza medio riduce la durata di che, molte, molte ore.

L'istanza di media significa anche meno notifiche vanno a me quando rampe di carico CPU fino come lo fa a metà della velocità per gli stessi volumi di traffico. Francamente, la pace e la tranquillità è abbastanza prezioso! Ma significa anche che le scale più tardi - mi sia permanentemente in esecuzione un'istanza di media, ma ci sono un sacco di momenti in cui stavo correndo due Smalls e pagando lo stesso importo così quei periodi si annullano a vicenda.

Ma di gran lunga il più grande guadagno è che questo significa che posso lavorare in modo più attrito. Non ho per incidere intorno ai modi che rilasciare il software e non c'è bisogno di spendere tempo a cercare di mantenere le cose stabili durante il processo. Spingo di GitHub, magia accade, quindi il sito di produzione è in funzione la nuova versione e tutti sono felici. Che vale la pena di un paio di dollari al giorno!

Nessun commento:

Posta un commento