Jak poprawić wydajność aplikacji ASP.NET MVC?

Odpowiedzi:

311

Skompilowana lista możliwych źródeł ulepszeń znajduje się poniżej:

Generał

  • Skorzystaj z profilera, aby wykryć wycieki pamięci i problemy z wydajnością w swojej aplikacji. osobiście sugeruję dotTrace
  • Uruchom swoją witrynę w trybie Release, a nie w trybie Debugowania, podczas produkcji, a także podczas profilowania wydajności. Tryb zwolnienia jest znacznie szybszy. Tryb debugowania może ukryć problemy z wydajnością we własnym kodzie.

Buforowanie

  • Użyj CompiledQuery.Compile() rekurencyjnie, unikając ponownej kompilacji wyrażeń zapytania
  • Buforuj zawartość, OutputCacheAttribute która nie jest podatna na zmiany, aby zapisać niepotrzebne i działania
  • Używaj plików cookie w celu uzyskania dostępu do poufnych informacji
  • Wykorzystaj znaczniki ET i wygasanie - w ActionResultrazie potrzeby napisz własne metody
  • Rozważ skorzystanie z metody RouteNamedo organizowania tras, a następnie użyj jej do wygenerowania linków, i spróbuj nie używać metody ActionLink opartej na drzewie wyrażeń.
  • Rozważ wdrożenie strategii buforowania rozpoznawania tras
  • Umieść powtarzający się kod w swoim PartialViews, unikaj renderowania go xxxx : jeśli skończysz wywoływać te same częściowe 300 razy w tym samym widoku, prawdopodobnie coś jest z tym nie tak. Wyjaśnienie i testy

Wytyczanie

Bezpieczeństwo

  • Użyj uwierzytelniania formularzy. Zachowaj często używane poufne dane w bilecie uwierzytelniającym

DAL

Równoważenie obciążenia

  • Użyj odwrotnych serwerów proxy, aby rozłożyć obciążenie klienta na instancję aplikacji. (Przepełnienie stosu używa HAProxy ( MSDN ).

  • Użyj kontrolerów asynchronicznych, aby zaimplementować działania zależne od przetwarzania zasobów zewnętrznych.

Strona klienta

  • Zoptymalizuj stronę klienta, skorzystaj z narzędzia takiego jak YSlow, aby uzyskać sugestie dotyczące poprawy wydajności
  • Użyj AJAX, aby zaktualizować składniki interfejsu użytkownika, unikaj aktualizacji całej strony, jeśli to możliwe.
  • Zastanów się nad implementacją architektury pub-sub -ie Comet- do dostarczania treści przeciwko przeładowaniu w oparciu o limity czasu.
  • Przenieś wykresy i logikę generowania wykresów na stronę klienta, jeśli to możliwe. Generowanie wykresów jest kosztowną czynnością. Odroczenie serwera po stronie klienta przed niepotrzebnym obciążeniem i pozwala na lokalną pracę z wykresami bez tworzenia nowego żądania (tj. Wykresy Flex, jqbargraph , MoreJqueryCharts ).
  • Użyj CDN do tworzenia skryptów i treści multimedialnych, aby poprawić ładowanie po stronie klienta (tj Google CDN )
  • Minify - Kompilacja - JavaScript, aby poprawić rozmiar skryptu
  • Utrzymuj mały rozmiar plików cookie, ponieważ pliki cookie są wysyłane do serwera na każde żądanie.
  • W miarę możliwości rozważ użycie DNS i wstępnego pobierania linków .

Konfiguracja globalna

  • Jeśli używasz Razor, dodaj następujący kod do pliku global.asax.cs, domyślnie renderuje Asp.Net MVC z silnikiem aspx i silnikiem z ostrzami. To używa tylko RazorViewEngine.

    ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());

  • Dodaj gzip (kompresja HTTP) i statyczną pamięć podręczną (obrazy, css, ...) w pliku web.config <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • Usuń nieużywane moduły HTTP
  • Opróżnij kod HTML natychmiast po jego wygenerowaniu (w pliku web.config) i wyłącz stan widoku, jeśli go nie używasz <pages buffer="true" enableViewState="false">
SDReyes
źródło
6
czekaj, masz na myśli, że tracę wydajność, gdy np. mam widok, który wyświetla zestaw wyników poprzez irytację przez IList i wywołuje Render.PartialView („wiersz”, pozycja) dla każdego elementu listy? ile stracę? lub jak mogę zmierzyć wzrost wydajności?
marc.d
@SDReyes - jakie jest znaczenie architektury pub-sub ?
Mohammed Zameer
1
To jest fajne. Link Uber Profiler nie działa. Czy powinno to być powiązane z jednym z profilerów specyficznych dla ORM?
shanabus,
12

