2014-01-21 4 views
1

У меня есть веб-приложение работает на Azure общий веб-сайт режиме. Простой метод, когда я добавляю элементы в список и сортирую этот список, когда размер списка составляет около 300 элементов, принимает 0.3s на моей машине и 10s после развертывания (на лазурной машине).Почему код работает на Azure так медленно?

Есть ли у кого-нибудь идеи, почему Azure так медленно?

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

UPDATE:

public ActionResult GetPosts(String selectedStreams, int implicitSelectedVisualiserId, int userId) 
    { 
     DateTime begin = DateTime.UtcNow; 

     List<SearchQuery> selectedSearchQueries = searchQueryRepository.GetSearchQueriesOfStreamsIds(selectedStreams == String.Empty ? new List<int>() : selectedStreams.Split(',').Select(n => int.Parse(n)).ToList()); 
     var implicitSelectedVisualiser = VisualiserModel.ToVisualiserModel(visualiserRepository.GetVisualiser(implicitSelectedVisualiserId)); 

     var twitterSearchQueryOfImplicitSelectedVisualiser = searchQueryRepository.GetSearchQuery(implicitSelectedVisualiser.Stream.Name, Service.Twitter, userId); 
     var instagramSearchQueryOfImplicitSelectedVisualiser = searchQueryRepository.GetSearchQuery(implicitSelectedVisualiser.Stream.Name, Service.Instagram, userId); 
     var facebookSearchQueryOfImplicitSelectedVisualiser = searchQueryRepository.GetSearchQuery(implicitSelectedVisualiser.Stream.Name, Service.Facebook, userId); 
     var manualSearchQueryOfImplicitSelectedVisualiser = searchQueryRepository.GetSearchQuery(implicitSelectedVisualiser.Stream.Name, Service.Manual, userId); 

     List<SearchResultModel> approvedSearchResults = new List<SearchResultModel>(); 

     if (twitterSearchQueryOfImplicitSelectedVisualiser != null || instagramSearchQueryOfImplicitSelectedVisualiser != null || facebookSearchQueryOfImplicitSelectedVisualiser != null 
      || manualSearchQueryOfImplicitSelectedVisualiser != null) 
     { 
      // Define search text to be displayed during slideshow; 
      SearchModel searchModel = new SearchModel(); 

      // Set slideshow settings from implicit selected visualiser. 
      ViewBag.CurrentVisualiser = implicitSelectedVisualiser; 

      // Load search results from selected visualisers. 
      foreach (SearchQuery searchQuery in selectedSearchQueries) 
      { 
       approvedSearchResults.AddRange(
        SearchResultModel.ToSearchResultModel(
         searchResultRepository.GetSearchResults 
          (searchQuery.Id, 
          implicitSelectedVisualiser.Language))); 
       // Add defined query too. 
       searchModel.SearchValue += " " + searchQuery.Query; 
      } 

      // Add defined query for implicit selected visualiser. 
      if (twitterSearchQueryOfImplicitSelectedVisualiser != null) 
       searchModel.SearchValue += " " + twitterSearchQueryOfImplicitSelectedVisualiser.Query; 
      if (instagramSearchQueryOfImplicitSelectedVisualiser != null) 
       searchModel.SearchValue += " " + instagramSearchQueryOfImplicitSelectedVisualiser.Query; 
      if (facebookSearchQueryOfImplicitSelectedVisualiser != null) 
       searchModel.SearchValue += " " + facebookSearchQueryOfImplicitSelectedVisualiser.Query; 

      ViewBag.Search = searchModel; 

      // Also add search results from implicit selected visualiser 
      if (twitterSearchQueryOfImplicitSelectedVisualiser != null) 
       approvedSearchResults.AddRange(SearchResultModel.ToSearchResultModel(searchResultRepository.GetSearchResults(twitterSearchQueryOfImplicitSelectedVisualiser.Id, implicitSelectedVisualiser.Language))); 
      if (instagramSearchQueryOfImplicitSelectedVisualiser != null) 
       approvedSearchResults.AddRange(SearchResultModel.ToSearchResultModel(searchResultRepository.GetSearchResults(instagramSearchQueryOfImplicitSelectedVisualiser.Id, implicitSelectedVisualiser.Language))); 
      if (facebookSearchQueryOfImplicitSelectedVisualiser != null) 
       approvedSearchResults.AddRange(SearchResultModel.ToSearchResultModel(searchResultRepository.GetSearchResults(facebookSearchQueryOfImplicitSelectedVisualiser.Id, implicitSelectedVisualiser.Language))); 
      if (manualSearchQueryOfImplicitSelectedVisualiser != null) 
       approvedSearchResults.AddRange(SearchResultModel.ToSearchResultModel(searchResultRepository.GetSearchResults(manualSearchQueryOfImplicitSelectedVisualiser.Id, implicitSelectedVisualiser.Language))); 

      // if user selected to show only posts from specific number of last days. 
      var approvedSearchResultsFilteredByDays = new List<SearchResultModel>(); 
      if (implicitSelectedVisualiser.ShowPostsFromLastXDays != 0) 
      { 
       foreach (SearchResultModel searchResult in approvedSearchResults) 
       { 
        var postCreatedTimeWithDays = searchResult.PostCreatedTime.AddDays(implicitSelectedVisualiser.ShowPostsFromLastXDays + 1); 
        if (postCreatedTimeWithDays >= DateTime.Now) 
         approvedSearchResultsFilteredByDays.Add(searchResult); 
       } 
      } 
      else 
      { 
       approvedSearchResultsFilteredByDays = approvedSearchResults; 
      } 

      // Order search results (posts to be displayed by created datetime). 
      var approvedSearchResultsOrdered = new List<SearchResultModel>(); 
      if (implicitSelectedVisualiser.PostsSortOrder == PostsSortOrder.CREATED_DATE_ASC) 
      { 
       approvedSearchResultsOrdered = approvedSearchResultsFilteredByDays.OrderBy(s => s.PostCreatedTime).ToList(); ; 
      } 
      else if (implicitSelectedVisualiser.PostsSortOrder == PostsSortOrder.CREATED_DATE_DESC) 
      { 
       approvedSearchResultsOrdered = approvedSearchResultsFilteredByDays.OrderByDescending(s => s.PostCreatedTime).ToList(); ; 
      } 
      else if (implicitSelectedVisualiser.PostsSortOrder == PostsSortOrder.RANDOM) 
      { 
       var rnd = new Random(); 
       approvedSearchResultsOrdered = approvedSearchResultsFilteredByDays.OrderBy(x => rnd.Next()).ToList(); 
      } 

      // Load background images; 
      var visualiserImages = visualiserImageRepository.GetImages(implicitSelectedVisualiser.Id); 

      //foreach (SearchResultModel searchResultModel in approvedSearchResultsOrdered) 
      //{ 
      // searchResultModel.BackgroundImagePath = TwitterUtils.GetRandomImageBackgroundForDisplay(visualiserImages); 
      //} 

      ViewBag.BackgroundImagePath = TwitterUtils.GetRandomImageBackgroundForDisplay(visualiserImages); 

      approvedSearchResults = approvedSearchResultsOrdered; 
     } 

     DateTime end = DateTime.UtcNow; 

     Elmah.ErrorSignal.FromCurrentContext().Raise(new Exception(String.Format("User {0}: Preparing {1} posts for visualiser took {2} seconds", MySession.Current.LoggedInUserName, approvedSearchResults.Count(), (end - begin).TotalMilliseconds/1000))); 

     return PartialView("_DisplayPostsNew", approvedSearchResults); 
    } 
