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">

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

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.


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.



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.


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.


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 ).


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.


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.


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?


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.

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.


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.


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

0

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


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.

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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.