43
Разгоняем ASP.NET Core Илья Вербицкий WebStoating s.r.o.

Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

  • Upload
    ontico

  • View
    126

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Разгоняем ASP.NET CoreИлья Вербицкий

WebStoating s.r.o.

Page 2: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Обо мне

• 15 лет опыта работы в области финансов и электронной коммерции.

• Совладелец компании WebStoating s.r.o.

• Использую .NET c 2002 года.

Page 3: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Современный .NET

.NET Framework

• Базовая библиотека

• .NET Framework BCL

• Виды приложений

• WPF

• Windows Forms

• Console

• ASP.NET

.NET Core

• Базовая библиотека

• .NET Core BCL

• Виды приложений

• Console

• ASP.NET Core

• UWP

• Xamarin.Forms

Xamarin

• Базовая библиотека

• Mono BCL

• Виды приложений

• iOS

• Android

• MacOS

Page 4: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

.NET Core и .NET Standard

.NET Standard

• Множество реализаций .NET

• Проблема повторного использования кода

• Спецификация

• 70% существующего кода совместимо с версией 2.0

• Режим совместимости

.NET Core

• .NET Core 2.0

• Поддержка Windows, Linux иMacOS

• Open Source (MIT)

• Простота развертывания

• Ваш любимый язык программирования

• Любой текстовый редактор

Page 5: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Немного философии

• Вы не Google

• ROI

• Не стоит изобретать велосипед без необходимости

• Сконцентрируйтесь на решении конкретной задачи

• Существует много хороших инструментов. Главное – выбрать правильный для вашего проекта

• Проблемы с производительностью из-за роста популярности – это ОТЛИЧНЫЕ проблемы! Но сначала надо сделать популярный продукт.

Page 6: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Наш сайт тормозит!

Page 7: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Сайт недоступен извне - YSlow

Page 8: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Chrome Developer Tools

Page 9: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Сначала реализуем все рекомендации Google PageSpeed InsightsИногда этого бывает достаточно, особенно если у вас на сайте много больших картинок.

Page 10: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Сборка и минификация JS и CSS

• BuildBundlerMinifier• bundleconfig.json

• <environment> tag helper

• Gulp

• Grunt

• Webpack

Page 11: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Управление пакетами

• NuGet - https://www.nuget.org/

• Packet - https://fsprojects.github.io/Paket/index.html

Page 12: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Обработка изображений

• ImageMagic - http://imagemagick.org/• Magic.NET - https://github.com/dlemstra/Magick.NET

• Не используйте System.Drawing и System.Windows.Media

• LibGD - http://libgd.github.io/• CodeArt.DotnetGD

• ImageProcessor

• DynamicImage

• ImageResizer

Page 13: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Сжатие HTTP-траффика

• Microsoft.AspNetCore.ResponseCompression• GzipCompressionProvider

• ICompressionProvider

• IIS Dynamic Compression Module

• Прокси-сервер NGINX

Page 14: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Веб-сервер Kestrel

• Microsoft.AspNetCore.Server.Kestrel

• Асинхронный веб-сервер, построенный на основе libuv.

• Можно использовать самостоятельно или через прокси-сервер

• Поддержка сокетов Unix, Web-сокетов и HTTPS

• Параметры веб-сервера• MaxConcurrentConnections (нет лимита)

• MaxConcurrentUpgradedConnections (нет лимита)

• MaxRequestBodySize (28.6MB) и RequestSizeLimitAttribute

• MinRequestBodyDataRate (240 байт/сек., грейс-период 5 сек.)

Page 15: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Быстро починить не удалось

Page 16: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Железо стоит дешевле программистов

• Нужен сервер «пожирнее»• Больше памяти

• Больше ядер

• Поддержка Docker

• Облачные провайдеры, поддерживающие ASP.NET Core “из коробки”• Windows Azure

• AWS

• Google App Engine

Page 17: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Теперь посмотрим, что происходит при обработке HTTP-запроса

Page 18: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

MiniProfiler

• Разработка Stack Exchange

• MiniProfiler

• MiniProfiler.EF6• SQL-запросы, генерируемые Entity Framework 6

• MiniProfiler.Mvc4• Views

• Контроллеры

Page 19: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

«Копаем» глубже

Page 20: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

SQL Server Profiler

Page 21: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

SELECT N+1 и выбор ORM для проекта

Маппинг POCO-объектов (SELECT, 500 итераций)

SqlDataReader 47ms

Dapper 49ms

ServiceStack.OrmLite 50ms

