Come si eseguono i test di carico e la pianificazione della capacità per i siti Web?


113

Questa è una domanda canonica sulla pianificazione della capacità per i siti Web.

Relazionato:

Quali sono alcuni strumenti e metodi consigliati per la pianificazione della capacità di siti Web e applicazioni Web?

Non esitate a descrivere diversi strumenti e tecniche per diversi server Web, framework, ecc., Nonché le migliori pratiche che si applicano ai server Web in generale.

Risposte:


127

La risposta breve è: nessuno può rispondere a questa domanda tranne te.

La lunga risposta è che il benchmarking del carico di lavoro specifico è qualcosa che devi intraprendere, perché è un po 'come chiedere "Quanto è lungo un pezzo di stringa?".

Un semplice sito Web statico di una pagina potrebbe essere ospitato su un Pentium Pro 150 e pubblicare ogni giorno migliaia di impressioni.

L'approccio di base che devi seguire per rispondere a questa domanda è provarlo e vedere cosa succede. Ci sono molti strumenti che puoi usare per mettere artificialmente il tuo sistema sotto pressione per vedere dove si piega.

Una breve panoramica di ciò è:

  • Metti il ​​tuo scenario al suo posto
  • Aggiungi monitoraggio
  • Aggiungi traffico
  • Valuta i risultati
  • Correggere in base ai risultati
  • Risciacquare, ripetere fino a quando non sarà abbastanza felice

Metti il ​​tuo scenario al suo posto

Fondamentalmente, al fine di testare un certo carico, è necessario qualcosa su cui testare. Configurare un ambiente per testare. Se possibile, dovrebbe essere un'ipotesi abbastanza ravvicinata dell'hardware di produzione, altrimenti rimarrai estrapolato dai tuoi dati.

Configura server, account, siti Web, larghezza di banda, ecc. Anche se lo fai su VM, va bene solo se sei pronto a ridimensionare i risultati.

Quindi, installerò una macchina virtuale di media potenza (due core, 512 MB di RAM, 4 GB di HDD) e installerò il mio bilanciamento del carico preferito, haproxyall'interno di Red Hat Linux sulla VM.

Avrò anche due server Web dietro il bilanciamento del carico che userò per eseguire lo stress test del bilanciamento del carico. Questi due server Web sono impostati in modo identico ai miei sistemi live.

Aggiungi monitoraggio

Avrai bisogno di alcune metriche da monitorare, quindi misurerò quante richieste arrivano ai miei server Web e quante richieste riesco a comprimere al secondo prima che gli utenti inizino a ottenere un tempo di risposta di oltre due secondi.

Monitorerò anche l'utilizzo della RAM, della CPU e del disco sull'istanza haproxyper assicurarmi che il bilanciamento del carico sia in grado di gestire le connessioni.

Come farlo dipende molto dalle tue piattaforme ed è al di fuori dell'ambito di questa risposta. Potrebbe essere necessario rivedere i file di registro del server Web, avviare i contatori delle prestazioni o fare affidamento sulla capacità di reporting del proprio strumento di stress test.

Alcune cose che vuoi sempre monitorare:

  • uso della CPU
  • Utilizzo della RAM
  • Uso del disco
  • Latenza del disco
  • Utilizzo della rete

Puoi anche scegliere di guardare deadlock SQL, tempi di ricerca, ecc a seconda di ciò che stai testando.

Aggiungi traffico

Qui è dove le cose si divertono. Ora devi simulare un carico di prova. Ci sono molti strumenti che possono farlo, con opzioni configurabili:

Scegli un numero, qualsiasi numero. Supponiamo che vedrai come il sistema risponde con 10.000 hit al minuto. Non importa quale numero scegli perché ripeterai questo passaggio molte volte, regolando quel numero su o giù per vedere come risponde il sistema.

Idealmente, è necessario distribuire queste 10.000 richieste su più client / nodi di test del carico in modo che un singolo client non diventi un collo di bottiglia delle richieste. Ad esempio, il test remoto di JMeter fornisce un'interfaccia centrale da cui avviare diversi client da una macchina Jmeter di controllo.

Premi il pulsante magico Vai e guarda i tuoi server web sciogliersi e schiantarsi.

Valuta i risultati

Quindi, ora devi tornare alle tue metriche raccolte nel passaggio 2. Vedi che con 10.000 connessioni simultanee, la tua haproxyscatola sta a malapena sudando, ma il tempo di risposta con due server Web è un tocco di oltre cinque secondi. Non è bello - ricorda, il tuo tempo di risposta punta a due secondi. Quindi, dobbiamo apportare alcune modifiche.

Rimediare

Ora devi accelerare il tuo sito Web di oltre due volte. Quindi sai che devi scalare o ridimensionare.

Per scalare, ottenere server Web più grandi, più RAM, dischi più veloci.

Per ridimensionare, ottenere più server.

Usa le tue metriche dal passaggio 2 e i test per prendere questa decisione. Ad esempio, se durante il test la latenza del disco è stata enorme, sai che devi ridimensionare e ottenere dischi rigidi più veloci.

Se durante il test il processore era al 100%, forse è necessario ridimensionare per aggiungere server Web aggiuntivi per ridurre la pressione sui server esistenti.

Non esiste una risposta generica giusta o sbagliata, c'è solo ciò che è giusto per te. Prova a ridimensionare e, se non funziona, ridimensiona invece. O no, dipende da te e da alcuni pensare fuori dagli schemi.

Diciamo che ridimensioneremo. Decido quindi di clonare i miei due server Web (sono macchine virtuali) e ora ho quattro server Web.

Risciacqua, ripeti

