Se si dispone di un sito di e-commerce (o qualsiasi sito per quella materia), non è raro che ci si aspetterebbe un livello più elevato di traffico in determinati giorni, come Venerdì nero, per esempio. In momenti come questi, dobbiamo portare i nostri test di carico al livello successivo e simulare un numero maggiore di utenti simultanei. Se eseguiamo i nostri test di carico localmente con Apache JMeter™, ci sono alcune limitazioni al numero di utenti che è possibile eseguire, anche se il computer dispone di CPU e memoria sufficienti.
Come possiamo creare uno scenario con più di 800 utenti simultanei utilizzando JMeter? Una delle risposte sta eseguendo JMeter in modalità distribuita. Per quelli di voi che non ne hanno mai sentito parlare, ecco una breve spiegazione.
Quando parliamo di distribuzione di JMeter, ci riferiamo a un’architettura Master-Slave in cui JMeter utilizza Java RMI per interagire con oggetti in una rete distribuita. Potete vedere questo nell’immagine qui sotto.
Il test distribuito consente di avere un jmeter locale (master) che gestisce l’esecuzione del test, insieme a più istanze JMETER remote (slave) che invieranno la richiesta al nostro server di destinazione.
Ma prima di poter eseguire JMeter in modo distribuito, è necessario eseguire un paio di semplici passaggi.
In primo luogo, abbiamo bisogno di avere più computer.
Quindi dobbiamo far funzionare il server JMeter su ogni sistema slave che abbiamo. A tale scopo, dobbiamo eseguire il jmeter-server.bat (jmeter-server per gli utenti Unix) che si trova nel jmeter/bin. Una volta che lo eseguiamo dovremmo vedere qualcosa del genere:
Quindi, attraverso lo stesso percorso, ma nel sistema master, individuare il jmeter.proprietà fil. Modificare questo file e aggiungere gli IP di tutti i sistemi slave che dovrebbero essere coinvolti nella proprietà remote_hosts. Assicurarsi che i sistemi master e slave si trovino nella stessa sottorete.
È molto importante ricordare che tutti i valori devono essere separati da virgole (in questo esempio stiamo usando un solo sistema slave, solo per semplificarlo).
Una volta completati tutti questi passaggi, possiamo avviare JMeter ed eseguire i test di cui abbiamo bisogno. In questo caso, eseguiremo JMeter usando la modalità GUI, in modo da poter avere un’idea migliore di come funziona. Tuttavia, la modalità non GUI è fortemente raccomandata a scopo di test.
Il numero di utenti, ramp up e iterazioni deve essere configurato nel gruppo di thread dei sistemi master come al solito. Durante l’esecuzione del test, queste condizioni verranno replicate su ciascun sistema slave.
Dopo aver avviato JMeter e caricato il nostro test, abbiamo due opzioni. Uno, configurato tramite il sistema master, è tramite Run- > Avvio remoto e quindi selezionare il sistema slave in cui vogliamo eseguire. Il secondo, configurato anche attraverso il sistema master, è Run – >Remote Start All per avviare il test su tutti i sistemi slave disponibili.
(Come abbiamo impostato un solo sistema slave, non c’è differenza tra le due opzioni in questo esempio).
Qui abbiamo un semplice scenario in cui possiamo cercare e visualizzare un articolo su un sito di e-commerce:
Come puoi vedere, abbiamo aggiunto un listener dell’albero dei risultati di visualizzazione in modo da poter verificare se il test è stato eseguito correttamente o meno. Quando eseguiamo un test da remoto, saremo in grado di vedere localmente il risultato del test sul listener dell’albero dei risultati di visualizzazione come ho già detto, ma nei sistemi slave, possiamo solo osservare l’ora di inizio e l’ora di fine del test.
Localmente:
A distanza:
Dietro le quinte, ogni sistema slave sta eseguendo i test di carico con le condizioni che abbiamo impostato nel sistema master. In questo modo, stiamo raggiungendo un numero maggiore di utenti simultanei e quindi un carico maggiore sul nostro server di destinazione.
Pertanto, se vogliamo distribuire veramente il carico, dobbiamo farlo manualmente. Ad esempio: se vogliamo raggiungere 10.000 utenti simultanei e abbiamo 10 sistemi slave, il nostro piano di test deve avere 1000 utenti, quindi finiamo per avere 10.000 in totale.
Un’altra cosa interessante che possiamo fare è aggiungere logica al nostro test aggiungendo un controller If. Il controller If ci consente di scegliere un flusso particolare che vogliamo eseguire, a seconda del sistema che sta eseguendo il test. Ao, diversi sistemi slave eseguirebbero diverse parti del test.
Ad esempio, se aggiungiamo un parametro quando si esegue il server jmeter sui sistemi slave (./ jmeter-server-Jparam=1) possiamo inserire una condizione come {{__JavaScript ({{param}==1)} all’interno del Controller If, in modo da poter eseguire richieste particolari a seconda del sistema slave.
Questo è tutto! Abbiamo eseguito con successo un test su un sistema distribuito JMeter. Questo potrebbe non sembrare molto complesso perché abbiamo scelto di utilizzare un solo sistema slave. Ma se è necessario simulare 25.000 utenti simultanei, il costo di manutenzione di tutti questi sistemi è enorme. Potrebbe esserci una possibile soluzione per i problemi di manutenzione e cioè montare tutta l’architettura che abbiamo visto sui contenitori Docker (puoi vedere un esempio qui).
Tuttavia, questo non sarà ancora abbastanza buono se il nostro obiettivo è eseguire periodicamente test di carico. Abbiamo montato tutta l’architettura distribuita in un computer, quindi stiamo consumando una notevole quantità di risorse. Il concetto di distribuzione di JMeter su Docker ha più senso se abbiamo la possibilità di aumentare il numero di contenitori su richiesta, come in un servizio di cloud computing.
Un’altra difficoltà quando si esegue JMeter in modalità distribuita è come gestire i file CSV quando si hanno dati parametrizzati nei test. Questo perché abbiamo bisogno di avere file separati, e se dobbiamo aggiornarli dobbiamo andare a ciascun sistema slave e apportare le modifiche.
Per risolvere tutte queste limitazioni e inconvenienti, possiamo usare BlazeMeter, che ci fornisce un modo semplice per gestire i nostri test di carico. Tutto quello che dobbiamo fare caricare il nostro file JMX su BlazeMeter. Possiamo anche caricare un file CSV consolidato con tutti i dati necessari e BlazeMeter si occuperà di dividerlo, a seconda della quantità di motori che abbiamo impostato.
Su BlazeMeter possiamo impostare la quantità di utenti o la combinazione di motori (sistemi slave) e thread che vogliamo applicare ai nostri test. Possiamo anche configurare valori aggiuntivi come multi posizioni.
Risultati dei test:
Ecco fatto! Ora hai visto alcune soluzioni per l’esecuzione di test di carico su larga scala, la mia raccomandazione per te è di creare la tua esperienza e prendere una decisione su quale opzione ti offre maggiori benefici.
Scopri di più su come utilizzare JMeter dalla nostra Jmeter academy gratuita.