Podstawową sugestią jest przestrzeganie zasad REST a następujące punkty wiążą niektóre z tych zasad z platformą ASP.NET MVC:

  1. Uczyń swoich kontrolerów bezpaństwowcami - to bardziej „ sieć wydajności / skalowalności” sugestii (w przeciwieństwie do mikro wydajności poziomie maszyny /) i ważnej decyzji projektowych, które będą wpływać na przyszłe zastosowania - szczególnie w przypadku staje się popularne lub jeśli potrzebujesz na przykład tolerancja na awarie.
    • Nie używaj sesji
    • Nie używaj tempdata - która wykorzystuje sesje
    • Nie próbuj „cache” wszystkiego „przedwcześnie”.
  2. Użyj uwierzytelniania formularzy
    • Zachowaj często używane poufne dane w bilecie uwierzytelniającym
  3. Używaj plików cookie w celu uzyskania dostępu do poufnych informacji
  4. Spraw, by Twoje zasoby były dostępne w pamięci podręcznej w sieci
  5. Skompiluj JavaScript. Do tego celu służy także biblioteka kompilatorów Closure (na pewno są też inne, po prostu wyszukaj też „kompilator JavaScript” )
  6. Użyj sieci CDN (Content Delivery Network) - szczególnie w przypadku dużych plików multimedialnych i tak dalej.
  7. Rozważ różne rodzaje przechowywania danych, na przykład pliki, magazyny kluczy / wartości itp. - nie tylko SQL Server
  8. Na koniec przetestuj swoją witrynę pod kątem wydajności
ziya
źródło
10

Code Climber i ten wpis na blogu zapewniają szczegółowe sposoby zwiększenia wydajności aplikacji.

Skompilowane zapytanie zwiększy wydajność aplikacji, ale nie ma nic wspólnego z ASP.NET MVC. Przyspieszy każdą aplikację db, więc tak naprawdę nie chodzi o MVC.

LukLed
źródło
8

Może się to wydawać oczywiste, ale uruchom swoją witrynę w trybie Release, a nie w trybie Debugowania, podczas produkcji, a także podczas profilowania wydajności. Tryb zwolnienia jest znacznie szybszy. Tryb debugowania może ukryć problemy z wydajnością we własnym kodzie.

Craig Stuntz
źródło
6

Nie jest to wstrząsająca optymalizacja, ale pomyślałem, że to tam wyrzucę - użyj CDN do jQuery itp .

Cytat z samego ScottGu: CDN Microsoft Ajax pozwala znacznie poprawić wydajność ASP.NET Web Forms i aplikacji ASP.NET MVC, które używają ASP.NET AJAX lub jQuery. Usługa jest dostępna za darmo, nie wymaga żadnej rejestracji i może być używana zarówno do celów komercyjnych, jak i niekomercyjnych.

Korzystamy nawet z CDN dla naszych stron internetowych w Moss, które używają jQuery.

Ta01
źródło
6

Ponadto, jeśli korzystasz z NHibernate , możesz włączyć i skonfigurować pamięć podręczną drugiego poziomu dla zapytań oraz dodać do zakresu zapytań i limitu czasu. I jest profiler kick ass dla EF , L2S i NHibernate - http://hibernatingrhinos.com/products/UberProf . Pomoże to dostroić zapytania.

Peter Mortensen
źródło
Ayende niedawno napisał na blogu o tym, jak EF Profiler pomógł mu dostroić przykładową aplikację MVC: ayende.com/Blog/archive/2010/05/17/…
Frank Schwieterman
5

Dodam również:

  1. Użyj duszka : duszki są świetną rzeczą do zmniejszenia żądania. Łączysz wszystkie swoje zdjęcia w jeden i używasz CSS, aby dostać się do znacznej części duszka. Microsoft zapewnia do tego dobrą bibliotekę: Sprite and Image Optimization Preview 4 .

  2. Buforuj obiekt serwera : jeśli masz listy referencji lub dane, które rzadko się zmieniają, możesz je buforować w pamięci zamiast za każdym razem sprawdzać bazę danych.

  3. Użyj ADO.NET zamiast Entity Framework : EF4 or EF5świetnie skracają czas programowania, ale optymalizacja będzie bolesna. Łatwiej jest zoptymalizować procedurę przechowywaną niż Entity Framework. Powinieneś więc w jak największym stopniu korzystać z procedur sklepowych. Dapper zapewnia prosty sposób na zapytania i mapowanie SQL z bardzo dobrą wydajnością.

  4. Strona pamięci podręcznej lub strona częściowa : MVC zapewnia łatwy filtr do pamięci podręcznej strony zgodnie z niektórymi parametrami, więc użyj go.

  5. Zmniejsz liczbę wywołań bazy danych : możesz utworzyć unikalne żądanie bazy danych, które zwraca wiele obiektów. Sprawdź na stronie Dapper.

  6. Zawsze miej czystą architekturę : miej czystą architekturę wielopoziomową, nawet przy małym projekcie. Pomoże Ci utrzymać kod w czystości, a łatwiej będzie go zoptymalizować w razie potrzeby.

  7. Możesz rzucić okiem na ten szablon „ Neos-SDI MVC Template ”, który stworzy dla ciebie czystą architekturę z domyślnie dużą poprawą wydajności (sprawdź stronę MvcTemplate ).

