Test locale delle prestazioni di un servizio cloud nell'emulatore di calcolo di Azure mediante il profiler di Visual StudioTesting the Performance of a Cloud Service Locally in the Azure Compute Emulator Using the Visual Studio Profiler

È possibile usare diversi strumenti e tecniche per il test delle prestazioni di servizi cloud.A variety of tools and techniques are available for testing the performance of cloud services. Quando si pubblica un servizio cloud in Azure, è possibile impostare Visual Studio per la raccolta di dati di profilatura e quindi per l'analisi locale di tali dati, come illustrato in Profilatura di un'applicazione di Azure.When you publish a cloud service to Azure, you can have Visual Studio collect profiling data and then analyze it locally, as described in Profiling an Azure Application. È anche possibile usare gli strumenti di diagnostica per tenere traccia di diversi contatori delle prestazioni, come illustrato in Uso dei contatori delle prestazioni in Azure.You can also use diagnostics to track a variety of performance counters, as described in Using performance counters in Azure. È inoltre consigliabile eseguire localmente la profilatura dell'applicazione nell'emulatore di calcolo prima di distribuirla nel cloud.You might also want to profile your application locally in the compute emulator before deploying it to the cloud.

In questo articolo viene illustrato il metodo Campionamento CPU per la profilatura, che può essere eseguito localmente nell'emulatore.This article covers the CPU Sampling method of profiling, which can be done locally in the emulator. Si tratta di un metodo di profilatura non eccessivamente invasivo.CPU sampling is a method of profiling that is not very intrusive. Il profiler salva uno snapshot dello stack di chiamate in base a intervalli di campionamento specificati.At a designated sampling interval, the profiler takes a snapshot of the call stack. I dati vengono raccolti per un determinato periodo di tempo e vengono visualizzati in un rapporto.The data is collected over a period of time, and shown in a report. Questo metodo di profilatura tende a indicare la posizione in cui viene eseguita la maggior parte del lavoro della CPU in un'applicazione a elevato utilizzo di calcolo.This method of profiling tends to indicate where in a computationally intensive application most of the CPU work is being done. Ciò consente di focalizzare l'attenzione sul "percorso critico" in cui l'applicazione trascorre la maggior parte del tempo.This gives you the opportunity to focus on the "hot path" where your application is spending the most time.

1: Configurare Visual Studio per la profilatura1: Configure Visual Studio for profiling

Visual Studio include alcune opzioni di configurazione che possono risultare utili per la profilatura.First, there are a few Visual Studio configuration options that might be helpful when profiling. Per rendere comprensibili i rapporti di profilatura, saranno necessari simboli (file con estensione pdb) per l'applicazione, oltre a simboli per le librerie di sistema.To make sense of the profiling reports, you'll need symbols (.pdb files) for your application and also symbols for system libraries. È necessario assicurarsi di fare riferimento ai server dei simboli disponibili.You'll want to make sure that you reference the available symbol servers. A tale scopo, dal menu Strumenti in Visual Studio scegliere Opzioni, quindi Debug e infine Simboli.To do this, on the Tools menu in Visual Studio, choose Options, then choose Debugging, then Symbols. Verificare che Server dei simboli Microsoft sia elencato in Percorsi dei file di simboli (pdb).Make sure that Microsoft Symbol Servers is listed under Symbol file (.pdb) locations. È inoltre possibile fare riferimento a http://referencesource.microsoft.com/symbols, dove potrebbero essere disponibili file di simboli aggiuntivi.You can also reference http://referencesource.microsoft.com/symbols, which might have additional symbol files.

Opzioni dei simboli

Se lo si desidera, è possibile semplificare i rapporti generati dal profiler impostando Just My Code.If desired, you can simplify the reports that the profiler generates by setting Just My Code. Se Just My Code è abilitato, gli stack di chiamate funzione vengono semplificati, in modo che le chiamate interamente interne alle librerie e a .NET Framework non vengano visualizzate nei rapporti.With Just My Code enabled, function call stacks are simplified so that calls entirely internal to libraries and the .NET Framework are hidden from the reports. Scegliere Opzioni dal menu Strumenti.On the Tools menu, choose Options. Espandere quindi il nodo Strumenti per le prestazioni e scegliere Generale.Then expand the Performance Tools node, and choose General. Selezionare la casella di controllo Abilita Just My Code per i rapporti del profiler.Select the checkbox for Enable Just My Code for profiler reports.

Opzioni di Just My Code

Queste istruzioni sono applicabili a un progetto esistente o a un nuovo progetto.You can use these instructions with an existing project or with a new project. Se si crea un nuovo progetto per provare ad applicare le tecniche illustrate di seguito, scegliere un progetto Servizio cloud di Azure in C# e quindi selezionare un ruolo Web e un ruolo di lavoro.If you create a new project to try the techniques described below, choose a C# Azure Cloud Service project, and select a Web Role and a Worker Role.

Ruoli del progetto Servizi cloud di Azure

A scopo esemplificativo, aggiungere al progetto codice la cui esecuzione richiede molto tempo e che illustri alcuni problemi ovvi relativi alle prestazioni.For example purposes, add some code to your project that takes a lot of time and demonstrates some obvious performance problem. Aggiungere ad esempio il codice seguente a un progetto di tipo ruolo di lavoro:For example, add the following code to a worker role project:

public class Concatenator
{
    public static string Concatenate(int number)
    {
        int count;
        string s = "";
        for (count = 0; count < number; count++)
        {
            s += "\n" + count.ToString();
        }
        return s;
    }
}

Chiamare tale codice dal metodo RunAsync nella classe del ruolo di lavoro derivata da RoleEntryPoint.Call this code from the RunAsync method in the worker role's RoleEntryPoint-derived class. (Ignorare l'avviso relativo al metodo eseguito in modalità sincrona).(Ignore the warning about the method running synchronously.)

    private async Task RunAsync(CancellationToken cancellationToken)
    {
        // TODO: Replace the following with your own logic.
        while (!cancellationToken.IsCancellationRequested)
        {
            Trace.TraceInformation("Working");
            Concatenator.Concatenate(10000);
        }
    }

Compilare ed eseguire localmente il servizio cloud senza eseguire il debug (CTRL+F5) con la configurazione della soluzione impostata su Release.Build and run your cloud service locally without debugging (Ctrl+F5), with the solution configuration set to Release. In tale modo, tutti i file e le cartelle verranno creati per l'esecuzione locale dell'applicazione e tutti gli emulatori verranno avviati.This ensures that all files and folders are created for running the application locally, and ensures that all the emulators are started. Avviare l'interfaccia utente dell'emulatore di calcolo dalla barra delle applicazioni per verificare che il ruolo di lavoro sia in esecuzione.Start the Compute Emulator UI from the taskbar to verify that your worker role is running.

2: Connettersi a un processo2: Attach to a process

Invece di eseguire la profilatura dell'applicazione avviandola dall'IDE di Visual Studio 2010, è necessario connettere il profiler a un processo in esecuzione.Instead of profiling the application by starting it from the Visual Studio 2010 IDE, you must attach the profiler to a running process.

A tale scopo, scegliere Profiler dal menu Analizza, quindi fare clic su Connetti/Disconnetti.To attach the profiler to a process, on the Analyze menu, choose Profiler and Attach/Detach.

Opzione per il collegamento del profilo

Per un ruolo di lavoro individuare il processo WaWorkerHost.exe.For a worker role, find the WaWorkerHost.exe process.

Processo WaWorkerHost

Se la cartella del progetto si trova su un'unità di rete, il profiler richiederà di specificare un percorso diverso per il salvataggio dei rapporti di profilatura.If your project folder is on a network drive, the profiler will ask you to provide another location to save the profiling reports.

È anche possibile connettersi a un ruolo Web mediante la connessione a WaIISHost.exe.You can also attach to a web role by attaching to WaIISHost.exe. Se l'applicazione include più processi di ruolo di lavoro, sarà necessario usare il valore processID per distinguerli.If there are multiple worker role processes in your application, you need to use the processID to distinguish them. È possibile eseguire query relative ai valori processID a livello di codice, mediante l'accesso all'oggetto Process.You can query the processID programmatically by accessing the Process object. Se, ad esempio, si aggiunge il codice seguente al metodo Run della classe derivata da RoleEntryPoint in un ruolo, sarà possibile esaminare il log nell'interfaccia utente dell'emulatore di calcolo per individuare i processi a cui connettersi.For example, if you add this code to the Run method of the RoleEntryPoint-derived class in a role, you can look at the log in the Compute Emulator UI to know what process to connect to.

var process = System.Diagnostics.Process.GetCurrentProcess();
var message = String.Format("Process ID: {0}", process.Id);
Trace.WriteLine(message, "Information");

Per visualizzare il log, avviare l'interfaccia utente dell'emulatore di calcolo.To view the log, start the Compute Emulator UI.

Avviare l'interfaccia utente dell'emulatore di calcolo

Aprire la finestra della console del log del ruolo di lavoro nell'interfaccia utente dell'emulatore di calcolo, facendo clic sulla barra del titolo nella finestra della console.Open the worker role log console window in the Compute Emulator UI by clicking on the console window's title bar. Nel log è possibile verificare l'ID dei processi.You can see the process ID in the log.

Visualizzare l'ID processo

Dopo la connessione, eseguire la procedura nell'interfaccia utente dell'applicazione, se necessario, per riprodurre lo scenario.One you've attached, perform the steps in your application's UI (if needed) to reproduce the scenario.

Per interrompere la profilatura, scegliere il collegamento Interrompi la profilatura .When you want to stop profiling, choose the Stop Profiling link.

Opzione Arresta profilatura

3: Visualizzare i rapporti relativi alle prestazioni3: View performance reports

Viene visualizzato il rapporto relativo alle prestazioni dell'applicazione.The performance report for your application is displayed.

A questo punto, l'esecuzione del profiler viene interrotta, i dati vengono salvati in un file con estensione vsp e viene visualizzato un rapporto che include un'analisi di tali dati.At this point, the profiler stops executing, saves data in a .vsp file, and displays a report that shows an analysis of this data.

Report del profiler

Se nel percorso critico è visibile il file String.wstrcpy, fare clic su Just My Code per modificare la visualizzazione, in modo da mostrare solo il codice utente.If you see String.wstrcpy in the Hot Path, click on Just My Code to change the view to show user code only. Se è visualizzato String.Concat, provare a selezionare il pulsante Mostra tutto il codice.If you see String.Concat, try pressing the Show All Code button.

Come si può notare, il metodo Concatenate e String.Concat richiedono una parte significativa del tempo di esecuzione.You should see the Concatenate method and String.Concat taking up a large portion of the execution time.

Analisi del report

Se è stato aggiunto il codice di concatenazione di stringa disponibile in questo articolo, nell'Elenco attività dovrebbe essere visualizzato un avviso corrispondente.If you added the string concatenation code in this article, you should see a warning in the Task List for this. È anche possibile che venga visualizzato un avviso relativo a una quantità eccessiva di Garbage Collection, dovuta al numero di stringhe eliminate.You may also see a warning that there is an excessive amount of garbage collection, which is due to the number of strings that are created and disposed.

Avvisi di prestazioni

4: Apportare modifiche e confrontare le prestazioni4: Make changes and compare performance

È anche possibile confrontare le prestazioni prima e dopo la modifica del codice.You can also compare the performance before and after a code change. Arrestare il processo in esecuzione e modificare il codice per sostituire l'operazione di concatenazione di stringa usando StringBuilder:Stop the running process, and edit the code to replace the string concatenation operation with the use of StringBuilder:

public static string Concatenate(int number)
{
    int count;
    System.Text.StringBuilder builder = new System.Text.StringBuilder("");
    for (count = 0; count < number; count++)
    {
         builder.Append("\n" + count.ToString());
    }
    return builder.ToString();
}

Eseguire di nuovo la verifica delle prestazioni e quindi confrontare le prestazioni.Do another performance run, and then compare the performance. Se le esecuzioni si trovano nella stessa sessione, in Esplora prestazioni è possibile selezionare entrambi i rapporti, aprire il menu di scelta rapida e quindi scegliere Confronta rapporto di prestazioni.In the Performance Explorer, if the runs are in the same session, you can just select both reports, open the shortcut menu, and choose Compare Performance Reports. Per effettuare un confronto con un'esecuzione in un'altra sessione relativa alle prestazioni, aprire il menu Analizza e quindi scegliere Confronta rapporto di prestazioni.If you want to compare with a run in another performance session, open the Analyze menu, and choose Compare Performance Reports. Specificare entrambi i file nella casella della finestra di dialogo visualizzata.Specify both files in the dialog box that appears.

Opzione Confronta report di prestazioni

Nei rapporti vengono evidenziate le differenze tra le due esecuzioni.The reports highlight differences between the two runs.

Report di confronto

Congratulazioni.Congratulations! sono state eseguite le operazioni preliminari con il profiler.You've gotten started with the profiler.

Risoluzione dei problemiTroubleshooting

  • Assicurarsi di eseguire la profilatura di una compilazione di rilascio e avviarla senza eseguire il debug.Make sure you are profiling a Release build and start without debugging.
  • Se l'opzione Connetti/Disconnetti non è abilitata nel menu Profiler, eseguire la Creazione guidata sessione di prestazioni.If the Attach/Detach option is not enabled on the Profiler menu, run the Performance Wizard.
  • Usare l'interfaccia utente dell'emulatore di calcolo per visualizzare lo stato dell'applicazione.Use the Compute Emulator UI to view the status of your application.
  • Se si verificano problemi di avvio delle applicazioni nell'emulatore o problemi di connessione del profiler, arrestare l'emulatore di calcolo e riavviarlo.If you have problems starting applications in the emulator, or attaching the profiler, shut down the compute emulator and restart it. Se il problema persiste, provare a riavviare il sistema.If that doesn't solve the problem, try rebooting. È possibile che questo problema si verifichi se si usa l'emulatore di calcolo per sospendere e rimuovere distribuzioni in esecuzione.This problem can occur if you use the Compute Emulator to suspend and remove running deployments.
  • Se sono stati usati comandi relativi alla profilatura dalla riga di comando, in particolare le impostazioni globali, assicurarsi che sia stata effettuata la chiamata a VSPerfClrEnv /globaloff e che VsPerfMon.exe sia stato arrestato.If you have used any of the profiling commands from the command line, especially the global settings, make sure that VSPerfClrEnv /globaloff has been called and that VsPerfMon.exe has been shut down.
  • Se durante il campionamento viene visualizzato il messaggio "PRF0025: Dati non raccolti", verificare che nel processo a cui ci si è connessi sia presente attività della CPU.If when sampling, you see the message "PRF0025: No data was collected," check that the process you attached to has CPU activity. È possibile che le applicazioni che non eseguono attività di calcolo non producano dati di campionamento.Applications that are not doing any computational work might not produce any sampling data. È inoltre possibile che il processo sia stato chiuso prima dell'esecuzione del campionamento.It's also possible that the process exited before any sampling was done. Verificare che il metodo Run di un ruolo da sottoporre a profilatura non preveda la terminazione.Check to see that the Run method for a role that you are profiling does not terminate.

Passaggi successiviNext Steps

La strumentazione dei file binari di Azure nell'emulatore non è supportata nel profiler di Visual Studio. Se tuttavia si desidera testare l'allocazione della memoria, è possibile scegliere tale opzione durante la profilatura.Instrumenting Azure binaries in the emulator is not supported in the Visual Studio profiler, but if you want to test memory allocation, you can choose that option when profiling. È inoltre possibile scegliere la profilatura della concorrenza, che consente di determinare se i thread sprecano tempo nel tentativo di ottenere blocchi, oppure la profilatura di interazioni tra livelli, che consente di tenere traccia dei problemi di prestazioni durante l'interazione tra livelli di un'applicazione, nella maggior parte dei casi tra il livello dati e il ruolo di lavoro.You can also choose concurrency profiling, which helps you determine whether threads are wasting time competing for locks, or tier interaction profiling, which helps you track down performance problems when interacting between tiers of an application, most frequently between the data tier and a worker role. È possibile visualizzare le query di database generate dall'applicazione e usare i dati di profilatura per ottimizzare l'uso del database.You can view the database queries that your app generates and use the profiling data to improve your use of the database. Per informazioni sulla profilatura dell'interazione tra livelli, vedere il post di blog Walkthrough: Using the Tier Interaction Profiler in Visual Studio Team System 2010 (Procedura dettagliata: Uso del profiler relativo alle interazioni tra livelli in Visual Studio Team System 2010).For information about tier interaction profiling, see the blog post Walkthrough: Using the Tier Interaction Profiler in Visual Studio Team System 2010.