Статьи

Удаленное профилирование облачных сервисов с помощью dotTrace

Вот еще один кросс-пост из нашего блога JetBrains .NET . Он сфокусирован на dotTrace, но в нем также есть много полезных советов и рекомендаций по облачным службам Windows Azure, особенно в отношении работы с балансировщиком нагрузки. Приятного чтения!

С помощью dotTrace Performance мы можем профилировать приложения, работающие как на нашем локальном компьютере, так и на удаленных компьютерах . Последнее может быть очень полезно, когда некоторые проблемы с производительностью возникают только на промежуточном сервере (или даже хуже: только на производстве). А что если этот удаленный сервер является облачной службой Windows Azure?

Примечание: в этом посте мы рассмотрим, как настроить облачную службу Windows Azure для удаленного профилирования с помощью dotTrace, стороны платформы «как услуга» Windows Azure. Если вы работаете с обычными виртуальными машинами («инфраструктура как услуга»), единственное, что вам нужно сделать, это открыть любой порт в loadbalancer , перенаправить его на порт машины 9000 (по умолчанию dotTrace) и следовать обычный рабочий процесс удаленного профилирования .

Подготовка облачной службы Windows Azure к удаленному профилированию

Поскольку у нас нет системных администраторов под рукой при работе с облачными сервисами, мы должны выполнить часть их работы самостоятельно. Самая важная часть работы — убедиться, что балансировщик нагрузки в Windows Azure пропускает трафик dotTrace к экземпляру сервера, который мы хотим профилировать.

Мы можем сделать это, добавив тип конечной точки InstanceInput в конфигурацию веб- или рабочей роли:

Конечная точка Windows Azure InstanceInput

По умолчанию балансировщик нагрузки Windows Azure использует циклический подход при маршрутизации трафика к экземплярам ролей. По сути, каждый запрос направляется на случайный экземпляр. При дальнейшем профилировании мы хотим ориентироваться на конкретную машину. И это то, что позволяет нам конечная точка InstanceInput : она открывает диапазон портов на балансировщике нагрузки и перенаправляет трафик на локальный порт. В приведенном выше примере мы открываем порты 9000-9019 в распределителе нагрузки и перенаправляем их на порт 9000 на сервере. Если мы хотим подключиться к конкретному экземпляру, мы можем использовать номер порта из этого диапазона. Порт 9000 будет подключаться к порту 9000 на экземпляре сервера 0. Порт 9001 будет подключаться к порту 9000 на экземпляре роли 1 и так далее.

При развертывании обязательно включите удаленный рабочий стол для этой роли. Это позволит нам подключиться к определенной машине и запустить там удаленный агент dotTrace.

Удаленный рабочий стол Windows Azure RDP

Вот и все. Всякий раз, когда мы хотим запустить удаленное профилирование для конкретного экземпляра роли, теперь мы можем подключиться к машине напрямую.

Запуск сеанса удаленного профилирования с конкретным экземпляром

И вот этот момент наступил: нам нужно профилировать производство!

Прежде всего, мы хотим открыть подключение к удаленному рабочему столу для одного из наших экземпляров роли. На портале управления Windows Azure мы можем подключиться к конкретному экземпляру, выбрав его и нажав кнопку « Подключиться» . Сохраните файл, который загружается где-то в вашей системе: нам нужно изменить его перед подключением.

Windows Azure подключается к конкретному экземпляру роли

Причина сохранения и не немедленного открытия файла .rdp заключается в том, что нам необходимо скопировать удаленный агент dotTrace на компьютер. Для этого мы хотим разрешить доступ к нашим локальным дискам. Щелкните правой кнопкой мыши загруженный файл .rdp и выберите « Изменить» в контекстном меню. На вкладке « Локальные ресурсы » установите флажок « Диски», чтобы разрешить доступ к нашей локальной файловой системе.

Windows Azure доступ к локальной файловой системе

Сохраните изменения и подключитесь к удаленному компьютеру. Теперь мы можем скопировать удаленный агент dotTrace в экземпляр роли, скопировав все файлы из нашей локальной установки dotTrace. Удаленный агент можно найти в C: \ Program Files (x86) \ JetBrains \ dotTrace \ v5.3 \ Bin \ Remote , но, поскольку машина в Windows Azure не имеет ни малейшего представления об этом пути, мы должны указать \\ tsclient \ C \ Program Files (x86) \ JetBrains \ dotTrace \ v5.3 \ Bin \ Remote вместо этого.

Из скопированной папки запустите RemoteAgent.exe . Появится окно консоли, подобное приведенному ниже:

образ