Jeff Lequeux
źródło
Czy uważasz, że lepiej jest uruchomić jedną procedurę przechowywaną, która zwraca więcej zestawów wyników, niż uruchomić więcej procedur przechowywanych w trybie asynchronicznym?
Muflix,
4

Oprócz wszystkich świetnych informacji na temat optymalizacji aplikacji po stronie serwera powiedziałbym, że powinieneś rzucić okiem na YSlow . Jest to doskonały zasób do poprawy wydajności strony po stronie klienta.

Dotyczy to wszystkich witryn, nie tylko ASP.NET MVC.

Steve Haigh
źródło
3

Jedną z super łatwych rzeczy jest myślenie asynchroniczne podczas uzyskiwania dostępu do danych, które chcesz dla strony. Niezależnie od tego, czy czytasz z usługi internetowej, pliku, bazy danych czy czegoś innego, używaj modelu asynchronicznego w jak największym stopniu. Mimo że żadna strona nie musi być szybsza, ogólnie poprawia wydajność serwera.

Bez zwrotów Bez zwrotów
źródło
2

1: Uzyskaj czasy. Dopóki nie dowiesz się, gdzie jest spowolnienie, pytanie jest zbyt ogólne, aby odpowiedzieć. Projekt, nad którym pracuję, ma dokładnie ten problem; Nie trzeba rejestrować, aby wiedzieć, ile czasu zajmuje pewne rzeczy; możemy tylko zgadywać, które części aplikacji są wolne, dopóki nie dodamy czasu do projektu.

2: Jeśli wykonujesz operacje sekwencyjne, nie bój się lekkiego wielowątkowości. W SZCZEGÓLNOŚCI, jeśli w grę wchodzą operacje blokowania. PLINQ jest tu twoim przyjacielem.

3: Wygeneruj wstępnie swoje widoki MVC podczas publikowania ... Pomoże to w niektórych „trafieniach na pierwszą stronę”

4: Niektórzy argumentują za zaletami procedury składowanej / ADO szybkości. Inni opowiadają się za szybkością rozwoju EF i bardziej wyraźnym podziałem poziomów i ich celem. Widziałem naprawdę powolne projekty, gdy SQL i sposoby obejścia korzystania z Sprocs / Views do pobierania i przechowywania danych. Również trudność w testowaniu rośnie. Nasza obecna baza kodu, którą konwertujemy z ADO na EF, nie jest gorsza (aw niektórych przypadkach lepsza) niż stary model ręcznie walcowany.

5: Powiedział, Pomyśl o rozgrzewce aplikacji. Częścią tego, co robimy, aby wyeliminować większość problemów z EF, było dodanie specjalnej metody rozgrzewki. Nie kompiluje żadnych zapytań ani niczego, ale pomaga przy ładowaniu / generowaniu metadanych. Może to być jeszcze ważniejsze w przypadku modeli Code First.

6: Jak powiedzieli inni, nie używaj stanu sesji lub ViewState, jeśli to możliwe. Niekoniecznie są to optymalizacje wydajności, o których myślą programiści, ale gdy zaczniesz pisać bardziej złożone aplikacje internetowe, potrzebujesz responsywności. Stan sesji wyklucza to. Wyobraź sobie długo działające zapytanie. Decydujesz się otworzyć nowe okno i wypróbować mniej skomplikowane. Cóż, równie dobrze mogłeś poczekać z włączonym stanem sesji, ponieważ serwer będzie czekał na wykonanie pierwszego żądania, zanim przejdzie do następnego dla tej sesji.

7: Minimalizacja podróży w obie strony do bazy danych. Zapisz rzeczy, których często używasz, ale nie zmienią się realistycznie w pamięci podręcznej .Net. Staraj się grupować wkładki / aktualizacje tam, gdzie to możliwe.

7.1: Unikaj kodu dostępu do danych w widokach Razor bez żadnego dobrego powodu. Nie powiedziałbym tego, gdybym tego nie widział. Już uzyskiwali dostęp do swoich danych, kiedy składali model, dlaczego, do cholery, nie włączali go do modelu?

