Esercitazione: Eseguire un test di carico per identificare i colli di bottiglia delle prestazioni in un'app Web

In questa esercitazione si apprenderà come identificare i colli di bottiglia delle prestazioni in un'applicazione Web usando Test di carico di Azure. Si simula il carico per un'applicazione Web Node.js di esempio e quindi si usa il dashboard del test di carico per analizzare le metriche lato client e lato server.

L'applicazione di esempio è costituita da un'API Web Node.js, che interagisce con un database NoSQL. Distribuire l'API Web in app Web del servizio app Azure e usare Azure Cosmos DB come database.

In questa esercitazione apprenderai a:

  • Distribuire l'app di esempio.
  • Creare ed eseguire un test di carico.
  • Aggiungere componenti dell'app di Azure al test di carico.
  • Identificare i colli di bottiglia delle prestazioni usando il dashboard del test di carico.

Prerequisiti

Controllo dei prerequisiti

Prima di iniziare, convalidare l'ambiente:

Distribuire l'applicazione di esempio

In questa esercitazione si genera il carico su un'applicazione Web di esempio distribuita in app Azure Servizio. Usare i comandi dell'interfaccia della riga di comando di Azure, i comandi Git e i comandi di PowerShell per distribuire l'applicazione di esempio nella sottoscrizione di Azure.

  1. Aprire Windows PowerShell, accedere ad Azure e impostare la sottoscrizione:

    az login
    az account set --subscription <your-Azure-Subscription-ID>
    
  2. Clonare il repository di origine dell'applicazione di esempio:

    git clone https://github.com/Azure-Samples/nodejs-appsvc-cosmosdb-bottleneck.git
    

    L'applicazione di esempio è un'app Node.js costituita da un componente Web del servizio app Azure e da un database di Azure Cosmos DB. Il repository include uno script di PowerShell che distribuisce l'app di esempio nella sottoscrizione di Azure. Include anche uno script Apache JMeter che verrà usato nei passaggi successivi.

  3. Passare alla directory dell'app Node.js e distribuire l'app di esempio usando questo script di PowerShell:

    cd nodejs-appsvc-cosmosdb-bottleneck
    .\deploymentscript.ps1
    

    Suggerimento

    È possibile installare PowerShell in Linux/WSL o macOS.

    Dopo averla installata, è possibile eseguire il comando precedente come pwsh ./deploymentscript.ps1.

  4. Al prompt specificare:

    • L'ID sottoscrizione di Azure.
    • Nome univoco per l'app Web.
    • Posizione. Per impostazione predefinita, il percorso è eastus. È possibile ottenere i codici di area eseguendo il comando Get-AzLocation .

    Importante

    Per il nome dell'app Web, usare solo lettere minuscole e numeri. Non usare spazi o caratteri speciali.

  5. Al termine della distribuzione, passare all'applicazione di esempio in esecuzione aprendo https://<yourappname>.azurewebsites.net in una finestra del browser.

Ora che l'applicazione di esempio è stata distribuita ed eseguita, è possibile creare una risorsa di test di carico di Azure e un test di carico.

Creare un test di carico

In questa esercitazione si sta creando un test di carico con l'interfaccia della riga di comando di Azure caricando uno script di test JMeter (jmx file). Il repository di applicazioni di esempio contiene già un file di configurazione del test di carico e uno script di test JMeter.

Per creare un test di carico usando il portale di Azure, seguire la procedura descritta in Avvio rapido: Creare un test di carico con uno script JMeter.

Seguire questa procedura per creare una risorsa di test di carico di Azure e un test di carico usando l'interfaccia della riga di comando di Azure:

  1. Aprire una finestra del terminale e immettere il comando seguente per accedere alla sottoscrizione di Azure.

    az login
    
  2. Passare alla directory dell'applicazione di esempio.

    cd nodejs-appsvc-cosmosdb-bottleneck
    
  3. Creare un gruppo di risorse per la risorsa di test di carico di Azure.

    Facoltativamente, è anche possibile riutilizzare il gruppo di risorse dell'applicazione di esempio distribuita in precedenza.

    Sostituire il <load-testing-resource-group-name> segnaposto di testo con il nome del gruppo di risorse.

    resourceGroup="<load-testing-resource-group-name>"
    location="East US"
    
    az group create --name $resourceGroup --location $location
    
  4. Creare una risorsa di test di carico di Azure con il az load create comando .

    Sostituire il <load-testing-resource-name> segnaposto di testo con il nome della risorsa di test di carico.

    # This script requires the following Azure CLI extensions:
    # - load
    
    loadTestResource="<load-testing-resource-name>"
    
    az load create --name $loadTestResource --resource-group $resourceGroup --location $location
    
  5. Creare un test di carico per simulare il carico sull'applicazione di esempio con il az load test create comando .

    Sostituire il segnaposto di <web-app-hostname> testo con il servizio app nome host dell'applicazione di esempio. Questo valore è del formato myapp.azurewebsites.net. Non includere la https:// parte dell'URL.

    testId="sample-app-test"
    webappHostname="<web-app-hostname>"
    
    az load test create --test-id $testId --load-test-resource $loadTestResource --resource-group $resourceGroup --load-test-config-file SampleApp.yaml --env webapp=$webappHostname
    

    Questo comando usa il file di configurazione del Sampleapp.yaml test di carico, che fa riferimento allo SampleApp.jmx script di test JMeter. Usare un parametro della riga di comando per passare il nome host dell'applicazione di esempio al test di carico.

