Question

I have a web app running on Azure shared web site mode. A simple method where I add items to a list and sort this list, when the list size is about 300 items, takes 0.3s on my machine and 10s after deploy (on azure machine).

Does anybody has any idea why Azure is so slow?

Is any configuration I do it wrong? I use default one but replaced FREE mode with SHARED mode because I thought this would help but it seems it does not.

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);
    }
Was it helpful?

Solution 2

Actually I found the issue.

Locally, I tested with a few hundreds of records in my DB while in Azure DB I have over 70 000 records in that table which affects performance of the algorithm...

One mistake I did in the code above: I have filtered records from DB by specific date AFTER taking all out. By filtering directly in Linq, I increased the performance from 10s to 0.3s in Azure too.

OTHER TIPS

This isn't surprising actually. The servers used in Windows Azure are currently mostly 1.6 GHz machines. The larger sized machine you use the more cores you get, but they are all the same speed. This likely is a much slower CPU than the development machine you use.

On Windows Azure Web Sites when you move to Shared mode you are still in a multi-tenant environment, so you could be seeing some noisy neighbors here. The difference between Free and Shared is that many of the quotas for free are removed since you are paying. When you move to Standard then you are assigned a Virtual Machine dedicated to your web sites (up to 100 of them), so that is the best case scenario since you are the only one using the resources at that point.

There was a thread on this on the MSDN forums a while back : http://social.msdn.microsoft.com/Forums/windowsazure/en-US/0d0a3a88-eac4-4b9e-8b10-4a547cbf653b/performance-of-azure-servers-slow-cpus?forum=windowsazuredevelopment

They have started offering different hardware configurations with more memory for Virtual Machines and Cloud Services and such, but I'm not sure the CPUs have been changed. It's hard to find the CPU stated on WindowsAzure.com anymore, but on the pricing calculator for Web Sites it references 1.6Ghz machines when you move the slider to Standard.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top