Как стать автором
Обновить

Работа с Tier Interaction Profiler ( TIP )

Время на прочтение6 мин
Количество просмотров2K
Автор оригинала: Cameron Skinner
Это малоизвестная функция входящая в состав Visual Studio 2010 Premium которой я хочу посвятить немного времени и познакомить вас с ней. Она полезна когда вы пытаетесь определить почему ваше приложение ASP.NET не работает с такой производительностью с которой должно было бы, и как построены запросы приложения к базе данных, улучшают ли они производительность или снижают.

Для использования в этой публикации я скачал простенькое и неизвестное приложение «NerdDinner» написанное Скотом Гутри и друзьями. Скачивайте его отсюда, устанавливайте и убедитесь, что оно работает (если у вас есть работающая версия SQL Express, приложение просто сделает аттач к mdf-файлу ассоцированному с проектом. SQL Express установлен по умолчанию в всех инсталляциях Visual Studio 2010, но если у вас нет инстанса, когда SQL Express работает, вам нужно поиграться с установками строки подключения в файле ConnectionStrings.config. Освежить свои знания по синтаксису строки подключения можно здесь.). Когда все заработало, зарегистрируйте пользовательскую учетную запись, чтобы выполнить шаги описанные ниже.

Хорошо, теперь у вас есть работающее веб-приложение, давайте запустим профайлер и посмотрим, что мы увидим.

Запуск Мастера Производительности (Performance Wizard)

Выберете в Visual Studio пункт меню Анализировать (Analyze), а затем «Запустить мастер производительности…» («Launch Performance Wizard…»).

image

Далее вам будет представлен следующий диалог:

image

Просто выберите установку по умолчанию (которой должна быть «CPU Sampling» («Сэмплирование ЦП»)) и нажмите кнопку «Next» («Далее»). После этого появится следующее:

image

Заметьте «NerdDinner» является единственным выбором в этом диалоге, что и хорошо, так как единственный проект который мы хотим профилировать в данный момент! Если у вас много проектов которые формируют исполняемые файлы или веб-проекты, они также будут показаны.

Нажимте «Next» («Далее»), этим мы отобразим новую страницу мастера:

image

Убедитесь, что отмечено «Enable Tier Interaction Profiling», так как это включит функции, о которых я расскажу позже в этой публикации. Можете прочитать всю публикацию, чтобы понять о чем идет речь, или просто нажать «Next» («Далее»).

Оставьте отмеченным «Launch profiling after the wizard finishes» («Запустить профилирование после завершения мастера»).

Теперь Visual Studio запустит веб-сервер Cassini с веб-приложением NerdDinner.

image

Запуск приложения

At this point, Visual studio starts a performance session, loading the .vsp file in the Visual Studio doc well, and indicates to you that profiling is currently underway:
С этого момента, Visual Studio начнет сессию профилирования производительности, загрузит .vsp-файл в область документов и будет отображать вам что идет профилирование:

image

Теперь сделайте следующее:

  1. Произведите вход в учетную запись в приложении
  2. Разместите заказ на два ужина
    Сделайте это щелкнув вкладку «Host Dinner» и введя информацию об ужине на странице, нажмите «Save» («Сохранить»), а затем повторите эти действия еще один раз
  3. Выйдите из приложения закрыв IE


Через момент Visual Studio отобразит, что-то похожее на следующую иллюстрацию:

image

Анализ результатов

Одна из главных функций набора инструментов для профилирования в Visual Studio называется «Hot Path». Она быстро показывает области кода в которых может быть потеря производительности. По крайней мере, становится абсолютно ясно, на что приложение тратит большую часть времени.

На изображении ниже, сразу видно, что метод GetMostPopularDinners, кажется занимает большую часть времени по отношению к только что выполненной сессии.

image

Давайте щелкнем на этой ссылке (указывающей на метод). Вам должно быть отображено, что-то подобное изображенному ниже:

image

Много всего происходит здесь. Обратите внимание на факт, что выпадающий список «Current View» («Текущее представление») установлен на «Function Details» («Подробности функции»). Это важно и также высвечивает проблему с опытом пользователей Visual Studio, как много пользователей не знает, что есть этот выпадающий список и упускают завидную долю функциональности! Это одна из главных причин по которой много ребят не знает о Tier Interaction Profiler, так как это просто другое представление сессии производительности.