Ricominciare dal passaggio 3. Se scopri che le cose non vanno come previsto (ad esempio, abbiamo raddoppiato i server Web, ma i tempi di risposta sono ancora più di due secondi), quindi cerca altri colli di bottiglia. Ad esempio, hai raddoppiato i server Web, ma hai ancora un server di database scadente. Oppure, hai clonato più macchine virtuali, ma poiché si trovano sullo stesso host fisico, hai ottenuto solo una maggiore contesa per le risorse del server.

È quindi possibile utilizzare questa procedura per testare altre parti del sistema. Invece di colpire il bilanciamento del carico, prova a colpire direttamente il web server o il server SQL utilizzando uno strumento di benchmarking SQL .


1
Questo è eccellente per i test di carico, ma dice poco sulla pianificazione della capacità. Chi può scrivere sull'architettura scalabile di Google, che è stata concepita all'inizio, o sulle alternative che usano scatole meno costose e costose.
rleir

10

La pianificazione della capacità inizia con la misurazione, in questo caso il tempo di risposta rispetto al carico. Una volta che conosci il grado in cui i programmi rallentano con il carico, che NON è una funzione lineare, puoi selezionare un obiettivo del tempo di risposta e quindi scoprire quali risorse ci vorranno per raggiungere quell'obiettivo per un determinato carico.

La misurazione delle prestazioni viene sempre eseguita con unità di tempo , ad esempio

  • sono ciò che interessa agli utenti
  • possono essere ridimensionati su e giù

Cose come% CPU e IOPS sono specifiche del sistema, quindi le usi solo quando hai pianificato il sistema e misurato in pre-produzione, per agire da "surrogato" per ciò che ti interessa, il tempo.


8

La pianificazione della capacità è una bestia fastidiosa. È tanto scienza quanto arte (se sicuramente oscura).

Il tuo caso migliore è che prendi decisioni ben informate e la fortuna / fortuna ti favorisca facendo in modo che la realtà soddisfi i tuoi presupposti. Se la tua capacità ha bisogno di presupposti che corrispondano alla realtà, sembri uno yogi mistico. Sfortunatamente, se i tuoi presupposti superano la realtà, sembrerai avere esagerato e speso troppo. Più sfortunatamente, se i tuoi presupposti sono al di sotto dell'eventuale realtà (o sono altrimenti errati), ti mancherà la capacità di cui hai bisogno e dovrai arrampicarti per mitigare i fallimenti della tua infrastruttura lamentosa, il che ti fa sembrare che manchi di competenza.

Nessuna pressione...

Sfortunatamente, l'arte oscura della pianificazione della capacità è più di quanto possa essere ragionevolmente distillata in una singola risposta di errore del server; davvero, è un argomento degno di libri.

Fortunatamente, esiste un libro del genere: " L'arte della pianificazione della capacità "


5

Per espandere il post di Mark Henderson, sto scrivendo questo specifico su Apache. Per ribadire ciò che ha detto, "La risposta breve è: nessuno può rispondere a questa domanda tranne te". Il testo di questa risposta è preso in prestito pesantemente dalla mia risposta a una domanda simile sulle prestazioni di un sito Web Drupal .

Configurazione di Apache con Mod_Prefork

Apache è probabilmente uno dei (se non il) server Web più popolare disponibile. È open source ed è ancora attivamente mantenuto. Puoi eseguirlo su entrambi i sistemi operativi Linux e Windows, ma è più popolare nel mondo Linux / Unix.

Non dovresti mai usare una configurazione Apache pronta all'uso. Devi sempre ottimizzare Apache sul tuo sito. Il file di configurazione principale di Apache su CentOS si trova in /etc/httpd/conf/httpd.conf, e il file di configurazione principale di Apache su sistemi Ubuntu si trova in genere su /etc/apache2/apache2.conf. File di configurazione aggiuntivi vengono utilizzati per cose come host virtuali .

Come molti software, Apache è progettato per essere flessibile e personalizzato in base alle esigenze di un sito Web specifico. Esistono diversi moduli multi-elaborazione che Apache può essere configurato per utilizzare per collegarsi a una porta di rete e accettare ed elaborare le richieste.

La maggior parte delle volte su installazioni Apache predefinite fornite con server CentOS e Ubuntu, viene utilizzato MPM " mod_prefork ". Supponendo che tu stia utilizzando mod_prefork (se non sei sicuro, allora è più probabile, ma solo tu puoi determinarlo) Ecco le basi di come configurarlo:

  • Scopri la quantità massima di memoria che vuoi utilizzare Apache.
  • Prova pesantemente il tuo sito Web e determina la quantità di memoria utilizzata da ogni processo Apache (usando top).
  • Prendi il processo Apache in cima che utilizza la maggior quantità di memoria, aggiungi un po 'di esso per una buona misura, quindi dividi il tuo primo numero (quantità massima di memoria che vuoi che Apache usi) per questo nuovo numero.
  • Il numero che ottieni dovrebbe essere il tuo MaxClients& ServerLimitvariabili.

Questa non è certamente la risposta definitiva. L'ottimizzazione del server Apache richiede tempo e richiede esperienza per essere corretta.


1
l'utilizzo della memoria basato esclusivamente sulla parte superiore è leggermente imperfetto, per favore controlla fe stackoverflow.com/questions/7880784/… Inoltre potresti voler usare lo script python "ps_mem.py" invece di top per l'utilizzo della memoria, o anche usare i valori direttamente allegati al processo sotto / proc
Dennis Nolte

1
L'intera risposta vale per la nota che hai aggiunto: "Non dovresti mai usare una configurazione Apache pronta all'uso". Non possiamo mai sottolinearlo abbastanza.
ezra-s,

0

Vorrei anche suggerire di parlare con gli architetti e gli ingegneri che hanno progettato / costruito le applicazioni per cercare di identificare colli di bottiglia, singoli punti di errore e limitazioni delle licenze.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.