Разгоняем asp.net core / Илья Вербицкий (webstoating s.r.o.)
TRANSCRIPT
![Page 1: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/1.jpg)
Разгоняем ASP.NET CoreИлья Вербицкий
WebStoating s.r.o.
![Page 2: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/2.jpg)
Обо мне
• 15 лет опыта работы в области финансов и электронной коммерции.
• Совладелец компании WebStoating s.r.o.
• Использую .NET c 2002 года.
![Page 3: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/3.jpg)
Современный .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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/4.jpg)
.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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/5.jpg)
Немного философии
• Вы не Google
• ROI
• Не стоит изобретать велосипед без необходимости
• Сконцентрируйтесь на решении конкретной задачи
• Существует много хороших инструментов. Главное – выбрать правильный для вашего проекта
• Проблемы с производительностью из-за роста популярности – это ОТЛИЧНЫЕ проблемы! Но сначала надо сделать популярный продукт.
![Page 6: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/6.jpg)
Наш сайт тормозит!
![Page 7: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/7.jpg)
Сайт недоступен извне - YSlow
![Page 8: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/8.jpg)
Chrome Developer Tools
![Page 9: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/9.jpg)
Сначала реализуем все рекомендации Google PageSpeed InsightsИногда этого бывает достаточно, особенно если у вас на сайте много больших картинок.
![Page 10: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/10.jpg)
Сборка и минификация JS и CSS
• BuildBundlerMinifier• bundleconfig.json
• <environment> tag helper
• Gulp
• Grunt
• Webpack
![Page 11: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/11.jpg)
Управление пакетами
• NuGet - https://www.nuget.org/
• Packet - https://fsprojects.github.io/Paket/index.html
![Page 12: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/12.jpg)
Обработка изображений
• 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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/13.jpg)
Сжатие HTTP-траффика
• Microsoft.AspNetCore.ResponseCompression• GzipCompressionProvider
• ICompressionProvider
• IIS Dynamic Compression Module
• Прокси-сервер NGINX
![Page 14: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/14.jpg)
Веб-сервер 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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/15.jpg)
Быстро починить не удалось
![Page 16: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/16.jpg)
Железо стоит дешевле программистов
• Нужен сервер «пожирнее»• Больше памяти
• Больше ядер
• Поддержка Docker
• Облачные провайдеры, поддерживающие ASP.NET Core “из коробки”• Windows Azure
• AWS
• Google App Engine
![Page 17: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/17.jpg)
Теперь посмотрим, что происходит при обработке HTTP-запроса
![Page 18: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/18.jpg)
MiniProfiler
• Разработка Stack Exchange
• MiniProfiler
• MiniProfiler.EF6• SQL-запросы, генерируемые Entity Framework 6
• MiniProfiler.Mvc4• Views
• Контроллеры
![Page 19: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/19.jpg)
«Копаем» глубже
![Page 20: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/20.jpg)
SQL Server Profiler
![Page 21: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/21.jpg)
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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/22.jpg)
Базу оптимизировали, но не помоглоДобавим кэширование?
![Page 23: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/23.jpg)
Кэширование
• 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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/24.jpg)
Наша память куда-то утекаетМожет быть, проблема в сборщике мусора?
![Page 25: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/25.jpg)
Режимы работы сборщика мусора
• Workstation GC• Concurrent
• Non-concurrent
• Server GC• Background
• Non-concurrent
![Page 26: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/26.jpg)
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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/27.jpg)
[AppName].runtimeconfig.json
{
"runtimeOptions": {
"configProperties": {
"System.GC.Server": true|false,
"System.GC.Concurrent": true|false,
...
},
...
}
![Page 28: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/28.jpg)
Профилирование памяти в VS 2017
![Page 29: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/29.jpg)
PerfView: Сколько времени тратится на GC?
![Page 30: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/30.jpg)
PerfView: Где выделяется память?
![Page 31: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/31.jpg)
PerfView: Текущие объекты в хипе
![Page 32: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/32.jpg)
На сервере нет 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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/33.jpg)
Пара слов о постраничной навигации
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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/34.jpg)
«Ручное» управление памятью
• 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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/35.jpg)
GC настроили, а «тормоза» осталисьПроблемы с I/O, сетью и CPU.
![Page 36: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/36.jpg)
Профилирование кода в MiniProfiler
![Page 37: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/37.jpg)
Профилирование приложений в VS 2017
![Page 38: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/38.jpg)
Асинхронные операции
![Page 39: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/39.jpg)
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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/40.jpg)
Async/await «быстрее», но это не точно
• Код интенсивно использует I/O и сеть, а не CPU
• Вы хотите разрешить пользователям прерывать долгие операции
• Прирост производительности приложения превышает затраты на переключение контекста
• Асинхронные операции НЕ ВЫПОЛНЯЮТСЯ быстрее, чем синхронные
• Не стоит делать все приложение асинхронным!
![Page 41: Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/41.jpg)
Очереди сообщений и микросервисы
• 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.)](https://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/42.jpg)
Итоги
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://reader033.vdocuments.us/reader033/viewer/2022052219/5a655a227f8b9a931a8b461b/html5/thumbnails/43.jpg)
Спасибо!
• https://verbitskiy.co/
• Twitter: @ilich_x86
• GitHub: https://github.com/ilich