Пока нет: мы открыли балансировщик нагрузки в Windows Azure, чтобы позволить трафику проходить к нашей машине, но собственный брандмауэр машины будет блокировать наше входящее соединение. Чтобы решить эту проблему, настройте брандмауэр Windows, чтобы разрешить доступ через порт 9000. Однострочник, который можно запустить в командной строке, будет выглядеть следующим образом:

netsh advfirewall firewall добавить правило name = «Profiler» dir = в действии = разрешить протокол = TCP localport = 9000

Поскольку мы открыли порты с 9000 по 9019 в балансировщике нагрузки Windows Azure и каждый экземпляр роли получает свой собственный номер порта из этого диапазона, теперь мы можем подключаться к машине с помощью dotTrace. Мы подключились к экземпляру 1, что означает, что мы должны подключиться к порту 9001 в окне присоединения к процессу dotTrace . URL удаленного агента будет выглядеть как http: // <yourservice > .cloudapp.net: PORT / RemoteAgent / AgentService.asmx .

Присоединить к процессу

Далее мы можем выбрать процесс, для которого мы хотим выполнить отслеживание производительности. Я развернул веб-приложение, поэтому буду подключаться к файлу IIS w3wp.exe .

Профиль приложения dotTrace

Теперь мы можем использовать наше приложение и попытаться воспроизвести проблемы с производительностью. Как только мы почувствуем, что у нас достаточно данных, кнопка « Получить снимок» загрузит все необходимые данные с сервера для локальной проверки.

dotTrace - снимок производительности

Теперь мы можем выполнять задачи анализа производительности и искать проблемы с производительностью. Мы можем анализировать данные снимка так же, как если бы мы записали снимок локально. После определения основной причины и развертывания исправления мы можем повторить процесс, чтобы собрать еще один снимок и убедиться, что вы решили проблему с производительностью. Обратите внимание, что все шаги в этом посте должны быть выполнены снова в следующем сеансе профилирования: компьютеры облачной службы Windows Azure не имеют состояния и, вероятно, откажутся от всего, что мы с ними сделали до сих пор.

Анализ данных снимка

Бонусный совет: получите профилируемый экземпляр из балансировщика нагрузки

Поскольку мы профилируем производственное приложение, мы можем мешать нашим пользователям собирать данные профилирования. Еще одна проблема, с которой мы столкнулись, заключается в том, что наши собственные тестовые данные и данные нашего реального пользователя будут отображаться в снимке производительности. И если мы запускаем много экземпляров, не каждое действие, которое мы делаем в приложении, будет выполняться экземпляром роли, к которому мы подключены, из-за циклического распределения нагрузки в Windows Azure.

В идеале мы хотим временно удалить экземпляр роли, который мы профилируем, из балансировщика нагрузки, чтобы преодолеть эти проблемы. Хорошая новость: мы можем это сделать! Единственное, что нам нужно сделать, это добавить небольшой фрагмент кода в наш класс WebRole.cs или WorkerRole.cs .

  public class WebRole : RoleEntryPoint
  {
      public override bool OnStart()
      {
          // For information on handling configuration changes
          // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
  
          RoleEnvironment.StatusCheck += (sender, args) =>
              {
                 if (File.Exists("C:\\Config\\profiling.txt"))
                 {
                     args.SetBusy();
                 }
             };
 
         return base.OnStart();
     }
 }

По сути, то, что мы здесь делаем, это захват зондов балансировщика нагрузки, чтобы увидеть, исправен ли наш узел. Мы можем решить ответить на балансировщик нагрузки, что наш текущий экземпляр занят и не должен получать никаких новых запросов. В приведенном выше примере кода мы проверяем, существует ли файл C: \ Config \ profiling.txt . Если это так, мы отвечаем балансировщику нагрузки с занятым статусом.

Когда мы начинаем профилирование, мы можем теперь создать файл C: \ Config \ profiling.txt, чтобы взять экземпляр, который мы профилируем, из пула серверов. Примерно через минуту портал управления сообщит, что экземпляр занят.

Роль экземпляра отмечена как занятая

Лучше всего то, что мы все еще можем присоединиться к конечной точке конкретного экземпляра и прикрепить dotTrace к этому экземпляру. Просто имейте в виду, что использование приложения теперь должно происходить в сеансе удаленного рабочего стола, который мы открыли ранее, поскольку у нас больше нет текущей машины, доступной из Интернета.

образ

Закончив, мы можем просто удалить файл C: \ Config \ profiling.txt, и Windows Azure добавит компьютер обратно в пул серверов. Не забывайте об этом, иначе вы будете платить за машину, не имея возможности обслуживать приложение с нее. Повторная загрузка машины также добавит ее в пул снова.