Как я улучшаю ASP.NET производительность приложения MVC?

Как Вы улучшаете свою производительность приложения MVC ASP.NET?

212
задан 24 revs, 3 users 70% 14 June 2016 в 16:06
поделиться

9 ответов

Ниже приведен список возможных источников улучшения:

Общие

  • Используйте профилировщик для обнаружения утечек памяти и проблем производительности в вашем приложении. Лично я предлагаю dotTrace
  • Запускайте ваш сайт в режиме Release, а не в режиме Debug, когда вы находитесь в производстве, а также во время профилирования производительности. Режим Release намного быстрее. Режим отладки может скрыть проблемы производительности в вашем собственном коде.

Caching

  • Use CompiledQuery.Compile() рекурсивно, избегая повторной компиляции вашего запроса выражений
  • Кэшируйте не подверженное изменениям содержимое с помощью OutputCacheAttribute для сохранения ненужных действий и действий выполнения
  • Используйте cookies для часто используемой не конфиденциальной информации
  • Используйте ETags и истечение срока действия - Напишите свои собственные методы ActionResult, если необходимо
  • Рассмотрите возможность использования RouteName для организации ваших маршрутов и затем используйте его для генерации ссылок, и старайтесь не использовать метод ActionLink, основанный на дереве выражений.
  • Рассмотрите возможность реализации стратегии кэширования разрешения маршрутов
  • Поместите повторяющийся код внутри ваших PartialViews, избегайте его рендеринга xxxx раз: если вы в конечном итоге вызываете одну и ту же часть 300 раз в одном и том же представлении, вероятно, что-то что-то не так. Explanation And Benchmarks

Маршрутизация

Безопасность

  • Используйте аутентификацию форм, храните часто используемые конфиденциальные данные в аутентификационный билет

DAL

