Schnellere Webanwendungen dank MiniProfiler

Performance-Probleme bemerkt man meist erst dann wenn es zu spät ist – in der Produktion. Die kleine Menge an Testdaten auf dem Entwicklungssystem verzeihen einem so manche Unachtsamkeit und Ressourcenverschwendung. Unnötige SQL-Abfragen und die Select N+1 Problematik könnte man schon früh erkennen. Nur wer nimmt sich die Zeit immer den Profiler zu starten und alles zu überprüfen?

Wäre es nicht toll wenn im Hintergrund immer ein Profiler laufen und einem mit den Auswertungen versorgen würde? So könnte man immer mal wieder einen Blick aufs Ergebnis werfen und bei lange dauernden Aktionen gleich sehen wo die Ursache liegt. Tönt dies zu schön um wahr zu sein?

MiniProfiler bietet einem genau diese Funktionalität für ASP.Net und ASP.Net MVC Anwendungen. Dieser Profiler stammt von Stack Exchange und hilft dort beim optimieren aller Seiten der Stack Overflow-Familie.

 

Installieren

Die Installation von MiniProfiler erfolgt über NuGet. Wie immer kann man über die grafische Oberfläche das Paket suchen und installieren oder man nutzt die Konsole:

Install-Package MiniProfiler

 

Aktivieren

Um dem Profiler den Anfang und das Ende eines Requests mitzuteilen muss man die Datei Global.asax um diese beiden Methoden Erweitern:

protected void Application_BeginRequest()
{
    if (Request.IsLocal)
    {
        MiniProfiler.Start();
    }
}

protected void Application_EndRequest()
{
    MiniProfiler.Stop();
}

Damit auch etwas angezeigt wird muss die Datei \Views\Shared\_Layout.cshtml direkt vor dem schliessenden Body-Tag mit einem Aufruf zum Rendern der Resultate ergänzt werden:

    @StackExchange.Profiling.MiniProfiler.RenderIncludes() 
  </body>
</html>

Will man MiniProfiler in einem Webforms-Projekt einsetzten ist der Header in der Datei Site.Master so zu ergänzen:

<%= StackExchange.Profiling.MiniProfiler.RenderIncludes() %>
</head>

Bei mir war zudem noch eine Anpassung im web.config nötig:

<system.webServer>
  ...
  <handlers>
    <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" type="System.Web.Routing.UrlRoutingModule" resourceType="Unspecified" preCondition="integratedMode" />
  </handlers>
</system.webServer>

 

Auswerten

Sobald man die Webanwendung neu kompiliert und gestartet hat erscheint eine kleine Box in der linken oberen Ecke der Seite:

MiniProfiler beschränkt sich nicht nur aufs anzeigen der Ladezeit. Klickt man auf die Box wird ein detaillierter Report angezeigt:

Neben den allgemeinen Informationen über die Dauer des Request und die Dom Events kann man auch eigene Schritte definieren. Dazu setzt man den zu überwachenden Code in einen Using-Block und benennt den Step mit einem prägnanten Titel:

using (MiniProfiler.Current.Step("Step Set Message"))
{
  ViewBag.Message = "Your contact page.";
  Thread.Sleep(100);
}

Normalerweise werden die Ereignisse die keine relevante Zeit verbrauchen ausgeblendet. Fehlt einem der gesuchte Schritt kann man über den Link „show trivial“ das anzeigen aller Einträge erzwingen.

 

EF-Abfragen überprüfen

Richtig praktisch wird MiniProfiler wenn man auch gleich noch die Datenbankabfragen anzeigen kann. Dazu muss man zusätzlich das Paket MiniProfiler.EF installieren und Application_Start() in der Global.asax um einen Aufruf zur Initialisierung ergänzen:

MiniProfilerEF.Initialize();

Von nun an wird neben der Dauer der Aktionen die Anzahl darin ausgeführten SQL-Abfragen angezeigt:

Von dieser Zusammenfassung aus genügt 1 Klick und man sieht was genau für SQL-Befehle auf die DB losgelassen wurden:

Der Hinweis auf doppelte Abfragen oder Select N+1 ist äusserst hilfreich und hilft einem die gröbsten Schnitzer einfach zu finden.

 

Fazit

MiniProfiler ist schnell installiert und sehr einfach zu konfigurieren. Die Ladezeit als eine der wichtigsten Kennzahlen steht einem von nun an jederzeit und gut sichtbar zur Verfügung. Zusätzliche Informationen lassen sich mit geringem Aufwand hinzufügen und ermöglichen einen Einblick ins Innere der Anwendung.

Meiner Meinung nach ist dieses kleine Tool ein tolles Hilfsmittel um schon zur Entwicklungszeit die Ursachen der häufigsten Produktionsprobleme anzugehen.