PetaPoco 52ms

BLToolkit 80ms

SubSonic CodingHorror 107ms

NHibernate 181ms

Entity Framework 631ms

Источник: https://github.com/StackExchange/Dapper

Page 22: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Базу оптимизировали, но не помоглоДобавим кэширование?

Page 23: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Кэширование

• IMemoryCache• Microsoft.Extensions.Caching.Memory

• IDistributedCache• Microsoft.Extensions.Caching.Redis• Microsoft.Extensions.Caching.SqlServer

• Cache Tag Helper• <cache>@DateTime.Now</cache>

• Distributed Cache Tag Helper• <distributed-cache name=“my-id-1”>@DateTime.Now</distributed-cache>

• ResponseCacheAttribute

• Microsoft.AspNetCore.ResponseCaching

Page 24: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Наша память куда-то утекаетМожет быть, проблема в сборщике мусора?

Page 25: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Режимы работы сборщика мусора

• Workstation GC• Concurrent

• Non-concurrent

• Server GC• Background

• Non-concurrent

Page 26: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Web.config

<configuration>

<runtime>

<gcServer enabled="true|false"/>

<gcConcurrent enabled="true|false"/>

<gcTrimCommitOnLowMemory enabled="true|false"/>

...

</runtime>

</configuration>

Page 27: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

[AppName].runtimeconfig.json

{

"runtimeOptions": {

"configProperties": {

"System.GC.Server": true|false,

"System.GC.Concurrent": true|false,

...

},

...

}

Page 28: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Профилирование памяти в VS 2017

Page 29: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

PerfView: Сколько времени тратится на GC?

Page 30: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

PerfView: Где выделяется память?

Page 31: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

PerfView: Текущие объекты в хипе

Page 32: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

На сервере нет Visual Studio? - WinDbg

C:\bin>procdump.exe -ma MemoryLeak

.loadby sos clr

!dumpheap -stat

!dumpheap -type System.String

!do 0336dc54

!dumparray /d 0336dc54

!do 0336dfb8

Page 33: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Пара слов о постраничной навигации

var persons = db.Person

.OrderBy(p => p.FirstName)

.ThenBy(p => p.LastName)

.ToList();

foreach(var person in persons.Take(100))

{

}

select FirstName, LastName

from Person.Person

order by FirstName, LastName

offset 0 rows

fetch next 10 rows only

Page 34: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

«Ручное» управление памятью

• WeakReference

• GCSettings.LatencyMode• LowLatency (Workstation GC only)• SustainedLowLatency (Workstation and Server GC)• Данный период должен быть как можно короче• Постарайтесь не выделять большие объекты• GC.Collect

• GC.TryStartNoGCRegion и GC.EndNoGCRegion

• Как насчет собственного сборщика мусора?• Local GC Project (CoreCLR)• https://github.com/dotnet/coreclr/tree/master/src/gc/sample.

Page 35: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

GC настроили, а «тормоза» осталисьПроблемы с I/O, сетью и CPU.

Page 36: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Профилирование кода в MiniProfiler

Page 37: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Профилирование приложений в VS 2017

Page 38: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Асинхронные операции

Page 39: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Task Parallel Library

• Paraller.For и Parallel.ForEach

• Task.WhenAny, Task.WhenAll и Task.ContinueWith

• CancellationToken

• Palallel LINQ

Page 40: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Async/await «быстрее», но это не точно

• Код интенсивно использует I/O и сеть, а не CPU

• Вы хотите разрешить пользователям прерывать долгие операции

• Прирост производительности приложения превышает затраты на переключение контекста

• Асинхронные операции НЕ ВЫПОЛНЯЮТСЯ быстрее, чем синхронные

• Не стоит делать все приложение асинхронным!

Page 41: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Очереди сообщений и микросервисы

• MQ• StackExchange.Redis

• Turbocharged.Beanstalk

• ZeroMQ

• RdKafka

• Service Bus• NServiceBus

• MassTransit и MassTransit.RabbitMQ

• RestBus.AspNet и RestBus.RabbitMQ

Page 42: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Итоги

1. ROI

2. Выполните рекомендации Google PageSpeed Insights

3. Вертикальное масштабирование

4. Проверьте, нет ли проблем с базой данных

5. Профилирование памяти и настройка GC

6. Кэширование

7. Профилирование операций I/O, работы с сетью и CPU

8. MQ и микросервисы

Page 43: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)

Спасибо!

• https://verbitskiy.co/

• Twitter: @ilich_x86

• GitHub: https://github.com/ilich