È ora disponibile una risorsa di test di carico di Azure e un test di carico per generare carico sull'applicazione Web di esempio nella sottoscrizione di Azure.

Aggiungere componenti dell'app di Azure per monitorare l'applicazione

Test di carico di Azure consente di monitorare le metriche delle risorse per i componenti di Azure dell'applicazione. Analizzando queste metriche lato server, è possibile identificare i problemi di prestazioni e stabilità nell'applicazione direttamente dal dashboard test di carico di Azure.

In questa esercitazione vengono aggiunti i componenti di Azure per l'applicazione di esempio distribuita in Azure, ad esempio il servizio app, l'account Cosmos DB e altro ancora.

Per aggiungere i componenti dell'app di Azure per l'applicazione di esempio al test di carico:

  1. Nella portale di Azure passare alla risorsa test di carico di Azure.

  2. Nel riquadro sinistro selezionare Test per visualizzare l'elenco dei test di carico

  3. Selezionare la casella di controllo accanto al test di carico e quindi selezionare Modifica.

    Screenshot that shows the list of load tests in the Azure portal, highlighting how to select a test from the list and the Edit button to modify the load test configuration.

  4. Passare alla scheda Monitoraggio e quindi selezionare Aggiungi/Modifica.

  5. Selezionare le caselle di controllo per l'applicazione di esempio distribuita in precedenza e quindi selezionare Applica.

    Screenshot that shows how to add app components to a load test in the Azure portal.

    Suggerimento

    È possibile usare il filtro del gruppo di risorse per visualizzare solo le risorse di Azure nel gruppo di risorse dell'applicazione di esempio.

  6. Selezionare Applica per salvare le modifiche apportate alla configurazione del test di carico.

Sono stati aggiunti correttamente i componenti dell'app di Azure per l'applicazione di esempio al test di carico per abilitare il monitoraggio delle metriche lato server durante l'esecuzione del test di carico.

Eseguire il test di carico

È ora possibile eseguire il test di carico per simulare il carico sull'applicazione di esempio distribuita nella sottoscrizione di Azure. In questa esercitazione si esegue il test di carico dall'interno del portale di Azure. In alternativa, è possibile configurare il flusso di lavoro CI/CD per eseguire il test di carico.

Per eseguire il test di carico nel portale di Azure:

  1. Nella portale di Azure passare alla risorsa test di carico di Azure.

  2. Nel riquadro sinistro selezionare Test per visualizzare l'elenco dei test di carico

  3. Selezionare il test di carico dall'elenco per visualizzare i dettagli del test e l'elenco delle esecuzioni di test.

  4. Selezionare Esegui e quindi Esegui di nuovo per avviare il test di carico.

    Facoltativamente, è possibile immettere una descrizione dell'esecuzione del test.

    Screenshot that shows how to start a load test in the Azure portal.

    Quando si esegue un test di carico, Test di carico di Azure distribuisce lo script di test JMeter e tutti i file aggiuntivi nelle istanze del motore di test e quindi avvia il test di carico.

  5. All'avvio del test di carico verrà visualizzato il dashboard del test di carico.

    Se il dashboard non viene visualizzato, è possibile selezionare Aggiorna e quindi selezionare l'esecuzione del test dall'elenco.

    Il dashboard del test di carico presenta i dettagli dell'esecuzione dei test, ad esempio le metriche lato client e le metriche dell'applicazione lato server. I grafici del dashboard vengono aggiornati automaticamente.

    Screenshot that shows the client-side metrics graphs in the load test dashboard in the Azure portal.

    È possibile applicare più filtri o aggregare i risultati a percentili diversi per personalizzare i grafici.

    Suggerimento

    È possibile arrestare un test di carico in qualsiasi momento dal portale di Azure selezionando Arresta.

Attendere il completamento completo del test di carico prima di procedere con la sezione successiva.

Usare le metriche lato server per identificare i colli di bottiglia delle prestazioni