Можете поиграться с «большими синими прямоугольниками» щелкая на них, перемещаясь дальше и обратно щелкая на левом или правом прямоугольниках.

Вы также заметили, что я выделил строку кода, которая привлекла наше внимание при использовании функции «Hot Path». Также вы заметили временную характеристику 42.2% в углу слева в текстовом редакторе, с фактической строкой отмеченной по умолчанию в «красноватый» цвет.

Создается ощущение, что это строка, где тратится время, так как это место, где фактически строится выражение LINQ до того как выполняется вызов его запроса (Если вы не знакомы с этой концепцией, я очень рекомендую ознакомится с этой публикацией).

Взглянем на код, он выглядит так как будто в нем мы обращаемся к базе данных из бекенда в этом методе:

public ActionResult GetMostPopularDinners(int? limit)
        {
            var dinners = dinnerRepository.FindUpcomingDinners();

            // Default the limit to 40, if not supplied.
            if (!limit.HasValue)
                limit = 40;

            var mostPopularDinners = from dinner in dinners
                                     orderby dinner.RSVPs.Count descending
                                     select dinner;

            var jsonDinners =
                mostPopularDinners.Take(limit.Value).AsEnumerable()
                .Select(item => JsonDinnerFromDinner(item));

            return Json(jsonDinners.ToList());
        }


* This source code was highlighted with Source Code Highlighter.


Как я могу увидеть TSQL который посылается базе данных? Перейдем в Tier Interaction Profiler.

Tier Interaction Profiler

Вы отметили на изображении выше, что строка которую мы исследуем в данный момент является частью нашего контроллера SearchController. Посмотрим код более внимательно, метод GetMostPopularDinners на самом деле является акшеном контроллера и вызывается URL'ом относительно приложения. О чем все это на говорит?

Хорошо, все это показывает, что приложение NerdDinner является образцом демонстрирующим набор технологий, в первую очередь ASP.NET MVC 2. ASP.NET MVC 2 имеет очень мощный механизм маршрутизации URL'ов который полезен, когда вам нужно сделать более дружественные к пользователю URL'ы, более легкие в обслуживании и т.д. Это становится очевидным при просмотре данных в Tier Interaction Profiling.

Нажмите на выпадающем списке «Current View» («Текущее представление») и выберите «Tier Interactions»:

image

Теперь у вас должно отображаться, что-то похожее на изображение в верхней панели:

image

Столбец «Name» («Имя») содержит список различных артефактов запрошенных клиентом (в данном случае IE выполняющим приложение NerdDinner) у сервера. Вы увидите сколько запросов данного элемента записано в столбце «Count» («Счетчик»), также как и то как долго выполнялся запрос.

Например, вы заметите /Content/Production.css в столбце «Name» («Имя»). Этот css-файл был запрошен 7 раз, что в сумме составило 38 миллисекунд задержки. Таким образом очень удобно получать информацию о различных запросах которые выполняет приложение к серверу.

А вверху списка (и возвращаясь к нашему выполняющемуся примеру) вы заметите элемент /Search/GetMostPopularDinners который выполняется большую часть времени. Обычно вы видите адреса которые оканчиваются на aspx (страницы) или css (документы), и т.д., но так как это приложение использует преимущества маршрутизации ASP.NET MVC 2 вы видите более дружественные адреса, которые запрашиваются у сервера.

А что делать с запросами к базе данных?

Представление TIP (Tire Interaction Profile) ассоциирует запросы к серверу с вызовами базы данных ассоциированными с этими запросами. Так, если вы развернете элемент /Search/GetMostPopularDinners, вы увидите следующее:

image

Обратный запрос к серверу по адресу /Search/GetMostPopularDinners превращается в два запроса к базе данных которые вместе занимают ~75 миллисекунд. Не плохо, но даже лучше то, что вы можете в панели «Database connection details» («Подробности соединения с БД») вы можете видеть сам TSQL посылаемый базе данных. Дважды щелкните на записи, чтобы увидеть SQL полностью, подобный этому:

image

Выводы

Tier Interaction Profiler может сделать понимание запросов идущих от вашего клиента к базе данных очень простыми для понимания. Вы поймете не только какой SQL передается, но и сможете проанализировать производительность всей операции.

Я надеюсь это поможет!
Cameron
Теги:
Хабы:
Всего голосов 34: ↑26 и ↓8+18
Комментарии16

Публикации

Истории

Работа

.NET разработчик
68 вакансий

Ближайшие события