to11mtm
źródło
2
  1. Zaimplementuj Gzip.
  2. Użyj renderowania asynchronicznego dla widoków częściowych.
  3. Minimalizuj trafienia do bazy danych.
  4. Użyj skompilowanego zapytania.
  5. Uruchom profiler i znajdź niepotrzebne trafienia. Zoptymalizuj wszystkie procedury składowane, które zwracają odpowiedź dłużej niż 1 sekundę.
  6. Użyj buforowania.
  7. Użyj optymalizacji optymalizacji pakietowej .
  8. Użyj narzędzi HTML 5, takich jak pamięć podręczna sesji i lokalna pamięć masowa, do zawartości tylko do odczytu.
Vinayak
źródło
2

Chciałem tylko dodać moje 2 centy. NAJBARDZIEJ skutecznym sposobem optymalizacji generowania tras adresów URL w aplikacji MVC jest ... wcale ich nie generowanie.

Większość z nas mniej więcej wie, w jaki sposób generowane są adresy URL w naszych aplikacjach, więc po prostu używając statycznego Url.Content("~/Blahblah")zamiast Url.Action()lub Url.RouteUrl()tam, gdzie to możliwe, pokonuje wszystkie inne metody prawie 20 razy, a nawet więcej.

PS. Przeprowadziłem test porównawczy kilku tysięcy iteracji i opublikowałem wyniki na moim blogu, jeśli jestem zainteresowany.

Alex
źródło
1

W swoim dążeniu do optymalizacji strony klienta nie zapomnij o warstwie bazy danych. Mieliśmy aplikację, której ładowanie trwało od 5 sekund do 50 sekund w ciągu nocy.

Podczas inspekcji wprowadziliśmy wiele zmian schematu. Odświeżone statystyki stały się nagle tak responsywne jak wcześniej.

Robbie Dee
źródło
0

Oto rzeczy do zrobienia

  1. Pamięć podręczna trybu jądra
  2. Tryb rurociągu
  3. Usuń nieużywane moduły
  4. runAllManagedModulesForAllRequests
  5. Nie pisz w wwwroot
  6. Usuń nieużywane silniki widoków i język
Zahid Mustafa
źródło
0

Korzystanie z pakietowania i minimalizacji pomaga również poprawić wydajność. Zasadniczo skraca czas ładowania strony.

Neelima
źródło
0

Jeśli używasz aplikacji ASP.NET MVC na Microsoft Azure (IaaS lub PaaS), wykonaj następujące czynności przynajmniej przed pierwszym wdrożeniem.

  • Zeskanuj swój kod za pomocą statycznego analizatora kodu w celu wykrycia dowolnego rodzaju długu kodu, powielania, złożoności i bezpieczeństwa.
  • Zawsze włączaj funkcję Application Insight i często monitoruj wydajność, przeglądarki i analizy, aby znaleźć problemy w aplikacji w czasie rzeczywistym.
  • Zaimplementuj pamięć podręczną Redis Azure dla danych statycznych i rzadziej zmienianych, takich jak obrazy, zasoby, wspólne układy itp.
  • Zawsze polegaj na narzędziach APM (Application Performance Management) dostarczanych przez platformę Azure.
  • Często przeglądaj mapę aplikacji, aby sprawdzić wydajność komunikacji między wewnętrznymi częściami aplikacji.
  • Monitoruj również wydajność bazy danych / maszyny wirtualnej.
  • Użyj modułu równoważenia obciążenia (Skala pozioma), jeśli jest to wymagane i mieści się w budżecie.
  • Jeśli Twoja aplikacja ma odbiorców docelowych na całym świecie, użyj usługi Azure Trafic Manager, aby automatycznie obsłużyć przychodzące żądanie i przekierować je do najbardziej dostępnej instancji aplikacji.
  • Spróbuj zautomatyzować monitorowanie wydajności, pisząc alerty na podstawie niskiej wydajności.
Tahir Alvi
źródło
0

Użyj najnowszej wersji biblioteki zadań równoległych (TPL) , zgodnie z wersją .Net. Muszę wybrać odpowiednie moduły TPL do różnych celów.

agileDev
źródło
0

Zrobiłem wszystkie powyższe odpowiedzi i to po prostu nie rozwiązało mojego problemu.

Wreszcie rozwiązałem problem powolnego ładowania witryny, ustawiając wartość PrecompileBeforePublish w profilu publikowania na wartość true . Jeśli chcesz użyć msbuild , możesz użyć tego argumentu:

 /p:PrecompileBeforePublish=true

To naprawdę bardzo pomaga. Teraz mój MVC ASP.NET ładuje się 10 razy szybciej.

Amir Pourmand امیر پورمند
źródło