In questa sezione vengono analizzati i risultati del test di carico per identificare i colli di bottiglia delle prestazioni nell'applicazione. Esaminare le metriche lato client e lato server per determinare la causa radice del problema.

  1. Esaminare prima di tutto le metriche lato client. Si noti che il 90° percentile per la metrica Tempo di risposta per le add richieste API e get è superiore a quello per l'API lasttimestamp .

    Screenshot that shows the client-side metrics.

    È possibile visualizzare un modello simile per Errori, in cui l'API lasttimestamp presenta meno errori rispetto alle altre API.

    Screenshot that shows the error chart.

    I risultati delle add API e get sono simili, mentre l'API lasttimestamp si comporta in modo diverso. La causa potrebbe essere correlata al database, perché entrambe le API e get comportano l'accesso add al database.

  2. Per esaminare questo collo di bottiglia in modo più dettagliato, scorrere verso il basso fino alla sezione Dashboard delle metriche sul lato server.

    Le metriche lato server mostrano informazioni dettagliate sui componenti dell'applicazione Azure: piano di servizio app Azure, app Web del servizio app Azure e Azure Cosmos DB.

    Screenshot that shows the Azure App Service plan metrics.

    Nelle metriche per il piano di servizio app Azure è possibile osservare che le metriche Percentuale CPU e Percentuale memoria rientrano in un intervallo accettabile.

  3. Esaminare ora le metriche lato server di Azure Cosmos DB.

    Screenshot that shows Azure Cosmos DB metrics.

    Si noti che la metrica Normalized UR Consumption indica che il database è stato eseguito rapidamente con un utilizzo delle risorse del 100%. L'utilizzo elevato delle risorse potrebbe causare errori di limitazione del database. Può anche aumentare i tempi di risposta per le add API Web e get .

    È anche possibile notare che la metrica Velocità effettiva con provisioning per l'istanza di Azure Cosmos DB ha una velocità effettiva massima di 400 UR. L'aumento della velocità effettiva con provisioning del database potrebbe risolvere il problema di prestazioni.

Aumentare la velocità effettiva del database

In questa sezione si allocano più risorse al database per risolvere il collo di bottiglia delle prestazioni.

Per Azure Cosmos DB, aumentare l'impostazione di scalabilità delle UR del database:

  1. Passare alla risorsa di Azure Cosmos DB di cui è stato effettuato il provisioning come parte della distribuzione dell'applicazione di esempio.

  2. Selezionare la scheda Esplora dati.

    Screenshot that shows Data Explorer tab.

  3. Selezionare Scala e Impostazioni e aggiornare il valore della velocità effettiva a 1200.

    Screenshot that shows the updated Azure Cosmos DB scale settings.

  4. Selezionare Save (Salva) per confermare le modifiche.

Convalidare i miglioramenti delle prestazioni

Ora che è stata aumentata la velocità effettiva del database, eseguire di nuovo il test di carico e verificare che i risultati delle prestazioni siano migliorati:

  1. Nel dashboard di esecuzione dei test selezionare Riesegui e quindi selezionare Riesegui nel riquadro Esegui di nuovo il test.

    Screenshot that shows selections for running the load test.

    È possibile visualizzare una nuova voce di esecuzione del test con una colonna di stato che scorre gli stati Provisioning, Esecuzione e Fine . In qualsiasi momento, selezionare l'esecuzione del test per monitorare l'avanzamento del test di carico.

  2. Al termine del test di carico, controllare i risultati del tempo di risposta e i risultati degli errori delle metriche sul lato client.

  3. Controllare le metriche lato server per Azure Cosmos DB e assicurarsi che le prestazioni siano migliorate.

    Screenshot that shows the Azure Cosmos DB client-side metrics after update of the scale settings.

    Il valore del consumo di UR normalizzato di Azure Cosmos DB è ora ben inferiore al 100%.

Ora che sono state aggiornate le impostazioni di scalabilità del database, è possibile osservare che:

  • Il tempo di risposta per le add API e get è stato migliorato.
  • Il consumo normalizzato di UR rimane ben al di sotto del limite.

Di conseguenza, le prestazioni complessive dell'applicazione sono migliorate.

Pulire le risorse

Importante

È possibile riutilizzare la risorsa test di carico di Azure creata per altre esercitazioni su Test di carico di Azure e articoli sulle procedure.

Se non si prevede di usare alcuna delle risorse create, eliminarle in modo da non comportare ulteriori addebiti. Se l'applicazione di esempio è stata distribuita in un gruppo di risorse diverso, è possibile ripetere i passaggi seguenti.

Per eliminare le risorse usando il portale di Azure:

  1. Selezionare il pulsante del menu nell'angolo superiore sinistro e quindi selezionare Gruppi di risorse.

  2. Nell'elenco selezionare il gruppo di risorse creato.

  3. Selezionare Elimina gruppo di risorse. Screenshot of the selections to delete a resource group in the Azure portal.

  4. Immettere il nome del gruppo di risorse. Quindi seleziona Elimina.

Per eliminare le risorse usando l'interfaccia della riga di comando di Azure, immettere il comando seguente:

az group delete --name <yourresourcegroup>

Tenere presente che l'eliminazione del gruppo di risorse comporta l'eliminazione di tutte le risorse al suo interno.