+0

Я думаю, что это латентность сети. Можете ли вы просто поставить DateTime dt1 = DateTime.Now() в начале кода и DateTime dt2 - DateTime.Now() в конце кода, а затем распечатать dt1-dt2. Затем получите время с сайта localhost и Azure. Также вы можете использовать Glimpse и проверить статистику? – ramiramilu

+0

@ramiramilu Это точно так же, как я измерил время выполнения метода, используя DateTime.Now() начало и конец. Поэтому его уверенность в том, что их машина медленная ... –

+1

Можете ли вы поделиться своим кодом? Также вы можете поделиться статистикой того же кода в режимах FREE/SHARED/STANDARD? – ramiramilu

ответ

2

На самом деле я нашел проблему.

Локально, я тестировал с несколькими сотнями записей в моей БД в то время как в Azure БД у меня есть более чем 70 000 записей в этой таблице, которая влияет на производительность алгоритма ...

Одна ошибка я сделал в коде выше: я отфильтровал записи из БД по конкретной дате ПОСЛЕ того, как все вышло. Фильтруя непосредственно в Linq, я увеличил производительность с 10 до 0,3 с в Azure.

3

Это не удивительно, на самом деле. Серверы, используемые в Windows Azure, в настоящее время в основном работают на частотах 1,6 ГГц. В машине большего размера вы используете больше ядер, которые вы получаете, но они имеют одинаковую скорость. Вероятно, это гораздо более медленный процессор, чем используемая вами машина разработки.

На веб-сайтах Windows Azure, когда вы переходите в общий режим, вы все еще находитесь в среде с несколькими арендаторами, поэтому вы можете найти здесь , чтобы увидеть здесь несколько шумных соседей. Разница между Free и Shared заключается в том, что многие бесплатные квоты удаляются с момента оплаты. Когда вы переходите к стандарту, вам назначается виртуальная машина, предназначенная для ваших веб-сайтов (до 100 из них), так что это лучший сценарий, так как вы единственный, кто использует ресурсы в этой точке.

Был нить на этом на форумах MSDN некоторое время назад: http://social.msdn.microsoft.com/Forums/windowsazure/en-US/0d0a3a88-eac4-4b9e-8b10-4a547cbf653b/performance-of-azure-servers-slow-cpus?forum=windowsazuredevelopment

Они начали предлагать различные конфигурации аппаратных средств с большим объемом памяти для виртуальных машин и облачных сервисов и таких, но я не уверен, что процессоры были изменены. Трудно найти процессор, заявленный на WindowsAzure.com, но в калькуляторе цен для веб-сайтов он ссылается на машины с частотой 1,6 ГГц, когда вы перемещаете ползунок в стандарт.

+0

Я ценю скромные процессоры 1,6 ГГц, как самый маленький блок. Если мне нужно больше, я куплю его. Если мне нужно меньше, ну, я, вероятно, этого не сделаю, потому что это такая скромная скорость процессора. И наоборот, если бы самая маленькая единица Ghz составляла 3 или 5 ГГц, было бы больше возможностей для отходов. – 1c1cle

Смежные вопросы