Балансировка нагрузки

  • Используйте обратные прокси, чтобы распределить клиентскую нагрузку по экземплярам вашего приложения. (Stack Overflow использует HAProxy (MSDN).

  • Используйте Асинхронные контроллеры для реализации действий, которые зависят от обработки внешних ресурсов.

Клиентская сторона

  • Оптимизируйте вашу клиентскую сторону, используйте инструменты вроде YSlow для предложения по повышению производительности
  • Используйте AJAX для обновления компонентов пользовательского интерфейса, по возможности избегайте обновления всей страницы.
  • Рассмотрите возможность реализации архитектуры pub-sub - т.е. Comet - для доставки контента против перезагрузки, основанной на таймаутах.
  • По возможности перенесите логику построения графиков и диаграмм на сторону клиента. Генерация графиков это дорогостоящая деятельность. Перенос на клиентскую сторону освобождает ваш сервер от ненужного бремени, и позволяет работать с графиками локально, не делая новых запроса (например, Flex charting, jqbargraph, MoreJqueryCharts).
  • Используйте CDN для скриптов и медиаконтента для улучшения загрузки на стороне клиента (например, Google CDN)
  • Минифицируйте - компилируйте- ваш JavaScript, чтобы улучшить размер скрипта
  • Держите размер cookie небольшим, поскольку cookie отправляются на сервер при каждом запросе.
  • По возможности используйте DNS и Link Prefetching.

Глобальная конфигурация

  • Если вы используете Razor, добавьте следующий код в ваш global.asax.cs, по умолчанию Asp.Net MVC рендерит с помощью aspx engine и razor engine. Здесь используется только RazorViewEngine.

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

  • Добавьте gzip (сжатие HTTP) и статический кэш (изображения, css, ...) в ваш web.config

  • Удалите неиспользуемые HTTP-модули
  • Промойте ваш HTML, как только он будет сгенерирован (в вашем web.config) и отключите viewstate, если вы его не используете
308
ответ дан 23 November 2019 в 04:30
поделиться

Также, если вы используете NHibernate , вы можете включить и настроить кеш второго уровня для запросов и добавить к области и таймауту запросов.И есть классный профилировщик для EF , L2S и NHibernate - http://hibernatingrhinos.com/products/UberProf . Это поможет настроить ваши запросы.

6
ответ дан 23 November 2019 в 04:30
поделиться

Я бы порекомендовал вам взглянуть на состояние омерзительных таблиц:

select * from sys.dm_db_index_physical_stats(
       db_id(), object_id('offending_table'), null, null, detailed);

Все, что вы ищете, это avg_fragmentation_in_percent, page_count, avg_page_space_used_in_percent, record_count и ghost_record_count. Такие сигналы, как высокая фрагментация, или большое количество записей-призраков, или низкий процент использования страниц, указывают на проблемы, и вещи могут быть немного улучшены, просто перестраивая индекс (т. Е. таблица) с нуля:

ALTER INDEX ALL ON offending_table REBUILD;

Я говорю это, учитывая, что вы не можете изменить таблицу или приложение. Если вы сможете изменить таблицу и приложение, совет, который вы уже получили, хороший совет (не используйте '*', не 'выберите с условием, используйте более новый тип varbinary (max) и т.д.).

Я бы также посмотрел на среднее время жизни страницы в счетчиках производительности, чтобы понять, хватает ли памяти в системе. Из вашего описания симптомов система выглядит как привязанная к IO, что заставляет меня думать, что происходит небольшое кэширование страниц, и большее количество оперативной памяти может помочь, а также более быстрый субсайт IO. В системе SQL 2008 я бы также предложил включить сжатие страниц, но в 2005 вы не можете.
И, просто чтобы быть уверенным, убедитесь, что запросы не заблокированы соперничеством из самого приложения, то есть. запрос не тратит 90% из этих 30 секунд на ожидание блокировки строки. Посмотрите на sys.dm_exec_requests во время выполнения запроса, см. wait_time, wait_type и wait_resource. Это PAGEIOLATCH_XX? Или это замок? Кроме того, как происходит sys.dm_os_wait_stats на сервере, каковы основные причины ожидания?

-121--4378686-

Вам не нужно создавать новое окно, вы передаете существующее окно в glXMakeCurrent ().
В текущей настройке необходимо:

  1. XGetWindowAttributes () для получения визуального представления, в котором окно было создано с помощью
  2. glXCreateContext () с использованием этого визуального
  3. glXMakeCurrent () с использованием этого контекста и идентификатора окна

. Однако это приводит к обратному использованию OpenGL для использования используемого визуального изображения. Это часто происходит потому, что визуал по умолчанию имеет разумные свойства GLX, но правильное приложение будет glXChooseVisual с нужными свойствами GLX, а затем использовать этот визуал для создания окна.

-121--4013019-

Одна из очень простых задач заключается в асинхронном анализе при обращении к данным, которые вы хотите получить на странице. Будь то чтение из веб-службы, файла, базы данных или чего-то еще, используйте асинхронную модель как можно больше. Хотя это не обязательно поможет любой странице быть быстрее, это поможет вашему серверу работать лучше в целом.

3
ответ дан 23 November 2019 в 04:30
поделиться

При доступе к данным через LINQ полагайтесь на IQueryable ...

Почему стоит использовать AsQueryable() вместо List()?

... и использовать хороший паттерн Repository:

Loading Subrecords in the Repository Pattern

Это позволит оптимизировать доступ к данным, чтобы обеспечить загрузку только необходимых данных и только тогда, когда они нужны.

6
ответ дан 23 November 2019 в 04:30
поделиться

Это не потрясающая оптимизация, но я подумал, что брошу это там - Используйте CDN для jQuery и т. Д. .

Цитата самого ScottGu: Microsoft Ajax CDN позволяет значительно повысить производительность веб-форм ASP.NET и приложений ASP.NET MVC, использующих ASP.NET AJAX или jQuery. Сервис доступен бесплатно, не требует регистрации и может использоваться как в коммерческих, так и в некоммерческих целях.

Мы даже используем CDN для наших веб-частей в Moss, которые используют jQuery.

6
ответ дан 23 November 2019 в 04:30
поделиться

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

Это относится ко всем сайтам, а не только к ASP.NET MVC.

4
ответ дан 23 November 2019 в 04:30
поделиться

Code Climber и в этой записи блога подробно описаны способы увеличения числа приложений. представление.

Скомпилированный запрос повысит производительность вашего приложения, но он не имеет ничего общего с ASP.NET MVC. Это ускорит каждое приложение db, поэтому на самом деле речь идет не о MVC.

10
ответ дан 23 November 2019 в 04:30
поделиться

Основное предложение состоит в том, чтобы следовать Принципам REST, и следующие моменты связывают некоторые из этих принципов с ASP.NET MVC-фреймворком:

  1. Сделайте свои контроллеры stateless - это скорее предложение «Web производительность / масштабируемость» (в отличие от производительности на уровне микро / машины)и важное дизайнерское решение, которое повлияет на будущее ваших приложений - особенно в случае, если оно станет популярным или если вам нужна некоторая отказоустойчивость, например.
    • Не используйте Sessions
    • Не используйте tempdata - который использует sessions
    • Не пытайтесь "кэшировать" все "преждевременно".
  2. Use Проверка подлинности с помощью форм
    • Сохраняйте часто используемые конфиденциальные данные в билете проверки подлинности
  3. Используйте файлы cookie для часто используемых неконверных сведений
  4. Сделайте свои ресурсы кэшируемыми в Интернете
  5. Скомпилируйте JavaScript. Для этого также есть библиотека компилятора Closure (конечно, есть и другие, просто найдите 'Компилятор JavaScript' тоже)
  6. Используйте CDN (Content Delivery Network) - особенно для ваших больших медиафайлов и так далее.
  7. Рассмотрите различные типы хранения ваших данных, например, файлы,хранилища ключей/значений и т. д. - не только SQL Server
  8. И последнее, но не менее важное: протестируйте свой веб-сайт на производительность
11
ответ дан 23 November 2019 в 04:30
поделиться

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

7
ответ дан 23 November 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: